Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c869652ef4 | ||
|
|
240a30147d | ||
|
|
91fdb86fcc | ||
|
|
0e5a56e2cf | ||
|
|
40ecc2563a | ||
|
|
7e473f194d | ||
|
|
0c231fd387 | ||
|
|
7f3ebcaa91 | ||
|
|
5904ef86f2 | ||
|
|
d692649bac | ||
|
|
0d019a00c9 | ||
|
|
e6b3de310b | ||
|
|
d19b96d0c2 | ||
|
|
7cbc94592e | ||
|
|
9747f1e841 | ||
|
|
42bc24a646 | ||
|
|
35115957d8 | ||
|
|
b193eb1d82 | ||
|
|
ff90b125ee | ||
|
|
a140d319fe | ||
|
|
9581bf5dde | ||
|
|
76dcabdce6 | ||
|
|
dc262a5f79 | ||
|
|
db5830dc28 | ||
|
|
ecf3d567cf | ||
|
|
e8375e9acd | ||
|
|
8c84c74197 | ||
|
|
f7d1225c23 | ||
|
|
3dc90b854c | ||
|
|
ac3c657315 | ||
|
|
37b117a84c | ||
|
|
ab6346ea1c | ||
|
|
6e6f9862e6 | ||
|
|
7d42a79177 | ||
|
|
05bbca5b07 | ||
|
|
5afe0be5b4 | ||
|
|
d8aa2cc05f | ||
|
|
7b071d403f | ||
|
|
d5b1e5e0c0 | ||
|
|
d8498aa2b0 | ||
|
|
e593d3aee3 | ||
|
|
323cfaf2d7 | ||
|
|
637f0c6fb2 | ||
|
|
2756403102 | ||
|
|
92861d095a | ||
|
|
bf6c6627e8 | ||
|
|
b217cb76f0 | ||
|
|
b414fde6ca | ||
|
|
d8c39569be | ||
|
|
5ce15bb0df | ||
|
|
88086935af | ||
|
|
ace3552e15 | ||
|
|
003ceff7e4 | ||
|
|
209ccdf668 | ||
|
|
e5dd7e65d4 | ||
|
|
b2999ad590 | ||
|
|
1871a7a2fa | ||
|
|
49677e9c9d | ||
|
|
73954f4a63 | ||
|
|
a084938d9c | ||
|
|
1bf042ac84 | ||
|
|
a2f9f7c975 | ||
|
|
565f40c642 | ||
|
|
4441338574 | ||
|
|
389d650ee3 | ||
|
|
080d45239a | ||
|
|
91851114e4 | ||
|
|
5b11099a0b | ||
|
|
2996d1e096 | ||
|
|
be82175f86 | ||
|
|
05977bd1c7 | ||
|
|
8074289a8f | ||
|
|
f8ba0334e8 | ||
|
|
7c9bed83d2 | ||
|
|
482a7723b2 | ||
|
|
948d29b676 | ||
|
|
3fa6c41303 | ||
|
|
220a4bb535 | ||
|
|
287559e834 | ||
|
|
cdac0cd1df | ||
|
|
3653126179 | ||
|
|
2eb662df85 | ||
|
|
cdcf214455 | ||
|
|
a75a9c953a | ||
|
|
800ba206f7 | ||
|
|
8d5aa98297 | ||
|
|
283234d51d | ||
|
|
f9e1a933a9 | ||
|
|
ebd8ef1a9e | ||
|
|
ed691e26a6 | ||
|
|
067d76fece | ||
|
|
534c18c94c | ||
|
|
af9e0cc33a | ||
|
|
6847c2fc8c | ||
|
|
028eb7b351 | ||
|
|
12c21fac22 | ||
|
|
774defd184 | ||
|
|
6657f28694 | ||
|
|
9d7507236f | ||
|
|
8f49429228 | ||
|
|
f21e9dbd9a | ||
|
|
d3146d20ad | ||
|
|
24a177a149 | ||
|
|
a58dfccb7d | ||
|
|
b35293228e | ||
|
|
963e250654 | ||
|
|
ca8b766c09 | ||
|
|
21eca7f1c1 | ||
|
|
8062866973 | ||
|
|
99530358fd | ||
|
|
621393ca62 | ||
|
|
0c6284be02 | ||
|
|
9d5e3e2a91 | ||
|
|
7f260938db | ||
|
|
c416444e24 | ||
|
|
b559bc84a7 | ||
|
|
3f53abb233 | ||
|
|
67efd0dd39 | ||
|
|
dcd32faa83 | ||
|
|
8fcb5cee66 | ||
|
|
13b757d847 | ||
|
|
c6d7f24542 | ||
|
|
4c1a9380e6 | ||
|
|
ad6e8edcd3 | ||
|
|
95c742ba9b | ||
|
|
546d442626 | ||
|
|
ed8c0b23a0 | ||
|
|
c8f44b73f1 | ||
|
|
bf6b149b8b | ||
|
|
f334c834e5 | ||
|
|
7c850bb78a | ||
|
|
a280fed4be | ||
|
|
cf9b5241ae | ||
|
|
dfa25af271 | ||
|
|
b538c5a206 | ||
|
|
4fa3fcbb3b | ||
|
|
b049ae269b | ||
|
|
e5bf27e716 | ||
|
|
a9a6ed8b71 | ||
|
|
e6c64282fc | ||
|
|
64b41655bb | ||
|
|
6ac40552b4 | ||
|
|
039c5c540b | ||
|
|
c9ed934d0b | ||
|
|
06a64219bc | ||
|
|
ef36b21684 | ||
|
|
c44e51ae58 | ||
|
|
2c4bc7a2b2 | ||
|
|
62dc486c85 | ||
|
|
d11961626c | ||
|
|
519375b4c0 | ||
|
|
6ecb7c80f1 | ||
|
|
380cb93e46 | ||
|
|
36e7662706 | ||
|
|
49199819db | ||
|
|
aa8d26496c | ||
|
|
4619e32b6a | ||
|
|
0352e956b6 | ||
|
|
f999956997 | ||
|
|
bfd268c5e6 | ||
|
|
b7ad47017d | ||
|
|
502b722902 | ||
|
|
c89b34fd75 | ||
|
|
b9b1fdd1a1 | ||
|
|
2e0fa1c6a0 | ||
|
|
f8726719ef | ||
|
|
3569fe9c73 | ||
|
|
4ffcabfb3f | ||
|
|
a7ed74744f | ||
|
|
ae0bb8f1eb | ||
|
|
034411e47e | ||
|
|
baf58ef396 | ||
|
|
006fc3495e | ||
|
|
29a3b82336 | ||
|
|
22a5e196c9 | ||
|
|
deec41d29a | ||
|
|
3978efd710 | ||
|
|
7a80e732df | ||
|
|
6681df29d2 | ||
|
|
9d58bb1c66 | ||
|
|
acbdb05bd0 | ||
|
|
25f5259e84 | ||
|
|
0ced153f86 | ||
|
|
faca8c8b53 | ||
|
|
4ad8181088 | ||
|
|
4f3ff4a69d | ||
|
|
fc0f2f2b3a | ||
|
|
b4cd084117 | ||
|
|
c1fd55bb04 | ||
|
|
77b2d2dbee | ||
|
|
f92aed1b91 | ||
|
|
90a6be8001 | ||
|
|
2e4de209fe | ||
|
|
287147687e | ||
|
|
a53f5d01aa | ||
|
|
1aaa2e8219 | ||
|
|
02b104f56b | ||
|
|
e691839771 | ||
|
|
4c22d130d9 | ||
|
|
065d23d0b1 | ||
|
|
4b0a232ae1 | ||
|
|
81130c205c | ||
|
|
36b94ca5f5 | ||
|
|
9e4326a582 | ||
|
|
8193c2f847 | ||
|
|
fbef731a04 | ||
|
|
dbf88a2eca | ||
|
|
413a9031eb | ||
|
|
23e69bcdb4 | ||
|
|
edff071cd2 | ||
|
|
3b487cfae9 | ||
|
|
a8d2072e9f | ||
|
|
260e42a691 | ||
|
|
596a9c60d7 | ||
|
|
a47e4a1148 | ||
|
|
312c8b9e7a | ||
|
|
1d99508943 | ||
|
|
b42fda0971 | ||
|
|
cf377d2e1c | ||
|
|
ec9d0b8a6d | ||
|
|
14cac8ed22 | ||
|
|
4ecf9dd62d | ||
|
|
b56dcf155c | ||
|
|
63ffdb38aa | ||
|
|
f9289d3079 | ||
|
|
709b56bc40 | ||
|
|
eb38d382ba | ||
|
|
5beaa5d892 | ||
|
|
01b24f6282 | ||
|
|
cbe3694b81 | ||
|
|
f531a51e91 | ||
|
|
a0667dfd1b | ||
|
|
2b78e613a4 | ||
|
|
b34ab10b5e | ||
|
|
f07cc37939 | ||
|
|
957b0ecd15 | ||
|
|
659bc246c9 | ||
|
|
1502af7e94 | ||
|
|
26c5a533ec | ||
|
|
4274016491 | ||
|
|
c6c298b412 | ||
|
|
63eda0fe42 | ||
|
|
c3693c91b3 | ||
|
|
e426067e46 | ||
|
|
2e482eca6d | ||
|
|
fdea1afc7f | ||
|
|
41fecb800d | ||
|
|
52cf06b36c | ||
|
|
ebce006974 | ||
|
|
ff60695a0f | ||
|
|
3aa9685f5a | ||
|
|
6cecb964a9 | ||
|
|
0216ee101c | ||
|
|
d3c6bfb764 | ||
|
|
ea6a5121b3 | ||
|
|
d6a4fe00b3 | ||
|
|
36318e8a1b | ||
|
|
79562a2531 | ||
|
|
d2664ab2a6 | ||
|
|
e664a429a1 | ||
|
|
b09bd1ed34 | ||
|
|
f83c80aaec | ||
|
|
bbc8adca94 | ||
|
|
20c71d127b | ||
|
|
e35df904a0 | ||
|
|
62682a8c4c | ||
|
|
253c02cc3c | ||
|
|
175d1cc8f2 | ||
|
|
23c9122458 | ||
|
|
b42d2886a2 | ||
|
|
c3f90ba347 | ||
|
|
c6eba8c0a1 | ||
|
|
51bdb4cbea | ||
|
|
376b2d0297 | ||
|
|
7e03624408 | ||
|
|
133f223df6 | ||
|
|
8dc73fdbdb | ||
|
|
8ec3ed1830 | ||
|
|
8b71ce23bb | ||
|
|
82079e644a | ||
|
|
1e7a364c68 |
@@ -8,36 +8,43 @@ assignees: ''
|
|||||||
|
|
||||||
# Bug Report
|
# Bug Report
|
||||||
|
|
||||||
## Description
|
## Installation Method
|
||||||
|
|
||||||
**Bug Summary:**
|
[Describe the method you used to install the project, e.g., git clone, Docker, pip, etc.]
|
||||||
[Provide a brief but clear summary of the bug]
|
|
||||||
|
|
||||||
**Steps to Reproduce:**
|
|
||||||
[Outline the steps to reproduce the bug. Be as detailed as possible.]
|
|
||||||
|
|
||||||
**Expected Behavior:**
|
|
||||||
[Describe what you expected to happen.]
|
|
||||||
|
|
||||||
**Actual Behavior:**
|
|
||||||
[Describe what actually happened.]
|
|
||||||
|
|
||||||
## Environment
|
## Environment
|
||||||
|
|
||||||
- **Open WebUI Version:** [e.g., 0.1.120]
|
- **Open WebUI Version:** [e.g., v0.3.11]
|
||||||
- **Ollama (if applicable):** [e.g., 0.1.30, 0.1.32-rc1]
|
- **Ollama (if applicable):** [e.g., v0.2.0, v0.1.32-rc1]
|
||||||
|
|
||||||
- **Operating System:** [e.g., Windows 10, macOS Big Sur, Ubuntu 20.04]
|
- **Operating System:** [e.g., Windows 10, macOS Big Sur, Ubuntu 20.04]
|
||||||
- **Browser (if applicable):** [e.g., Chrome 100.0, Firefox 98.0]
|
- **Browser (if applicable):** [e.g., Chrome 100.0, Firefox 98.0]
|
||||||
|
|
||||||
## Reproduction Details
|
|
||||||
|
|
||||||
**Confirmation:**
|
**Confirmation:**
|
||||||
|
|
||||||
- [ ] I have read and followed all the instructions provided in the README.md.
|
- [ ] 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 am on the latest version of both Open WebUI and Ollama.
|
||||||
- [ ] I have included the browser console logs.
|
- [ ] I have included the browser console logs.
|
||||||
- [ ] I have included the Docker container 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
|
## Logs and Screenshots
|
||||||
|
|
||||||
@@ -47,13 +54,9 @@ assignees: ''
|
|||||||
**Docker Container Logs:**
|
**Docker Container Logs:**
|
||||||
[Include relevant Docker container logs, if applicable]
|
[Include relevant Docker container logs, if applicable]
|
||||||
|
|
||||||
**Screenshots (if applicable):**
|
**Screenshots/Screen Recordings (if applicable):**
|
||||||
[Attach any relevant screenshots to help illustrate the issue]
|
[Attach any relevant screenshots to help illustrate the issue]
|
||||||
|
|
||||||
## Installation Method
|
|
||||||
|
|
||||||
[Describe the method you used to install the project, e.g., manual installation, Docker, package manager, etc.]
|
|
||||||
|
|
||||||
## Additional Information
|
## 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.]
|
[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.]
|
||||||
|
|||||||
@@ -26,6 +26,10 @@ jobs:
|
|||||||
--file docker-compose.a1111-test.yaml \
|
--file docker-compose.a1111-test.yaml \
|
||||||
up --detach --build
|
up --detach --build
|
||||||
|
|
||||||
|
- name: Delete Docker build cache
|
||||||
|
run: |
|
||||||
|
docker builder prune --all --force
|
||||||
|
|
||||||
- name: Wait for Ollama to be up
|
- name: Wait for Ollama to be up
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
run: |
|
run: |
|
||||||
@@ -35,10 +39,6 @@ jobs:
|
|||||||
done
|
done
|
||||||
echo "Service is up!"
|
echo "Service is up!"
|
||||||
|
|
||||||
- name: Delete Docker build cache
|
|
||||||
run: |
|
|
||||||
docker builder prune --all --force
|
|
||||||
|
|
||||||
- name: Preload Ollama model
|
- name: Preload Ollama model
|
||||||
run: |
|
run: |
|
||||||
docker exec ollama ollama pull qwen:0.5b-chat-v1.5-q2_K
|
docker exec ollama ollama pull qwen:0.5b-chat-v1.5-q2_K
|
||||||
|
|||||||
@@ -5,6 +5,59 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [0.3.12] - 2024-08-07
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **🔄 Sidebar Infinite Scroll**: Added an infinite scroll feature in the sidebar for more efficient chat navigation, reducing load times and enhancing user experience.
|
||||||
|
- **🚀 Enhanced Markdown Rendering**: Support for rendering all code blocks and making images clickable for preview; codespan styling is also enhanced to improve readability and user interaction.
|
||||||
|
- **🔒 Admin Shared Chat Visibility**: Admins no longer have default visibility over shared chats when ENABLE_ADMIN_CHAT_ACCESS is set to false, tightening security and privacy settings for users.
|
||||||
|
- **🌍 Language Updates**: Added Malay (Bahasa Malaysia) translation and updated Catalan and Traditional Chinese translations to improve accessibility for more users.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **📊 Markdown Rendering Issues**: Resolved issues with markdown rendering to ensure consistent and correct display across components.
|
||||||
|
- **🛠️ Styling Issues**: Multiple fixes applied to styling throughout the application, improving the overall visual experience and interface consistency.
|
||||||
|
- **🗃️ Modal Handling**: Fixed an issue where modals were not closing correctly in various model chat scenarios, enhancing usability and interface reliability.
|
||||||
|
- **📄 Missing OpenAI Usage Information**: Resolved issues where usage statistics for OpenAI services were not being correctly displayed, ensuring users have access to crucial data for managing and monitoring their API consumption.
|
||||||
|
- **🔧 Non-Streaming Support for Functions Plugin**: Fixed a functionality issue with the Functions plugin where non-streaming operations were not functioning as intended, restoring full capabilities for async and sync integration within the platform.
|
||||||
|
- **🔄 Environment Variable Type Correction (COMFYUI_FLUX_FP8_CLIP)**: Corrected the data type of the 'COMFYUI_FLUX_FP8_CLIP' environment variable from string to boolean, ensuring environment settings apply correctly and enhance configuration management.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **🔧 Backend Dependency Updates**: Updated several backend dependencies such as boto3, pypdf, python-pptx, validators, and black, ensuring up-to-date security and performance optimizations.
|
||||||
|
|
||||||
|
## [0.3.11] - 2024-08-02
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **📊 Model Information Display**: Added visuals for model selection, including images next to model names for more intuitive navigation.
|
||||||
|
- **🗣 ElevenLabs Voice Adaptations**: Voice enhancements including support for ElevenLabs voice ID by name for personalized vocal interactions.
|
||||||
|
- **⌨️ Arrow Keys Model Selection**: Users can now use arrow keys for quicker model selection, enhancing accessibility.
|
||||||
|
- **🔍 Fuzzy Search in Model Selector**: Enhanced model selector with fuzzy search to locate models swiftly, including descriptions.
|
||||||
|
- **🕹️ ComfyUI Flux Image Generation**: Added support for the new Flux image gen model; introduces environment controls like weight precision and CLIP model options in Settings.
|
||||||
|
- **💾 Display File Size for Uploads**: Enhanced file interface now displays file size, preparing for upcoming upload restrictions.
|
||||||
|
- **🎚️ Advanced Params "Min P"**: Added 'Min P' parameter in the advanced settings for customized model precision control.
|
||||||
|
- **🔒 Enhanced OAuth**: Introduced custom redirect URI support for OAuth behind reverse proxies, enabling safer authentication processes.
|
||||||
|
- **🖥 Enhanced Latex Rendering**: Adjustments made to latex rendering processes, now accurately detecting and presenting latex inputs from text.
|
||||||
|
- **🌐 Internationalization**: Enhanced with new Romanian and updated Vietnamese and Ukrainian translations, helping broaden accessibility for international users.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **🔧 Tags Handling in Document Upload**: Tags are now properly sent to the upload document handler, resolving issues with missing metadata.
|
||||||
|
- **🖥️ Sensitive Input Fields**: Corrected browser misinterpretation of secure input fields, preventing misclassification as password fields.
|
||||||
|
- **📂 Static Path Resolution in PDF Generation**: Fixed static paths that adjust dynamically to prevent issues across various environments.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **🎨 UI/UX Styling Enhancements**: Multiple minor styling updates for a cleaner and more intuitive user interface.
|
||||||
|
- **🚧 Refactoring Various Components**: Numerous refactoring changes across styling, file handling, and function simplifications for clarity and performance.
|
||||||
|
- **🎛️ User Valves Management**: Moved user valves from settings to direct chat controls for more user-friendly access during interactions.
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- **⚙️ Health Check Logging**: Removed verbose logging from the health checking processes to declutter logs and improve backend performance.
|
||||||
|
|
||||||
## [0.3.10] - 2024-07-17
|
## [0.3.10] - 2024-07-17
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
+1
-1
@@ -151,7 +151,7 @@ COPY --chown=$UID:$GID ./backend .
|
|||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
||||||
HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.status == true' || exit 1
|
HEALTHCHECK CMD curl --silent --fail http://localhost:${PORT:-8080}/health | jq -ne 'input.status == true' || exit 1
|
||||||
|
|
||||||
USER $UID:$GID
|
USER $UID:$GID
|
||||||
|
|
||||||
|
|||||||
+171
-42
@@ -10,12 +10,12 @@ from fastapi import (
|
|||||||
File,
|
File,
|
||||||
Form,
|
Form,
|
||||||
)
|
)
|
||||||
|
|
||||||
from fastapi.responses import StreamingResponse, JSONResponse, FileResponse
|
from fastapi.responses import StreamingResponse, JSONResponse, FileResponse
|
||||||
|
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
from typing import List
|
||||||
import uuid
|
import uuid
|
||||||
import requests
|
import requests
|
||||||
import hashlib
|
import hashlib
|
||||||
@@ -31,6 +31,7 @@ from utils.utils import (
|
|||||||
)
|
)
|
||||||
from utils.misc import calculate_sha256
|
from utils.misc import calculate_sha256
|
||||||
|
|
||||||
|
|
||||||
from config import (
|
from config import (
|
||||||
SRC_LOG_LEVELS,
|
SRC_LOG_LEVELS,
|
||||||
CACHE_DIR,
|
CACHE_DIR,
|
||||||
@@ -43,6 +44,7 @@ from config import (
|
|||||||
AUDIO_STT_OPENAI_API_KEY,
|
AUDIO_STT_OPENAI_API_KEY,
|
||||||
AUDIO_TTS_OPENAI_API_BASE_URL,
|
AUDIO_TTS_OPENAI_API_BASE_URL,
|
||||||
AUDIO_TTS_OPENAI_API_KEY,
|
AUDIO_TTS_OPENAI_API_KEY,
|
||||||
|
AUDIO_TTS_API_KEY,
|
||||||
AUDIO_STT_ENGINE,
|
AUDIO_STT_ENGINE,
|
||||||
AUDIO_STT_MODEL,
|
AUDIO_STT_MODEL,
|
||||||
AUDIO_TTS_ENGINE,
|
AUDIO_TTS_ENGINE,
|
||||||
@@ -75,6 +77,7 @@ app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY
|
|||||||
app.state.config.TTS_ENGINE = AUDIO_TTS_ENGINE
|
app.state.config.TTS_ENGINE = AUDIO_TTS_ENGINE
|
||||||
app.state.config.TTS_MODEL = AUDIO_TTS_MODEL
|
app.state.config.TTS_MODEL = AUDIO_TTS_MODEL
|
||||||
app.state.config.TTS_VOICE = AUDIO_TTS_VOICE
|
app.state.config.TTS_VOICE = AUDIO_TTS_VOICE
|
||||||
|
app.state.config.TTS_API_KEY = AUDIO_TTS_API_KEY
|
||||||
|
|
||||||
# setting device type for whisper model
|
# setting device type for whisper model
|
||||||
whisper_device_type = DEVICE_TYPE if DEVICE_TYPE and DEVICE_TYPE == "cuda" else "cpu"
|
whisper_device_type = DEVICE_TYPE if DEVICE_TYPE and DEVICE_TYPE == "cuda" else "cpu"
|
||||||
@@ -87,6 +90,7 @@ SPEECH_CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
|||||||
class TTSConfigForm(BaseModel):
|
class TTSConfigForm(BaseModel):
|
||||||
OPENAI_API_BASE_URL: str
|
OPENAI_API_BASE_URL: str
|
||||||
OPENAI_API_KEY: str
|
OPENAI_API_KEY: str
|
||||||
|
API_KEY: str
|
||||||
ENGINE: str
|
ENGINE: str
|
||||||
MODEL: str
|
MODEL: str
|
||||||
VOICE: str
|
VOICE: str
|
||||||
@@ -137,6 +141,7 @@ async def get_audio_config(user=Depends(get_admin_user)):
|
|||||||
"tts": {
|
"tts": {
|
||||||
"OPENAI_API_BASE_URL": app.state.config.TTS_OPENAI_API_BASE_URL,
|
"OPENAI_API_BASE_URL": app.state.config.TTS_OPENAI_API_BASE_URL,
|
||||||
"OPENAI_API_KEY": app.state.config.TTS_OPENAI_API_KEY,
|
"OPENAI_API_KEY": app.state.config.TTS_OPENAI_API_KEY,
|
||||||
|
"API_KEY": app.state.config.TTS_API_KEY,
|
||||||
"ENGINE": app.state.config.TTS_ENGINE,
|
"ENGINE": app.state.config.TTS_ENGINE,
|
||||||
"MODEL": app.state.config.TTS_MODEL,
|
"MODEL": app.state.config.TTS_MODEL,
|
||||||
"VOICE": app.state.config.TTS_VOICE,
|
"VOICE": app.state.config.TTS_VOICE,
|
||||||
@@ -156,6 +161,7 @@ async def update_audio_config(
|
|||||||
):
|
):
|
||||||
app.state.config.TTS_OPENAI_API_BASE_URL = form_data.tts.OPENAI_API_BASE_URL
|
app.state.config.TTS_OPENAI_API_BASE_URL = form_data.tts.OPENAI_API_BASE_URL
|
||||||
app.state.config.TTS_OPENAI_API_KEY = form_data.tts.OPENAI_API_KEY
|
app.state.config.TTS_OPENAI_API_KEY = form_data.tts.OPENAI_API_KEY
|
||||||
|
app.state.config.TTS_API_KEY = form_data.tts.API_KEY
|
||||||
app.state.config.TTS_ENGINE = form_data.tts.ENGINE
|
app.state.config.TTS_ENGINE = form_data.tts.ENGINE
|
||||||
app.state.config.TTS_MODEL = form_data.tts.MODEL
|
app.state.config.TTS_MODEL = form_data.tts.MODEL
|
||||||
app.state.config.TTS_VOICE = form_data.tts.VOICE
|
app.state.config.TTS_VOICE = form_data.tts.VOICE
|
||||||
@@ -169,6 +175,7 @@ async def update_audio_config(
|
|||||||
"tts": {
|
"tts": {
|
||||||
"OPENAI_API_BASE_URL": app.state.config.TTS_OPENAI_API_BASE_URL,
|
"OPENAI_API_BASE_URL": app.state.config.TTS_OPENAI_API_BASE_URL,
|
||||||
"OPENAI_API_KEY": app.state.config.TTS_OPENAI_API_KEY,
|
"OPENAI_API_KEY": app.state.config.TTS_OPENAI_API_KEY,
|
||||||
|
"API_KEY": app.state.config.TTS_API_KEY,
|
||||||
"ENGINE": app.state.config.TTS_ENGINE,
|
"ENGINE": app.state.config.TTS_ENGINE,
|
||||||
"MODEL": app.state.config.TTS_MODEL,
|
"MODEL": app.state.config.TTS_MODEL,
|
||||||
"VOICE": app.state.config.TTS_VOICE,
|
"VOICE": app.state.config.TTS_VOICE,
|
||||||
@@ -194,55 +201,111 @@ async def speech(request: Request, user=Depends(get_verified_user)):
|
|||||||
if file_path.is_file():
|
if file_path.is_file():
|
||||||
return FileResponse(file_path)
|
return FileResponse(file_path)
|
||||||
|
|
||||||
headers = {}
|
if app.state.config.TTS_ENGINE == "openai":
|
||||||
headers["Authorization"] = f"Bearer {app.state.config.TTS_OPENAI_API_KEY}"
|
headers = {}
|
||||||
headers["Content-Type"] = "application/json"
|
headers["Authorization"] = f"Bearer {app.state.config.TTS_OPENAI_API_KEY}"
|
||||||
|
headers["Content-Type"] = "application/json"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
body = body.decode("utf-8")
|
body = body.decode("utf-8")
|
||||||
body = json.loads(body)
|
body = json.loads(body)
|
||||||
body["model"] = app.state.config.TTS_MODEL
|
body["model"] = app.state.config.TTS_MODEL
|
||||||
body = json.dumps(body).encode("utf-8")
|
body = json.dumps(body).encode("utf-8")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
try:
|
try:
|
||||||
r = requests.post(
|
r = requests.post(
|
||||||
url=f"{app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
|
url=f"{app.state.config.TTS_OPENAI_API_BASE_URL}/audio/speech",
|
||||||
data=body,
|
data=body,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
stream=True,
|
stream=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
# Save the streaming content to a file
|
# Save the streaming content to a file
|
||||||
with open(file_path, "wb") as f:
|
with open(file_path, "wb") as f:
|
||||||
for chunk in r.iter_content(chunk_size=8192):
|
for chunk in r.iter_content(chunk_size=8192):
|
||||||
f.write(chunk)
|
f.write(chunk)
|
||||||
|
|
||||||
with open(file_body_path, "w") as f:
|
with open(file_body_path, "w") as f:
|
||||||
json.dump(json.loads(body.decode("utf-8")), f)
|
json.dump(json.loads(body.decode("utf-8")), f)
|
||||||
|
|
||||||
# Return the saved file
|
# Return the saved file
|
||||||
return FileResponse(file_path)
|
return FileResponse(file_path)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.exception(e)
|
log.exception(e)
|
||||||
error_detail = "Open WebUI: Server Connection Error"
|
error_detail = "Open WebUI: Server Connection Error"
|
||||||
if r is not None:
|
if r is not None:
|
||||||
try:
|
try:
|
||||||
res = r.json()
|
res = r.json()
|
||||||
if "error" in res:
|
if "error" in res:
|
||||||
error_detail = f"External: {res['error']['message']}"
|
error_detail = f"External: {res['error']['message']}"
|
||||||
except:
|
except:
|
||||||
error_detail = f"External: {e}"
|
error_detail = f"External: {e}"
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=r.status_code if r != None else 500,
|
status_code=r.status_code if r != None else 500,
|
||||||
detail=error_detail,
|
detail=error_detail,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||||
|
payload = None
|
||||||
|
try:
|
||||||
|
payload = json.loads(body.decode("utf-8"))
|
||||||
|
except Exception as e:
|
||||||
|
log.exception(e)
|
||||||
|
raise HTTPException(status_code=400, detail="Invalid JSON payload")
|
||||||
|
|
||||||
|
voice_id = payload.get("voice", "")
|
||||||
|
url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Accept": "audio/mpeg",
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"xi-api-key": app.state.config.TTS_API_KEY,
|
||||||
|
}
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"text": payload["input"],
|
||||||
|
"model_id": app.state.config.TTS_MODEL,
|
||||||
|
"voice_settings": {"stability": 0.5, "similarity_boost": 0.5},
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
r = requests.post(url, json=data, headers=headers)
|
||||||
|
|
||||||
|
r.raise_for_status()
|
||||||
|
|
||||||
|
# Save the streaming content to a file
|
||||||
|
with open(file_path, "wb") as f:
|
||||||
|
for chunk in r.iter_content(chunk_size=8192):
|
||||||
|
f.write(chunk)
|
||||||
|
|
||||||
|
with open(file_body_path, "w") as f:
|
||||||
|
json.dump(json.loads(body.decode("utf-8")), f)
|
||||||
|
|
||||||
|
# Return the saved file
|
||||||
|
return FileResponse(file_path)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
log.exception(e)
|
||||||
|
error_detail = "Open WebUI: Server Connection Error"
|
||||||
|
if r is not None:
|
||||||
|
try:
|
||||||
|
res = r.json()
|
||||||
|
if "error" in res:
|
||||||
|
error_detail = f"External: {res['error']['message']}"
|
||||||
|
except:
|
||||||
|
error_detail = f"External: {e}"
|
||||||
|
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=r.status_code if r != None else 500,
|
||||||
|
detail=error_detail,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.post("/transcriptions")
|
@app.post("/transcriptions")
|
||||||
@@ -373,3 +436,69 @@ def transcribe(
|
|||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(e),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_available_models() -> List[dict]:
|
||||||
|
if app.state.config.TTS_ENGINE == "openai":
|
||||||
|
return [{"id": "tts-1"}, {"id": "tts-1-hd"}]
|
||||||
|
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||||
|
headers = {
|
||||||
|
"xi-api-key": app.state.config.TTS_API_KEY,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.get(
|
||||||
|
"https://api.elevenlabs.io/v1/models", headers=headers
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
models = response.json()
|
||||||
|
return [
|
||||||
|
{"name": model["name"], "id": model["model_id"]} for model in models
|
||||||
|
]
|
||||||
|
except requests.RequestException as e:
|
||||||
|
log.error(f"Error fetching voices: {str(e)}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/models")
|
||||||
|
async def get_models(user=Depends(get_verified_user)):
|
||||||
|
return {"models": get_available_models()}
|
||||||
|
|
||||||
|
|
||||||
|
def get_available_voices() -> List[dict]:
|
||||||
|
if app.state.config.TTS_ENGINE == "openai":
|
||||||
|
return [
|
||||||
|
{"name": "alloy", "id": "alloy"},
|
||||||
|
{"name": "echo", "id": "echo"},
|
||||||
|
{"name": "fable", "id": "fable"},
|
||||||
|
{"name": "onyx", "id": "onyx"},
|
||||||
|
{"name": "nova", "id": "nova"},
|
||||||
|
{"name": "shimmer", "id": "shimmer"},
|
||||||
|
]
|
||||||
|
elif app.state.config.TTS_ENGINE == "elevenlabs":
|
||||||
|
headers = {
|
||||||
|
"xi-api-key": app.state.config.TTS_API_KEY,
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.get(
|
||||||
|
"https://api.elevenlabs.io/v1/voices", headers=headers
|
||||||
|
)
|
||||||
|
response.raise_for_status()
|
||||||
|
voices_data = response.json()
|
||||||
|
|
||||||
|
voices = []
|
||||||
|
for voice in voices_data.get("voices", []):
|
||||||
|
voices.append({"name": voice["name"], "id": voice["voice_id"]})
|
||||||
|
return voices
|
||||||
|
except requests.RequestException as e:
|
||||||
|
log.error(f"Error fetching voices: {str(e)}")
|
||||||
|
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/voices")
|
||||||
|
async def get_voices(user=Depends(get_verified_user)):
|
||||||
|
return {"voices": get_available_voices()}
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ from config import (
|
|||||||
COMFYUI_SAMPLER,
|
COMFYUI_SAMPLER,
|
||||||
COMFYUI_SCHEDULER,
|
COMFYUI_SCHEDULER,
|
||||||
COMFYUI_SD3,
|
COMFYUI_SD3,
|
||||||
|
COMFYUI_FLUX,
|
||||||
|
COMFYUI_FLUX_WEIGHT_DTYPE,
|
||||||
|
COMFYUI_FLUX_FP8_CLIP,
|
||||||
IMAGES_OPENAI_API_BASE_URL,
|
IMAGES_OPENAI_API_BASE_URL,
|
||||||
IMAGES_OPENAI_API_KEY,
|
IMAGES_OPENAI_API_KEY,
|
||||||
IMAGE_GENERATION_MODEL,
|
IMAGE_GENERATION_MODEL,
|
||||||
@@ -85,6 +88,9 @@ app.state.config.COMFYUI_CFG_SCALE = COMFYUI_CFG_SCALE
|
|||||||
app.state.config.COMFYUI_SAMPLER = COMFYUI_SAMPLER
|
app.state.config.COMFYUI_SAMPLER = COMFYUI_SAMPLER
|
||||||
app.state.config.COMFYUI_SCHEDULER = COMFYUI_SCHEDULER
|
app.state.config.COMFYUI_SCHEDULER = COMFYUI_SCHEDULER
|
||||||
app.state.config.COMFYUI_SD3 = COMFYUI_SD3
|
app.state.config.COMFYUI_SD3 = COMFYUI_SD3
|
||||||
|
app.state.config.COMFYUI_FLUX = COMFYUI_FLUX
|
||||||
|
app.state.config.COMFYUI_FLUX_WEIGHT_DTYPE = COMFYUI_FLUX_WEIGHT_DTYPE
|
||||||
|
app.state.config.COMFYUI_FLUX_FP8_CLIP = COMFYUI_FLUX_FP8_CLIP
|
||||||
|
|
||||||
|
|
||||||
def get_automatic1111_api_auth():
|
def get_automatic1111_api_auth():
|
||||||
@@ -497,6 +503,15 @@ async def image_generations(
|
|||||||
if app.state.config.COMFYUI_SD3 is not None:
|
if app.state.config.COMFYUI_SD3 is not None:
|
||||||
data["sd3"] = app.state.config.COMFYUI_SD3
|
data["sd3"] = app.state.config.COMFYUI_SD3
|
||||||
|
|
||||||
|
if app.state.config.COMFYUI_FLUX is not None:
|
||||||
|
data["flux"] = app.state.config.COMFYUI_FLUX
|
||||||
|
|
||||||
|
if app.state.config.COMFYUI_FLUX_WEIGHT_DTYPE is not None:
|
||||||
|
data["flux_weight_dtype"] = app.state.config.COMFYUI_FLUX_WEIGHT_DTYPE
|
||||||
|
|
||||||
|
if app.state.config.COMFYUI_FLUX_FP8_CLIP is not None:
|
||||||
|
data["flux_fp8_clip"] = app.state.config.COMFYUI_FLUX_FP8_CLIP
|
||||||
|
|
||||||
data = ImageGenerationPayload(**data)
|
data = ImageGenerationPayload(**data)
|
||||||
|
|
||||||
res = comfyui_generate_image(
|
res = comfyui_generate_image(
|
||||||
|
|||||||
@@ -125,6 +125,135 @@ COMFYUI_DEFAULT_PROMPT = """
|
|||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
FLUX_DEFAULT_PROMPT = """
|
||||||
|
{
|
||||||
|
"5": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 1024,
|
||||||
|
"height": 1024,
|
||||||
|
"batch_size": 1
|
||||||
|
},
|
||||||
|
"class_type": "EmptyLatentImage"
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "Input Text Here",
|
||||||
|
"clip": [
|
||||||
|
"11",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode"
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"inputs": {
|
||||||
|
"samples": [
|
||||||
|
"13",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"vae": [
|
||||||
|
"10",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "VAEDecode"
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"inputs": {
|
||||||
|
"filename_prefix": "ComfyUI",
|
||||||
|
"images": [
|
||||||
|
"8",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SaveImage"
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"inputs": {
|
||||||
|
"vae_name": "ae.sft"
|
||||||
|
},
|
||||||
|
"class_type": "VAELoader"
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"inputs": {
|
||||||
|
"clip_name1": "clip_l.safetensors",
|
||||||
|
"clip_name2": "t5xxl_fp16.safetensors",
|
||||||
|
"type": "flux"
|
||||||
|
},
|
||||||
|
"class_type": "DualCLIPLoader"
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"inputs": {
|
||||||
|
"unet_name": "flux1-dev.sft",
|
||||||
|
"weight_dtype": "default"
|
||||||
|
},
|
||||||
|
"class_type": "UNETLoader"
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
"inputs": {
|
||||||
|
"noise": [
|
||||||
|
"25",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"guider": [
|
||||||
|
"22",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"sampler": [
|
||||||
|
"16",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"sigmas": [
|
||||||
|
"17",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"latent_image": [
|
||||||
|
"5",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SamplerCustomAdvanced"
|
||||||
|
},
|
||||||
|
"16": {
|
||||||
|
"inputs": {
|
||||||
|
"sampler_name": "euler"
|
||||||
|
},
|
||||||
|
"class_type": "KSamplerSelect"
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
"inputs": {
|
||||||
|
"scheduler": "simple",
|
||||||
|
"steps": 20,
|
||||||
|
"denoise": 1,
|
||||||
|
"model": [
|
||||||
|
"12",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "BasicScheduler"
|
||||||
|
},
|
||||||
|
"22": {
|
||||||
|
"inputs": {
|
||||||
|
"model": [
|
||||||
|
"12",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"conditioning": [
|
||||||
|
"6",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "BasicGuider"
|
||||||
|
},
|
||||||
|
"25": {
|
||||||
|
"inputs": {
|
||||||
|
"noise_seed": 778937779713005
|
||||||
|
},
|
||||||
|
"class_type": "RandomNoise"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
def queue_prompt(prompt, client_id, base_url):
|
def queue_prompt(prompt, client_id, base_url):
|
||||||
log.info("queue_prompt")
|
log.info("queue_prompt")
|
||||||
@@ -194,6 +323,9 @@ class ImageGenerationPayload(BaseModel):
|
|||||||
sampler: Optional[str] = None
|
sampler: Optional[str] = None
|
||||||
scheduler: Optional[str] = None
|
scheduler: Optional[str] = None
|
||||||
sd3: Optional[bool] = None
|
sd3: Optional[bool] = None
|
||||||
|
flux: Optional[bool] = None
|
||||||
|
flux_weight_dtype: Optional[str] = None
|
||||||
|
flux_fp8_clip: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
def comfyui_generate_image(
|
def comfyui_generate_image(
|
||||||
@@ -215,21 +347,46 @@ def comfyui_generate_image(
|
|||||||
if payload.sd3:
|
if payload.sd3:
|
||||||
comfyui_prompt["5"]["class_type"] = "EmptySD3LatentImage"
|
comfyui_prompt["5"]["class_type"] = "EmptySD3LatentImage"
|
||||||
|
|
||||||
|
if payload.steps:
|
||||||
|
comfyui_prompt["3"]["inputs"]["steps"] = payload.steps
|
||||||
|
|
||||||
comfyui_prompt["4"]["inputs"]["ckpt_name"] = model
|
comfyui_prompt["4"]["inputs"]["ckpt_name"] = model
|
||||||
|
comfyui_prompt["7"]["inputs"]["text"] = payload.negative_prompt
|
||||||
|
comfyui_prompt["3"]["inputs"]["seed"] = (
|
||||||
|
payload.seed if payload.seed else random.randint(0, 18446744073709551614)
|
||||||
|
)
|
||||||
|
|
||||||
|
# as Flux uses a completely different workflow, we must treat it specially
|
||||||
|
if payload.flux:
|
||||||
|
comfyui_prompt = json.loads(FLUX_DEFAULT_PROMPT)
|
||||||
|
comfyui_prompt["12"]["inputs"]["unet_name"] = model
|
||||||
|
comfyui_prompt["25"]["inputs"]["noise_seed"] = (
|
||||||
|
payload.seed if payload.seed else random.randint(0, 18446744073709551614)
|
||||||
|
)
|
||||||
|
|
||||||
|
if payload.sampler:
|
||||||
|
comfyui_prompt["16"]["inputs"]["sampler_name"] = payload.sampler
|
||||||
|
|
||||||
|
if payload.steps:
|
||||||
|
comfyui_prompt["17"]["inputs"]["steps"] = payload.steps
|
||||||
|
|
||||||
|
if payload.scheduler:
|
||||||
|
comfyui_prompt["17"]["inputs"]["scheduler"] = payload.scheduler
|
||||||
|
|
||||||
|
if payload.flux_weight_dtype:
|
||||||
|
comfyui_prompt["12"]["inputs"]["weight_dtype"] = payload.flux_weight_dtype
|
||||||
|
|
||||||
|
if payload.flux_fp8_clip:
|
||||||
|
comfyui_prompt["11"]["inputs"][
|
||||||
|
"clip_name2"
|
||||||
|
] = "t5xxl_fp8_e4m3fn.safetensors"
|
||||||
|
|
||||||
comfyui_prompt["5"]["inputs"]["batch_size"] = payload.n
|
comfyui_prompt["5"]["inputs"]["batch_size"] = payload.n
|
||||||
comfyui_prompt["5"]["inputs"]["width"] = payload.width
|
comfyui_prompt["5"]["inputs"]["width"] = payload.width
|
||||||
comfyui_prompt["5"]["inputs"]["height"] = payload.height
|
comfyui_prompt["5"]["inputs"]["height"] = payload.height
|
||||||
|
|
||||||
# set the text prompt for our positive CLIPTextEncode
|
# set the text prompt for our positive CLIPTextEncode
|
||||||
comfyui_prompt["6"]["inputs"]["text"] = payload.prompt
|
comfyui_prompt["6"]["inputs"]["text"] = payload.prompt
|
||||||
comfyui_prompt["7"]["inputs"]["text"] = payload.negative_prompt
|
|
||||||
|
|
||||||
if payload.steps:
|
|
||||||
comfyui_prompt["3"]["inputs"]["steps"] = payload.steps
|
|
||||||
|
|
||||||
comfyui_prompt["3"]["inputs"]["seed"] = (
|
|
||||||
payload.seed if payload.seed else random.randint(0, 18446744073709551614)
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ws = websocket.WebSocket()
|
ws = websocket.WebSocket()
|
||||||
|
|||||||
@@ -805,7 +805,7 @@ async def generate_chat_completion(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
model_info.params.get("temperature", None)
|
model_info.params.get("temperature", None) is not None
|
||||||
and payload["options"].get("temperature") is None
|
and payload["options"].get("temperature") is None
|
||||||
):
|
):
|
||||||
payload["options"]["temperature"] = model_info.params.get(
|
payload["options"]["temperature"] = model_info.params.get(
|
||||||
@@ -813,7 +813,7 @@ async def generate_chat_completion(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
model_info.params.get("seed", None)
|
model_info.params.get("seed", None) is not None
|
||||||
and payload["options"].get("seed") is None
|
and payload["options"].get("seed") is None
|
||||||
):
|
):
|
||||||
payload["options"]["seed"] = model_info.params.get("seed", None)
|
payload["options"]["seed"] = model_info.params.get("seed", None)
|
||||||
@@ -857,6 +857,12 @@ async def generate_chat_completion(
|
|||||||
):
|
):
|
||||||
payload["options"]["top_p"] = model_info.params.get("top_p", None)
|
payload["options"]["top_p"] = model_info.params.get("top_p", None)
|
||||||
|
|
||||||
|
if (
|
||||||
|
model_info.params.get("min_p", None)
|
||||||
|
and payload["options"].get("min_p") is None
|
||||||
|
):
|
||||||
|
payload["options"]["min_p"] = model_info.params.get("min_p", None)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
model_info.params.get("use_mmap", None)
|
model_info.params.get("use_mmap", None)
|
||||||
and payload["options"].get("use_mmap") is None
|
and payload["options"].get("use_mmap") is None
|
||||||
|
|||||||
+73
-138
@@ -1,6 +1,6 @@
|
|||||||
from fastapi import FastAPI, Request, Response, HTTPException, Depends
|
from fastapi import FastAPI, Request, HTTPException, Depends
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from fastapi.responses import StreamingResponse, JSONResponse, FileResponse
|
from fastapi.responses import StreamingResponse, FileResponse
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
import aiohttp
|
import aiohttp
|
||||||
@@ -12,16 +12,12 @@ from pydantic import BaseModel
|
|||||||
from starlette.background import BackgroundTask
|
from starlette.background import BackgroundTask
|
||||||
|
|
||||||
from apps.webui.models.models import Models
|
from apps.webui.models.models import Models
|
||||||
from apps.webui.models.users import Users
|
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
from utils.utils import (
|
from utils.utils import (
|
||||||
decode_token,
|
|
||||||
get_verified_user,
|
|
||||||
get_verified_user,
|
get_verified_user,
|
||||||
get_admin_user,
|
get_admin_user,
|
||||||
)
|
)
|
||||||
from utils.task import prompt_template
|
from utils.misc import apply_model_params_to_body, apply_model_system_prompt_to_body
|
||||||
from utils.misc import add_or_update_system_message
|
|
||||||
|
|
||||||
from config import (
|
from config import (
|
||||||
SRC_LOG_LEVELS,
|
SRC_LOG_LEVELS,
|
||||||
@@ -34,7 +30,7 @@ from config import (
|
|||||||
MODEL_FILTER_LIST,
|
MODEL_FILTER_LIST,
|
||||||
AppConfig,
|
AppConfig,
|
||||||
)
|
)
|
||||||
from typing import List, Optional
|
from typing import List, Optional, Literal, overload
|
||||||
|
|
||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
@@ -69,8 +65,6 @@ app.state.MODELS = {}
|
|||||||
async def check_url(request: Request, call_next):
|
async def check_url(request: Request, call_next):
|
||||||
if len(app.state.MODELS) == 0:
|
if len(app.state.MODELS) == 0:
|
||||||
await get_all_models()
|
await get_all_models()
|
||||||
else:
|
|
||||||
pass
|
|
||||||
|
|
||||||
response = await call_next(request)
|
response = await call_next(request)
|
||||||
return response
|
return response
|
||||||
@@ -175,7 +169,7 @@ async def speech(request: Request, user=Depends(get_verified_user)):
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "error" in res:
|
if "error" in res:
|
||||||
error_detail = f"External: {res['error']}"
|
error_detail = f"External: {res['error']}"
|
||||||
except:
|
except Exception:
|
||||||
error_detail = f"External: {e}"
|
error_detail = f"External: {e}"
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -234,64 +228,68 @@ def merge_models_lists(model_lists):
|
|||||||
return merged_list
|
return merged_list
|
||||||
|
|
||||||
|
|
||||||
async def get_all_models(raw: bool = False):
|
def is_openai_api_disabled():
|
||||||
|
api_keys = app.state.config.OPENAI_API_KEYS
|
||||||
|
no_keys = len(api_keys) == 1 and api_keys[0] == ""
|
||||||
|
return no_keys or not app.state.config.ENABLE_OPENAI_API
|
||||||
|
|
||||||
|
|
||||||
|
async def get_all_models_raw() -> list:
|
||||||
|
if is_openai_api_disabled():
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Check if API KEYS length is same than API URLS length
|
||||||
|
num_urls = len(app.state.config.OPENAI_API_BASE_URLS)
|
||||||
|
num_keys = len(app.state.config.OPENAI_API_KEYS)
|
||||||
|
|
||||||
|
if num_keys != num_urls:
|
||||||
|
# if there are more keys than urls, remove the extra keys
|
||||||
|
if num_keys > num_urls:
|
||||||
|
new_keys = app.state.config.OPENAI_API_KEYS[:num_urls]
|
||||||
|
app.state.config.OPENAI_API_KEYS = new_keys
|
||||||
|
# if there are more urls than keys, add empty keys
|
||||||
|
else:
|
||||||
|
app.state.config.OPENAI_API_KEYS += [""] * (num_urls - num_keys)
|
||||||
|
|
||||||
|
tasks = [
|
||||||
|
fetch_url(f"{url}/models", app.state.config.OPENAI_API_KEYS[idx])
|
||||||
|
for idx, url in enumerate(app.state.config.OPENAI_API_BASE_URLS)
|
||||||
|
]
|
||||||
|
|
||||||
|
responses = await asyncio.gather(*tasks)
|
||||||
|
log.debug(f"get_all_models:responses() {responses}")
|
||||||
|
|
||||||
|
return responses
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
async def get_all_models(raw: Literal[True]) -> list: ...
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
async def get_all_models(raw: Literal[False] = False) -> dict[str, list]: ...
|
||||||
|
|
||||||
|
|
||||||
|
async def get_all_models(raw=False) -> dict[str, list] | list:
|
||||||
log.info("get_all_models()")
|
log.info("get_all_models()")
|
||||||
|
if is_openai_api_disabled():
|
||||||
|
return [] if raw else {"data": []}
|
||||||
|
|
||||||
if (
|
responses = await get_all_models_raw()
|
||||||
len(app.state.config.OPENAI_API_KEYS) == 1
|
if raw:
|
||||||
and app.state.config.OPENAI_API_KEYS[0] == ""
|
return responses
|
||||||
) or not app.state.config.ENABLE_OPENAI_API:
|
|
||||||
models = {"data": []}
|
|
||||||
else:
|
|
||||||
# Check if API KEYS length is same than API URLS length
|
|
||||||
if len(app.state.config.OPENAI_API_KEYS) != len(
|
|
||||||
app.state.config.OPENAI_API_BASE_URLS
|
|
||||||
):
|
|
||||||
# if there are more keys than urls, remove the extra keys
|
|
||||||
if len(app.state.config.OPENAI_API_KEYS) > len(
|
|
||||||
app.state.config.OPENAI_API_BASE_URLS
|
|
||||||
):
|
|
||||||
app.state.config.OPENAI_API_KEYS = app.state.config.OPENAI_API_KEYS[
|
|
||||||
: len(app.state.config.OPENAI_API_BASE_URLS)
|
|
||||||
]
|
|
||||||
# if there are more urls than keys, add empty keys
|
|
||||||
else:
|
|
||||||
app.state.config.OPENAI_API_KEYS += [
|
|
||||||
""
|
|
||||||
for _ in range(
|
|
||||||
len(app.state.config.OPENAI_API_BASE_URLS)
|
|
||||||
- len(app.state.config.OPENAI_API_KEYS)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
tasks = [
|
def extract_data(response):
|
||||||
fetch_url(f"{url}/models", app.state.config.OPENAI_API_KEYS[idx])
|
if response and "data" in response:
|
||||||
for idx, url in enumerate(app.state.config.OPENAI_API_BASE_URLS)
|
return response["data"]
|
||||||
]
|
if isinstance(response, list):
|
||||||
|
return response
|
||||||
|
return None
|
||||||
|
|
||||||
responses = await asyncio.gather(*tasks)
|
models = {"data": merge_models_lists(map(extract_data, responses))}
|
||||||
log.debug(f"get_all_models:responses() {responses}")
|
|
||||||
|
|
||||||
if raw:
|
log.debug(f"models: {models}")
|
||||||
return responses
|
app.state.MODELS = {model["id"]: model for model in models["data"]}
|
||||||
|
|
||||||
models = {
|
|
||||||
"data": merge_models_lists(
|
|
||||||
list(
|
|
||||||
map(
|
|
||||||
lambda response: (
|
|
||||||
response["data"]
|
|
||||||
if (response and "data" in response)
|
|
||||||
else (response if isinstance(response, list) else None)
|
|
||||||
),
|
|
||||||
responses,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug(f"models: {models}")
|
|
||||||
app.state.MODELS = {model["id"]: model for model in models["data"]}
|
|
||||||
|
|
||||||
return models
|
return models
|
||||||
|
|
||||||
@@ -299,7 +297,7 @@ async def get_all_models(raw: bool = False):
|
|||||||
@app.get("/models")
|
@app.get("/models")
|
||||||
@app.get("/models/{url_idx}")
|
@app.get("/models/{url_idx}")
|
||||||
async def get_models(url_idx: Optional[int] = None, user=Depends(get_verified_user)):
|
async def get_models(url_idx: Optional[int] = None, user=Depends(get_verified_user)):
|
||||||
if url_idx == None:
|
if url_idx is None:
|
||||||
models = await get_all_models()
|
models = await get_all_models()
|
||||||
if app.state.config.ENABLE_MODEL_FILTER:
|
if app.state.config.ENABLE_MODEL_FILTER:
|
||||||
if user.role == "user":
|
if user.role == "user":
|
||||||
@@ -340,7 +338,7 @@ async def get_models(url_idx: Optional[int] = None, user=Depends(get_verified_us
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "error" in res:
|
if "error" in res:
|
||||||
error_detail = f"External: {res['error']}"
|
error_detail = f"External: {res['error']}"
|
||||||
except:
|
except Exception:
|
||||||
error_detail = f"External: {e}"
|
error_detail = f"External: {e}"
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -358,8 +356,7 @@ async def generate_chat_completion(
|
|||||||
):
|
):
|
||||||
idx = 0
|
idx = 0
|
||||||
payload = {**form_data}
|
payload = {**form_data}
|
||||||
if "metadata" in payload:
|
payload.pop("metadata")
|
||||||
del payload["metadata"]
|
|
||||||
|
|
||||||
model_id = form_data.get("model")
|
model_id = form_data.get("model")
|
||||||
model_info = Models.get_model_by_id(model_id)
|
model_info = Models.get_model_by_id(model_id)
|
||||||
@@ -368,67 +365,9 @@ async def generate_chat_completion(
|
|||||||
if model_info.base_model_id:
|
if model_info.base_model_id:
|
||||||
payload["model"] = model_info.base_model_id
|
payload["model"] = model_info.base_model_id
|
||||||
|
|
||||||
model_info.params = model_info.params.model_dump()
|
params = model_info.params.model_dump()
|
||||||
|
payload = apply_model_params_to_body(params, payload)
|
||||||
if model_info.params:
|
payload = apply_model_system_prompt_to_body(params, payload, user)
|
||||||
if (
|
|
||||||
model_info.params.get("temperature", None)
|
|
||||||
and payload.get("temperature") is None
|
|
||||||
):
|
|
||||||
payload["temperature"] = float(model_info.params.get("temperature"))
|
|
||||||
|
|
||||||
if model_info.params.get("top_p", None) and payload.get("top_p") is None:
|
|
||||||
payload["top_p"] = int(model_info.params.get("top_p", None))
|
|
||||||
|
|
||||||
if (
|
|
||||||
model_info.params.get("max_tokens", None)
|
|
||||||
and payload.get("max_tokens") is None
|
|
||||||
):
|
|
||||||
payload["max_tokens"] = int(model_info.params.get("max_tokens", None))
|
|
||||||
|
|
||||||
if (
|
|
||||||
model_info.params.get("frequency_penalty", None)
|
|
||||||
and payload.get("frequency_penalty") is None
|
|
||||||
):
|
|
||||||
payload["frequency_penalty"] = int(
|
|
||||||
model_info.params.get("frequency_penalty", None)
|
|
||||||
)
|
|
||||||
|
|
||||||
if model_info.params.get("seed", None) and payload.get("seed") is None:
|
|
||||||
payload["seed"] = model_info.params.get("seed", None)
|
|
||||||
|
|
||||||
if model_info.params.get("stop", None) and payload.get("stop") is None:
|
|
||||||
payload["stop"] = (
|
|
||||||
[
|
|
||||||
bytes(stop, "utf-8").decode("unicode_escape")
|
|
||||||
for stop in model_info.params["stop"]
|
|
||||||
]
|
|
||||||
if model_info.params.get("stop", None)
|
|
||||||
else None
|
|
||||||
)
|
|
||||||
|
|
||||||
system = model_info.params.get("system", None)
|
|
||||||
if system:
|
|
||||||
system = prompt_template(
|
|
||||||
system,
|
|
||||||
**(
|
|
||||||
{
|
|
||||||
"user_name": user.name,
|
|
||||||
"user_location": (
|
|
||||||
user.info.get("location") if user.info else None
|
|
||||||
),
|
|
||||||
}
|
|
||||||
if user
|
|
||||||
else {}
|
|
||||||
),
|
|
||||||
)
|
|
||||||
if payload.get("messages"):
|
|
||||||
payload["messages"] = add_or_update_system_message(
|
|
||||||
system, payload["messages"]
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
|
|
||||||
model = app.state.MODELS[payload.get("model")]
|
model = app.state.MODELS[payload.get("model")]
|
||||||
idx = model["urlIdx"]
|
idx = model["urlIdx"]
|
||||||
@@ -441,13 +380,6 @@ async def generate_chat_completion(
|
|||||||
"role": user.role,
|
"role": user.role,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if the model is "gpt-4-vision-preview" and set "max_tokens" to 4000
|
|
||||||
# This is a workaround until OpenAI fixes the issue with this model
|
|
||||||
if payload.get("model") == "gpt-4-vision-preview":
|
|
||||||
if "max_tokens" not in payload:
|
|
||||||
payload["max_tokens"] = 4000
|
|
||||||
log.debug("Modified payload:", payload)
|
|
||||||
|
|
||||||
# Convert the modified body back to JSON
|
# Convert the modified body back to JSON
|
||||||
payload = json.dumps(payload)
|
payload = json.dumps(payload)
|
||||||
|
|
||||||
@@ -459,6 +391,9 @@ async def generate_chat_completion(
|
|||||||
headers = {}
|
headers = {}
|
||||||
headers["Authorization"] = f"Bearer {key}"
|
headers["Authorization"] = f"Bearer {key}"
|
||||||
headers["Content-Type"] = "application/json"
|
headers["Content-Type"] = "application/json"
|
||||||
|
if "openrouter.ai" in app.state.config.OPENAI_API_BASE_URLS[idx]:
|
||||||
|
headers["HTTP-Referer"] = "https://openwebui.com/"
|
||||||
|
headers["X-Title"] = "Open WebUI"
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
session = None
|
session = None
|
||||||
@@ -500,7 +435,7 @@ async def generate_chat_completion(
|
|||||||
print(res)
|
print(res)
|
||||||
if "error" in res:
|
if "error" in res:
|
||||||
error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}"
|
error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}"
|
||||||
except:
|
except Exception:
|
||||||
error_detail = f"External: {e}"
|
error_detail = f"External: {e}"
|
||||||
raise HTTPException(status_code=r.status if r else 500, detail=error_detail)
|
raise HTTPException(status_code=r.status if r else 500, detail=error_detail)
|
||||||
finally:
|
finally:
|
||||||
@@ -563,7 +498,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
|
|||||||
print(res)
|
print(res)
|
||||||
if "error" in res:
|
if "error" in res:
|
||||||
error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}"
|
error_detail = f"External: {res['error']['message'] if 'message' in res['error'] else res['error']}"
|
||||||
except:
|
except Exception:
|
||||||
error_detail = f"External: {e}"
|
error_detail = f"External: {e}"
|
||||||
raise HTTPException(status_code=r.status if r else 500, detail=error_detail)
|
raise HTTPException(status_code=r.status if r else 500, detail=error_detail)
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
@@ -1099,6 +1099,13 @@ def get_loader(filename: str, file_content_type: str, file_path: str):
|
|||||||
"vue",
|
"vue",
|
||||||
"svelte",
|
"svelte",
|
||||||
"msg",
|
"msg",
|
||||||
|
"ex",
|
||||||
|
"exs",
|
||||||
|
"erl",
|
||||||
|
"tsx",
|
||||||
|
"jsx",
|
||||||
|
"hs",
|
||||||
|
"lhs",
|
||||||
]
|
]
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|||||||
+17
-16
@@ -44,24 +44,26 @@ async def user_join(sid, data):
|
|||||||
print("user-join", sid, data)
|
print("user-join", sid, data)
|
||||||
|
|
||||||
auth = data["auth"] if "auth" in data else None
|
auth = data["auth"] if "auth" in data else None
|
||||||
|
if not auth or "token" not in auth:
|
||||||
|
return
|
||||||
|
|
||||||
if auth and "token" in auth:
|
data = decode_token(auth["token"])
|
||||||
data = decode_token(auth["token"])
|
if data is None or "id" not in data:
|
||||||
|
return
|
||||||
|
|
||||||
if data is not None and "id" in data:
|
user = Users.get_user_by_id(data["id"])
|
||||||
user = Users.get_user_by_id(data["id"])
|
if not user:
|
||||||
|
return
|
||||||
|
|
||||||
if user:
|
SESSION_POOL[sid] = user.id
|
||||||
|
if user.id in USER_POOL:
|
||||||
|
USER_POOL[user.id].append(sid)
|
||||||
|
else:
|
||||||
|
USER_POOL[user.id] = [sid]
|
||||||
|
|
||||||
SESSION_POOL[sid] = user.id
|
print(f"user {user.name}({user.id}) connected with session ID {sid}")
|
||||||
if user.id in USER_POOL:
|
|
||||||
USER_POOL[user.id].append(sid)
|
|
||||||
else:
|
|
||||||
USER_POOL[user.id] = [sid]
|
|
||||||
|
|
||||||
print(f"user {user.name}({user.id}) connected with session ID {sid}")
|
await sio.emit("user-count", {"count": len(set(USER_POOL))})
|
||||||
|
|
||||||
await sio.emit("user-count", {"count": len(set(USER_POOL))})
|
|
||||||
|
|
||||||
|
|
||||||
@sio.on("user-count")
|
@sio.on("user-count")
|
||||||
@@ -80,7 +82,6 @@ def get_models_in_use():
|
|||||||
|
|
||||||
@sio.on("usage")
|
@sio.on("usage")
|
||||||
async def usage(sid, data):
|
async def usage(sid, data):
|
||||||
|
|
||||||
model_id = data["model"]
|
model_id = data["model"]
|
||||||
|
|
||||||
# Cancel previous callback if there is one
|
# Cancel previous callback if there is one
|
||||||
@@ -139,7 +140,7 @@ async def disconnect(sid):
|
|||||||
print(f"Unknown session ID {sid} disconnected")
|
print(f"Unknown session ID {sid} disconnected")
|
||||||
|
|
||||||
|
|
||||||
async def get_event_emitter(request_info):
|
def get_event_emitter(request_info):
|
||||||
async def __event_emitter__(event_data):
|
async def __event_emitter__(event_data):
|
||||||
await sio.emit(
|
await sio.emit(
|
||||||
"chat-events",
|
"chat-events",
|
||||||
@@ -154,7 +155,7 @@ async def get_event_emitter(request_info):
|
|||||||
return __event_emitter__
|
return __event_emitter__
|
||||||
|
|
||||||
|
|
||||||
async def get_event_call(request_info):
|
def get_event_call(request_info):
|
||||||
async def __event_call__(event_data):
|
async def __event_call__(event_data):
|
||||||
response = await sio.call(
|
response = await sio.call(
|
||||||
"chat-events",
|
"chat-events",
|
||||||
|
|||||||
+190
-284
@@ -1,9 +1,6 @@
|
|||||||
from fastapi import FastAPI, Depends
|
from fastapi import FastAPI
|
||||||
from fastapi.routing import APIRoute
|
|
||||||
from fastapi.responses import StreamingResponse
|
from fastapi.responses import StreamingResponse
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from starlette.middleware.sessions import SessionMiddleware
|
|
||||||
from sqlalchemy.orm import Session
|
|
||||||
from apps.webui.routers import (
|
from apps.webui.routers import (
|
||||||
auths,
|
auths,
|
||||||
users,
|
users,
|
||||||
@@ -22,12 +19,15 @@ from apps.webui.models.functions import Functions
|
|||||||
from apps.webui.models.models import Models
|
from apps.webui.models.models import Models
|
||||||
from apps.webui.utils import load_function_module_by_id
|
from apps.webui.utils import load_function_module_by_id
|
||||||
|
|
||||||
from utils.misc import stream_message_template
|
from utils.misc import (
|
||||||
from utils.task import prompt_template
|
openai_chat_chunk_message_template,
|
||||||
|
openai_chat_completion_message_template,
|
||||||
|
apply_model_params_to_body,
|
||||||
|
apply_model_system_prompt_to_body,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
from config import (
|
from config import (
|
||||||
WEBUI_BUILD_HASH,
|
|
||||||
SHOW_ADMIN_DETAILS,
|
SHOW_ADMIN_DETAILS,
|
||||||
ADMIN_EMAIL,
|
ADMIN_EMAIL,
|
||||||
WEBUI_AUTH,
|
WEBUI_AUTH,
|
||||||
@@ -35,6 +35,7 @@ from config import (
|
|||||||
DEFAULT_PROMPT_SUGGESTIONS,
|
DEFAULT_PROMPT_SUGGESTIONS,
|
||||||
DEFAULT_USER_ROLE,
|
DEFAULT_USER_ROLE,
|
||||||
ENABLE_SIGNUP,
|
ENABLE_SIGNUP,
|
||||||
|
ENABLE_LOGIN_FORM,
|
||||||
USER_PERMISSIONS,
|
USER_PERMISSIONS,
|
||||||
WEBHOOK_URL,
|
WEBHOOK_URL,
|
||||||
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
||||||
@@ -50,11 +51,9 @@ from config import (
|
|||||||
from apps.socket.main import get_event_call, get_event_emitter
|
from apps.socket.main import get_event_call, get_event_emitter
|
||||||
|
|
||||||
import inspect
|
import inspect
|
||||||
import uuid
|
|
||||||
import time
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from typing import Iterator, Generator, Optional
|
from typing import Iterator, Generator, AsyncGenerator
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
@@ -64,6 +63,7 @@ origins = ["*"]
|
|||||||
app.state.config = AppConfig()
|
app.state.config = AppConfig()
|
||||||
|
|
||||||
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
||||||
|
app.state.config.ENABLE_LOGIN_FORM = ENABLE_LOGIN_FORM
|
||||||
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
||||||
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
||||||
app.state.AUTH_TRUSTED_NAME_HEADER = WEBUI_AUTH_TRUSTED_NAME_HEADER
|
app.state.AUTH_TRUSTED_NAME_HEADER = WEBUI_AUTH_TRUSTED_NAME_HEADER
|
||||||
@@ -125,60 +125,58 @@ async def get_status():
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_function_module(pipe_id: str):
|
||||||
|
# Check if function is already loaded
|
||||||
|
if pipe_id not in app.state.FUNCTIONS:
|
||||||
|
function_module, _, _ = load_function_module_by_id(pipe_id)
|
||||||
|
app.state.FUNCTIONS[pipe_id] = function_module
|
||||||
|
else:
|
||||||
|
function_module = app.state.FUNCTIONS[pipe_id]
|
||||||
|
|
||||||
|
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
||||||
|
valves = Functions.get_function_valves_by_id(pipe_id)
|
||||||
|
function_module.valves = function_module.Valves(**(valves if valves else {}))
|
||||||
|
return function_module
|
||||||
|
|
||||||
|
|
||||||
async def get_pipe_models():
|
async def get_pipe_models():
|
||||||
pipes = Functions.get_functions_by_type("pipe", active_only=True)
|
pipes = Functions.get_functions_by_type("pipe", active_only=True)
|
||||||
pipe_models = []
|
pipe_models = []
|
||||||
|
|
||||||
for pipe in pipes:
|
for pipe in pipes:
|
||||||
# Check if function is already loaded
|
function_module = get_function_module(pipe.id)
|
||||||
if pipe.id not in app.state.FUNCTIONS:
|
|
||||||
function_module, function_type, frontmatter = load_function_module_by_id(
|
|
||||||
pipe.id
|
|
||||||
)
|
|
||||||
app.state.FUNCTIONS[pipe.id] = function_module
|
|
||||||
else:
|
|
||||||
function_module = app.state.FUNCTIONS[pipe.id]
|
|
||||||
|
|
||||||
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
|
||||||
valves = Functions.get_function_valves_by_id(pipe.id)
|
|
||||||
function_module.valves = function_module.Valves(
|
|
||||||
**(valves if valves else {})
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if function is a manifold
|
# Check if function is a manifold
|
||||||
if hasattr(function_module, "type"):
|
if hasattr(function_module, "pipes"):
|
||||||
if function_module.type == "manifold":
|
manifold_pipes = []
|
||||||
manifold_pipes = []
|
|
||||||
|
|
||||||
# Check if pipes is a function or a list
|
# Check if pipes is a function or a list
|
||||||
if callable(function_module.pipes):
|
if callable(function_module.pipes):
|
||||||
manifold_pipes = function_module.pipes()
|
manifold_pipes = function_module.pipes()
|
||||||
else:
|
else:
|
||||||
manifold_pipes = function_module.pipes
|
manifold_pipes = function_module.pipes
|
||||||
|
|
||||||
for p in manifold_pipes:
|
for p in manifold_pipes:
|
||||||
manifold_pipe_id = f'{pipe.id}.{p["id"]}'
|
manifold_pipe_id = f'{pipe.id}.{p["id"]}'
|
||||||
manifold_pipe_name = p["name"]
|
manifold_pipe_name = p["name"]
|
||||||
|
|
||||||
if hasattr(function_module, "name"):
|
if hasattr(function_module, "name"):
|
||||||
manifold_pipe_name = (
|
manifold_pipe_name = f"{function_module.name}{manifold_pipe_name}"
|
||||||
f"{function_module.name}{manifold_pipe_name}"
|
|
||||||
)
|
|
||||||
|
|
||||||
pipe_flag = {"type": pipe.type}
|
pipe_flag = {"type": pipe.type}
|
||||||
if hasattr(function_module, "ChatValves"):
|
if hasattr(function_module, "ChatValves"):
|
||||||
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
|
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
|
||||||
|
|
||||||
pipe_models.append(
|
pipe_models.append(
|
||||||
{
|
{
|
||||||
"id": manifold_pipe_id,
|
"id": manifold_pipe_id,
|
||||||
"name": manifold_pipe_name,
|
"name": manifold_pipe_name,
|
||||||
"object": "model",
|
"object": "model",
|
||||||
"created": pipe.created_at,
|
"created": pipe.created_at,
|
||||||
"owned_by": "openai",
|
"owned_by": "openai",
|
||||||
"pipe": pipe_flag,
|
"pipe": pipe_flag,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
pipe_flag = {"type": "pipe"}
|
pipe_flag = {"type": "pipe"}
|
||||||
if hasattr(function_module, "ChatValves"):
|
if hasattr(function_module, "ChatValves"):
|
||||||
@@ -198,262 +196,170 @@ async def get_pipe_models():
|
|||||||
return pipe_models
|
return pipe_models
|
||||||
|
|
||||||
|
|
||||||
|
async def execute_pipe(pipe, params):
|
||||||
|
if inspect.iscoroutinefunction(pipe):
|
||||||
|
return await pipe(**params)
|
||||||
|
else:
|
||||||
|
return pipe(**params)
|
||||||
|
|
||||||
|
|
||||||
|
async def get_message_content(res: str | Generator | AsyncGenerator) -> str:
|
||||||
|
if isinstance(res, str):
|
||||||
|
return res
|
||||||
|
if isinstance(res, Generator):
|
||||||
|
return "".join(map(str, res))
|
||||||
|
if isinstance(res, AsyncGenerator):
|
||||||
|
return "".join([str(stream) async for stream in res])
|
||||||
|
|
||||||
|
|
||||||
|
def process_line(form_data: dict, line):
|
||||||
|
if isinstance(line, BaseModel):
|
||||||
|
line = line.model_dump_json()
|
||||||
|
line = f"data: {line}"
|
||||||
|
if isinstance(line, dict):
|
||||||
|
line = f"data: {json.dumps(line)}"
|
||||||
|
|
||||||
|
try:
|
||||||
|
line = line.decode("utf-8")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if line.startswith("data:"):
|
||||||
|
return f"{line}\n\n"
|
||||||
|
else:
|
||||||
|
line = openai_chat_chunk_message_template(form_data["model"], line)
|
||||||
|
return f"data: {json.dumps(line)}\n\n"
|
||||||
|
|
||||||
|
|
||||||
|
def get_pipe_id(form_data: dict) -> str:
|
||||||
|
pipe_id = form_data["model"]
|
||||||
|
if "." in pipe_id:
|
||||||
|
pipe_id, _ = pipe_id.split(".", 1)
|
||||||
|
print(pipe_id)
|
||||||
|
return pipe_id
|
||||||
|
|
||||||
|
|
||||||
|
def get_function_params(function_module, form_data, user, extra_params={}):
|
||||||
|
pipe_id = get_pipe_id(form_data)
|
||||||
|
# Get the signature of the function
|
||||||
|
sig = inspect.signature(function_module.pipe)
|
||||||
|
params = {"body": form_data}
|
||||||
|
|
||||||
|
for key, value in extra_params.items():
|
||||||
|
if key in sig.parameters:
|
||||||
|
params[key] = value
|
||||||
|
|
||||||
|
if "__user__" in sig.parameters:
|
||||||
|
__user__ = {
|
||||||
|
"id": user.id,
|
||||||
|
"email": user.email,
|
||||||
|
"name": user.name,
|
||||||
|
"role": user.role,
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
if hasattr(function_module, "UserValves"):
|
||||||
|
__user__["valves"] = function_module.UserValves(
|
||||||
|
**Functions.get_user_valves_by_id_and_user_id(pipe_id, user.id)
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
params["__user__"] = __user__
|
||||||
|
return params
|
||||||
|
|
||||||
|
|
||||||
async def generate_function_chat_completion(form_data, user):
|
async def generate_function_chat_completion(form_data, user):
|
||||||
model_id = form_data.get("model")
|
model_id = form_data.get("model")
|
||||||
model_info = Models.get_model_by_id(model_id)
|
model_info = Models.get_model_by_id(model_id)
|
||||||
|
metadata = form_data.pop("metadata", None)
|
||||||
metadata = None
|
|
||||||
if "metadata" in form_data:
|
|
||||||
metadata = form_data["metadata"]
|
|
||||||
del form_data["metadata"]
|
|
||||||
|
|
||||||
__event_emitter__ = None
|
__event_emitter__ = None
|
||||||
__event_call__ = None
|
__event_call__ = None
|
||||||
__task__ = None
|
__task__ = None
|
||||||
|
|
||||||
if metadata:
|
if metadata:
|
||||||
if (
|
if all(k in metadata for k in ("session_id", "chat_id", "message_id")):
|
||||||
metadata.get("session_id")
|
__event_emitter__ = get_event_emitter(metadata)
|
||||||
and metadata.get("chat_id")
|
__event_call__ = get_event_call(metadata)
|
||||||
and metadata.get("message_id")
|
__task__ = metadata.get("task", None)
|
||||||
):
|
|
||||||
__event_emitter__ = await get_event_emitter(metadata)
|
|
||||||
__event_call__ = await get_event_call(metadata)
|
|
||||||
|
|
||||||
if metadata.get("task"):
|
|
||||||
__task__ = metadata.get("task")
|
|
||||||
|
|
||||||
if model_info:
|
if model_info:
|
||||||
if model_info.base_model_id:
|
if model_info.base_model_id:
|
||||||
form_data["model"] = model_info.base_model_id
|
form_data["model"] = model_info.base_model_id
|
||||||
|
|
||||||
model_info.params = model_info.params.model_dump()
|
params = model_info.params.model_dump()
|
||||||
|
form_data = apply_model_params_to_body(params, form_data)
|
||||||
|
form_data = apply_model_system_prompt_to_body(params, form_data, user)
|
||||||
|
|
||||||
if model_info.params:
|
pipe_id = get_pipe_id(form_data)
|
||||||
if model_info.params.get("temperature", None) is not None:
|
function_module = get_function_module(pipe_id)
|
||||||
form_data["temperature"] = float(model_info.params.get("temperature"))
|
|
||||||
|
|
||||||
if model_info.params.get("top_p", None):
|
pipe = function_module.pipe
|
||||||
form_data["top_p"] = int(model_info.params.get("top_p", None))
|
params = get_function_params(
|
||||||
|
function_module,
|
||||||
|
form_data,
|
||||||
|
user,
|
||||||
|
{
|
||||||
|
"__event_emitter__": __event_emitter__,
|
||||||
|
"__event_call__": __event_call__,
|
||||||
|
"__task__": __task__,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
if model_info.params.get("max_tokens", None):
|
if form_data["stream"]:
|
||||||
form_data["max_tokens"] = int(model_info.params.get("max_tokens", None))
|
|
||||||
|
|
||||||
if model_info.params.get("frequency_penalty", None):
|
|
||||||
form_data["frequency_penalty"] = int(
|
|
||||||
model_info.params.get("frequency_penalty", None)
|
|
||||||
)
|
|
||||||
|
|
||||||
if model_info.params.get("seed", None):
|
|
||||||
form_data["seed"] = model_info.params.get("seed", None)
|
|
||||||
|
|
||||||
if model_info.params.get("stop", None):
|
|
||||||
form_data["stop"] = (
|
|
||||||
[
|
|
||||||
bytes(stop, "utf-8").decode("unicode_escape")
|
|
||||||
for stop in model_info.params["stop"]
|
|
||||||
]
|
|
||||||
if model_info.params.get("stop", None)
|
|
||||||
else None
|
|
||||||
)
|
|
||||||
|
|
||||||
system = model_info.params.get("system", None)
|
|
||||||
if system:
|
|
||||||
system = prompt_template(
|
|
||||||
system,
|
|
||||||
**(
|
|
||||||
{
|
|
||||||
"user_name": user.name,
|
|
||||||
"user_location": (
|
|
||||||
user.info.get("location") if user.info else None
|
|
||||||
),
|
|
||||||
}
|
|
||||||
if user
|
|
||||||
else {}
|
|
||||||
),
|
|
||||||
)
|
|
||||||
# Check if the payload already has a system message
|
|
||||||
# If not, add a system message to the payload
|
|
||||||
if form_data.get("messages"):
|
|
||||||
for message in form_data["messages"]:
|
|
||||||
if message.get("role") == "system":
|
|
||||||
message["content"] = system + message["content"]
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
form_data["messages"].insert(
|
|
||||||
0,
|
|
||||||
{
|
|
||||||
"role": "system",
|
|
||||||
"content": system,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def job():
|
|
||||||
pipe_id = form_data["model"]
|
|
||||||
if "." in pipe_id:
|
|
||||||
pipe_id, sub_pipe_id = pipe_id.split(".", 1)
|
|
||||||
print(pipe_id)
|
|
||||||
|
|
||||||
# Check if function is already loaded
|
|
||||||
if pipe_id not in app.state.FUNCTIONS:
|
|
||||||
function_module, function_type, frontmatter = load_function_module_by_id(
|
|
||||||
pipe_id
|
|
||||||
)
|
|
||||||
app.state.FUNCTIONS[pipe_id] = function_module
|
|
||||||
else:
|
|
||||||
function_module = app.state.FUNCTIONS[pipe_id]
|
|
||||||
|
|
||||||
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
|
||||||
|
|
||||||
valves = Functions.get_function_valves_by_id(pipe_id)
|
|
||||||
function_module.valves = function_module.Valves(
|
|
||||||
**(valves if valves else {})
|
|
||||||
)
|
|
||||||
|
|
||||||
pipe = function_module.pipe
|
|
||||||
|
|
||||||
# Get the signature of the function
|
|
||||||
sig = inspect.signature(pipe)
|
|
||||||
params = {"body": form_data}
|
|
||||||
|
|
||||||
if "__user__" in sig.parameters:
|
|
||||||
__user__ = {
|
|
||||||
"id": user.id,
|
|
||||||
"email": user.email,
|
|
||||||
"name": user.name,
|
|
||||||
"role": user.role,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
async def stream_content():
|
||||||
try:
|
try:
|
||||||
if hasattr(function_module, "UserValves"):
|
res = await execute_pipe(pipe, params)
|
||||||
__user__["valves"] = function_module.UserValves(
|
|
||||||
**Functions.get_user_valves_by_id_and_user_id(pipe_id, user.id)
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
|
|
||||||
params = {**params, "__user__": __user__}
|
# Directly return if the response is a StreamingResponse
|
||||||
|
if isinstance(res, StreamingResponse):
|
||||||
if "__event_emitter__" in sig.parameters:
|
async for data in res.body_iterator:
|
||||||
params = {**params, "__event_emitter__": __event_emitter__}
|
yield data
|
||||||
|
return
|
||||||
if "__event_call__" in sig.parameters:
|
if isinstance(res, dict):
|
||||||
params = {**params, "__event_call__": __event_call__}
|
yield f"data: {json.dumps(res)}\n\n"
|
||||||
|
|
||||||
if "__task__" in sig.parameters:
|
|
||||||
params = {**params, "__task__": __task__}
|
|
||||||
|
|
||||||
if form_data["stream"]:
|
|
||||||
|
|
||||||
async def stream_content():
|
|
||||||
try:
|
|
||||||
if inspect.iscoroutinefunction(pipe):
|
|
||||||
res = await pipe(**params)
|
|
||||||
else:
|
|
||||||
res = pipe(**params)
|
|
||||||
|
|
||||||
# Directly return if the response is a StreamingResponse
|
|
||||||
if isinstance(res, StreamingResponse):
|
|
||||||
async for data in res.body_iterator:
|
|
||||||
yield data
|
|
||||||
return
|
|
||||||
if isinstance(res, dict):
|
|
||||||
yield f"data: {json.dumps(res)}\n\n"
|
|
||||||
return
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error: {e}")
|
|
||||||
yield f"data: {json.dumps({'error': {'detail':str(e)}})}\n\n"
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if isinstance(res, str):
|
|
||||||
message = stream_message_template(form_data["model"], res)
|
|
||||||
yield f"data: {json.dumps(message)}\n\n"
|
|
||||||
|
|
||||||
if isinstance(res, Iterator):
|
|
||||||
for line in res:
|
|
||||||
if isinstance(line, BaseModel):
|
|
||||||
line = line.model_dump_json()
|
|
||||||
line = f"data: {line}"
|
|
||||||
if isinstance(line, dict):
|
|
||||||
line = f"data: {json.dumps(line)}"
|
|
||||||
|
|
||||||
try:
|
|
||||||
line = line.decode("utf-8")
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if line.startswith("data:"):
|
|
||||||
yield f"{line}\n\n"
|
|
||||||
else:
|
|
||||||
line = stream_message_template(form_data["model"], line)
|
|
||||||
yield f"data: {json.dumps(line)}\n\n"
|
|
||||||
|
|
||||||
if isinstance(res, str) or isinstance(res, Generator):
|
|
||||||
finish_message = {
|
|
||||||
"id": f"{form_data['model']}-{str(uuid.uuid4())}",
|
|
||||||
"object": "chat.completion.chunk",
|
|
||||||
"created": int(time.time()),
|
|
||||||
"model": form_data["model"],
|
|
||||||
"choices": [
|
|
||||||
{
|
|
||||||
"index": 0,
|
|
||||||
"delta": {},
|
|
||||||
"logprobs": None,
|
|
||||||
"finish_reason": "stop",
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
yield f"data: {json.dumps(finish_message)}\n\n"
|
|
||||||
yield f"data: [DONE]"
|
|
||||||
|
|
||||||
return StreamingResponse(stream_content(), media_type="text/event-stream")
|
|
||||||
else:
|
|
||||||
|
|
||||||
try:
|
|
||||||
if inspect.iscoroutinefunction(pipe):
|
|
||||||
res = await pipe(**params)
|
|
||||||
else:
|
|
||||||
res = pipe(**params)
|
|
||||||
|
|
||||||
if isinstance(res, StreamingResponse):
|
|
||||||
return res
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error: {e}")
|
print(f"Error: {e}")
|
||||||
return {"error": {"detail": str(e)}}
|
yield f"data: {json.dumps({'error': {'detail':str(e)}})}\n\n"
|
||||||
|
return
|
||||||
|
|
||||||
if isinstance(res, dict):
|
if isinstance(res, str):
|
||||||
return res
|
message = openai_chat_chunk_message_template(form_data["model"], res)
|
||||||
elif isinstance(res, BaseModel):
|
yield f"data: {json.dumps(message)}\n\n"
|
||||||
return res.model_dump()
|
|
||||||
else:
|
|
||||||
message = ""
|
|
||||||
if isinstance(res, str):
|
|
||||||
message = res
|
|
||||||
if isinstance(res, Generator):
|
|
||||||
for stream in res:
|
|
||||||
message = f"{message}{stream}"
|
|
||||||
|
|
||||||
return {
|
if isinstance(res, Iterator):
|
||||||
"id": f"{form_data['model']}-{str(uuid.uuid4())}",
|
for line in res:
|
||||||
"object": "chat.completion",
|
yield process_line(form_data, line)
|
||||||
"created": int(time.time()),
|
|
||||||
"model": form_data["model"],
|
|
||||||
"choices": [
|
|
||||||
{
|
|
||||||
"index": 0,
|
|
||||||
"message": {
|
|
||||||
"role": "assistant",
|
|
||||||
"content": message,
|
|
||||||
},
|
|
||||||
"logprobs": None,
|
|
||||||
"finish_reason": "stop",
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
return await job()
|
if isinstance(res, AsyncGenerator):
|
||||||
|
async for line in res:
|
||||||
|
yield process_line(form_data, line)
|
||||||
|
|
||||||
|
if isinstance(res, str) or isinstance(res, Generator):
|
||||||
|
finish_message = openai_chat_chunk_message_template(
|
||||||
|
form_data["model"], ""
|
||||||
|
)
|
||||||
|
finish_message["choices"][0]["finish_reason"] = "stop"
|
||||||
|
yield f"data: {json.dumps(finish_message)}\n\n"
|
||||||
|
yield "data: [DONE]"
|
||||||
|
|
||||||
|
return StreamingResponse(stream_content(), media_type="text/event-stream")
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
res = await execute_pipe(pipe, params)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
return {"error": {"detail": str(e)}}
|
||||||
|
|
||||||
|
if isinstance(res, StreamingResponse) or isinstance(res, dict):
|
||||||
|
return res
|
||||||
|
if isinstance(res, BaseModel):
|
||||||
|
return res.model_dump()
|
||||||
|
|
||||||
|
message = await get_message_content(res)
|
||||||
|
return openai_chat_completion_message_template(form_data["model"], message)
|
||||||
|
|||||||
@@ -245,6 +245,39 @@ class ChatTable:
|
|||||||
)
|
)
|
||||||
return [ChatModel.model_validate(chat) for chat in all_chats]
|
return [ChatModel.model_validate(chat) for chat in all_chats]
|
||||||
|
|
||||||
|
def get_chat_title_id_list_by_user_id(
|
||||||
|
self,
|
||||||
|
user_id: str,
|
||||||
|
include_archived: bool = False,
|
||||||
|
skip: int = 0,
|
||||||
|
limit: int = -1,
|
||||||
|
) -> List[ChatTitleIdResponse]:
|
||||||
|
with get_db() as db:
|
||||||
|
query = db.query(Chat).filter_by(user_id=user_id)
|
||||||
|
if not include_archived:
|
||||||
|
query = query.filter_by(archived=False)
|
||||||
|
|
||||||
|
all_chats = (
|
||||||
|
query.order_by(Chat.updated_at.desc())
|
||||||
|
# limit cols
|
||||||
|
.with_entities(Chat.id, Chat.title, Chat.updated_at, Chat.created_at)
|
||||||
|
.limit(limit)
|
||||||
|
.offset(skip)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
# result has to be destrctured from sqlalchemy `row` and mapped to a dict since the `ChatModel`is not the returned dataclass.
|
||||||
|
return [
|
||||||
|
ChatTitleIdResponse.model_validate(
|
||||||
|
{
|
||||||
|
"id": chat[0],
|
||||||
|
"title": chat[1],
|
||||||
|
"updated_at": chat[2],
|
||||||
|
"created_at": chat[3],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
for chat in all_chats
|
||||||
|
]
|
||||||
|
|
||||||
def get_chat_list_by_chat_ids(
|
def get_chat_list_by_chat_ids(
|
||||||
self, chat_ids: List[str], skip: int = 0, limit: int = 50
|
self, chat_ids: List[str], skip: int = 0, limit: int = 50
|
||||||
) -> List[ChatModel]:
|
) -> List[ChatModel]:
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
import json
|
|
||||||
import logging
|
import logging
|
||||||
from typing import Optional
|
from typing import Optional, List
|
||||||
|
|
||||||
from pydantic import BaseModel, ConfigDict
|
from pydantic import BaseModel, ConfigDict
|
||||||
from sqlalchemy import String, Column, BigInteger, Text
|
from sqlalchemy import Column, BigInteger, Text
|
||||||
|
|
||||||
from apps.webui.internal.db import Base, JSONField, get_db
|
from apps.webui.internal.db import Base, JSONField, get_db
|
||||||
|
|
||||||
from typing import List, Union, Optional
|
|
||||||
from config import SRC_LOG_LEVELS
|
from config import SRC_LOG_LEVELS
|
||||||
|
|
||||||
import time
|
import time
|
||||||
@@ -113,7 +111,6 @@ class ModelForm(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class ModelsTable:
|
class ModelsTable:
|
||||||
|
|
||||||
def insert_new_model(
|
def insert_new_model(
|
||||||
self, form_data: ModelForm, user_id: str
|
self, form_data: ModelForm, user_id: str
|
||||||
) -> Optional[ModelModel]:
|
) -> Optional[ModelModel]:
|
||||||
@@ -126,9 +123,7 @@ class ModelsTable:
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
|
|
||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
|
|
||||||
result = Model(**model.model_dump())
|
result = Model(**model.model_dump())
|
||||||
db.add(result)
|
db.add(result)
|
||||||
db.commit()
|
db.commit()
|
||||||
@@ -144,13 +139,11 @@ class ModelsTable:
|
|||||||
|
|
||||||
def get_all_models(self) -> List[ModelModel]:
|
def get_all_models(self) -> List[ModelModel]:
|
||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
|
|
||||||
return [ModelModel.model_validate(model) for model in db.query(Model).all()]
|
return [ModelModel.model_validate(model) for model in db.query(Model).all()]
|
||||||
|
|
||||||
def get_model_by_id(self, id: str) -> Optional[ModelModel]:
|
def get_model_by_id(self, id: str) -> Optional[ModelModel]:
|
||||||
try:
|
try:
|
||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
|
|
||||||
model = db.get(Model, id)
|
model = db.get(Model, id)
|
||||||
return ModelModel.model_validate(model)
|
return ModelModel.model_validate(model)
|
||||||
except:
|
except:
|
||||||
@@ -178,7 +171,6 @@ class ModelsTable:
|
|||||||
def delete_model_by_id(self, id: str) -> bool:
|
def delete_model_by_id(self, id: str) -> bool:
|
||||||
try:
|
try:
|
||||||
with get_db() as db:
|
with get_db() as db:
|
||||||
|
|
||||||
db.query(Model).filter_by(id=id).delete()
|
db.query(Model).filter_by(id=id).delete()
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from apps.webui.models.tags import (
|
|||||||
|
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
|
|
||||||
from config import SRC_LOG_LEVELS, ENABLE_ADMIN_EXPORT
|
from config import SRC_LOG_LEVELS, ENABLE_ADMIN_EXPORT, ENABLE_ADMIN_CHAT_ACCESS
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
log.setLevel(SRC_LOG_LEVELS["MODELS"])
|
log.setLevel(SRC_LOG_LEVELS["MODELS"])
|
||||||
@@ -43,9 +43,15 @@ router = APIRouter()
|
|||||||
@router.get("/", response_model=List[ChatTitleIdResponse])
|
@router.get("/", response_model=List[ChatTitleIdResponse])
|
||||||
@router.get("/list", response_model=List[ChatTitleIdResponse])
|
@router.get("/list", response_model=List[ChatTitleIdResponse])
|
||||||
async def get_session_user_chat_list(
|
async def get_session_user_chat_list(
|
||||||
user=Depends(get_verified_user), skip: int = 0, limit: int = 50
|
user=Depends(get_verified_user), page: Optional[int] = None
|
||||||
):
|
):
|
||||||
return Chats.get_chat_list_by_user_id(user.id, skip, limit)
|
if page is not None:
|
||||||
|
limit = 60
|
||||||
|
skip = (page - 1) * limit
|
||||||
|
|
||||||
|
return Chats.get_chat_title_id_list_by_user_id(user.id, skip=skip, limit=limit)
|
||||||
|
else:
|
||||||
|
return Chats.get_chat_title_id_list_by_user_id(user.id)
|
||||||
|
|
||||||
|
|
||||||
############################
|
############################
|
||||||
@@ -81,6 +87,11 @@ async def get_user_chat_list_by_user_id(
|
|||||||
skip: int = 0,
|
skip: int = 0,
|
||||||
limit: int = 50,
|
limit: int = 50,
|
||||||
):
|
):
|
||||||
|
if not ENABLE_ADMIN_CHAT_ACCESS:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||||
|
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
|
||||||
|
)
|
||||||
return Chats.get_chat_list_by_user_id(
|
return Chats.get_chat_list_by_user_id(
|
||||||
user_id, include_archived=True, skip=skip, limit=limit
|
user_id, include_archived=True, skip=skip, limit=limit
|
||||||
)
|
)
|
||||||
@@ -181,9 +192,9 @@ async def get_shared_chat_by_id(share_id: str, user=Depends(get_verified_user)):
|
|||||||
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
|
status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND
|
||||||
)
|
)
|
||||||
|
|
||||||
if user.role == "user":
|
if user.role == "user" or (user.role == "admin" and not ENABLE_ADMIN_CHAT_ACCESS):
|
||||||
chat = Chats.get_chat_by_share_id(share_id)
|
chat = Chats.get_chat_by_share_id(share_id)
|
||||||
elif user.role == "admin":
|
elif user.role == "admin" and ENABLE_ADMIN_CHAT_ACCESS:
|
||||||
chat = Chats.get_chat_by_id(share_id)
|
chat = Chats.get_chat_by_id(share_id)
|
||||||
|
|
||||||
if chat:
|
if chat:
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
from fastapi import Depends, FastAPI, HTTPException, status, Request
|
from fastapi import Depends, HTTPException, status, Request
|
||||||
from datetime import datetime, timedelta
|
from typing import List, Optional
|
||||||
from typing import List, Union, Optional
|
|
||||||
|
|
||||||
from fastapi import APIRouter
|
from fastapi import APIRouter
|
||||||
from pydantic import BaseModel
|
|
||||||
import json
|
|
||||||
|
|
||||||
from apps.webui.models.users import Users
|
|
||||||
from apps.webui.models.tools import Tools, ToolForm, ToolModel, ToolResponse
|
from apps.webui.models.tools import Tools, ToolForm, ToolModel, ToolResponse
|
||||||
from apps.webui.utils import load_toolkit_module_by_id
|
from apps.webui.utils import load_toolkit_module_by_id
|
||||||
|
|
||||||
@@ -14,7 +10,6 @@ from utils.utils import get_admin_user, get_verified_user
|
|||||||
from utils.tools import get_tools_specs
|
from utils.tools import get_tools_specs
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
|
|
||||||
from importlib import util
|
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
@@ -69,7 +64,7 @@ async def create_new_toolkit(
|
|||||||
form_data.id = form_data.id.lower()
|
form_data.id = form_data.id.lower()
|
||||||
|
|
||||||
toolkit = Tools.get_tool_by_id(form_data.id)
|
toolkit = Tools.get_tool_by_id(form_data.id)
|
||||||
if toolkit == None:
|
if toolkit is None:
|
||||||
toolkit_path = os.path.join(TOOLS_DIR, f"{form_data.id}.py")
|
toolkit_path = os.path.join(TOOLS_DIR, f"{form_data.id}.py")
|
||||||
try:
|
try:
|
||||||
with open(toolkit_path, "w") as tool_file:
|
with open(toolkit_path, "w") as tool_file:
|
||||||
@@ -98,7 +93,7 @@ async def create_new_toolkit(
|
|||||||
print(e)
|
print(e)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(str(e)),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -170,7 +165,7 @@ async def update_toolkit_by_id(
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(str(e)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -210,7 +205,7 @@ async def get_toolkit_valves_by_id(id: str, user=Depends(get_admin_user)):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(str(e)),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -233,7 +228,7 @@ async def get_toolkit_valves_spec_by_id(
|
|||||||
if id in request.app.state.TOOLS:
|
if id in request.app.state.TOOLS:
|
||||||
toolkit_module = request.app.state.TOOLS[id]
|
toolkit_module = request.app.state.TOOLS[id]
|
||||||
else:
|
else:
|
||||||
toolkit_module, frontmatter = load_toolkit_module_by_id(id)
|
toolkit_module, _ = load_toolkit_module_by_id(id)
|
||||||
request.app.state.TOOLS[id] = toolkit_module
|
request.app.state.TOOLS[id] = toolkit_module
|
||||||
|
|
||||||
if hasattr(toolkit_module, "Valves"):
|
if hasattr(toolkit_module, "Valves"):
|
||||||
@@ -261,7 +256,7 @@ async def update_toolkit_valves_by_id(
|
|||||||
if id in request.app.state.TOOLS:
|
if id in request.app.state.TOOLS:
|
||||||
toolkit_module = request.app.state.TOOLS[id]
|
toolkit_module = request.app.state.TOOLS[id]
|
||||||
else:
|
else:
|
||||||
toolkit_module, frontmatter = load_toolkit_module_by_id(id)
|
toolkit_module, _ = load_toolkit_module_by_id(id)
|
||||||
request.app.state.TOOLS[id] = toolkit_module
|
request.app.state.TOOLS[id] = toolkit_module
|
||||||
|
|
||||||
if hasattr(toolkit_module, "Valves"):
|
if hasattr(toolkit_module, "Valves"):
|
||||||
@@ -276,7 +271,7 @@ async def update_toolkit_valves_by_id(
|
|||||||
print(e)
|
print(e)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(str(e)),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -306,7 +301,7 @@ async def get_toolkit_user_valves_by_id(id: str, user=Depends(get_verified_user)
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(str(e)),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -324,7 +319,7 @@ async def get_toolkit_user_valves_spec_by_id(
|
|||||||
if id in request.app.state.TOOLS:
|
if id in request.app.state.TOOLS:
|
||||||
toolkit_module = request.app.state.TOOLS[id]
|
toolkit_module = request.app.state.TOOLS[id]
|
||||||
else:
|
else:
|
||||||
toolkit_module, frontmatter = load_toolkit_module_by_id(id)
|
toolkit_module, _ = load_toolkit_module_by_id(id)
|
||||||
request.app.state.TOOLS[id] = toolkit_module
|
request.app.state.TOOLS[id] = toolkit_module
|
||||||
|
|
||||||
if hasattr(toolkit_module, "UserValves"):
|
if hasattr(toolkit_module, "UserValves"):
|
||||||
@@ -348,7 +343,7 @@ async def update_toolkit_user_valves_by_id(
|
|||||||
if id in request.app.state.TOOLS:
|
if id in request.app.state.TOOLS:
|
||||||
toolkit_module = request.app.state.TOOLS[id]
|
toolkit_module = request.app.state.TOOLS[id]
|
||||||
else:
|
else:
|
||||||
toolkit_module, frontmatter = load_toolkit_module_by_id(id)
|
toolkit_module, _ = load_toolkit_module_by_id(id)
|
||||||
request.app.state.TOOLS[id] = toolkit_module
|
request.app.state.TOOLS[id] = toolkit_module
|
||||||
|
|
||||||
if hasattr(toolkit_module, "UserValves"):
|
if hasattr(toolkit_module, "UserValves"):
|
||||||
@@ -365,7 +360,7 @@ async def update_toolkit_user_valves_by_id(
|
|||||||
print(e)
|
print(e)
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
detail=ERROR_MESSAGES.DEFAULT(str(e)),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
import site
|
||||||
|
|
||||||
from fastapi import APIRouter, UploadFile, File, Response
|
from fastapi import APIRouter, UploadFile, File, Response
|
||||||
from fastapi import Depends, HTTPException, status
|
from fastapi import Depends, HTTPException, status
|
||||||
from starlette.responses import StreamingResponse, FileResponse
|
from starlette.responses import StreamingResponse, FileResponse
|
||||||
@@ -64,8 +67,18 @@ async def download_chat_as_pdf(
|
|||||||
pdf = FPDF()
|
pdf = FPDF()
|
||||||
pdf.add_page()
|
pdf.add_page()
|
||||||
|
|
||||||
STATIC_DIR = "./static"
|
# When running in docker, workdir is /app/backend, so fonts is in /app/backend/static/fonts
|
||||||
FONTS_DIR = f"{STATIC_DIR}/fonts"
|
FONTS_DIR = Path("./static/fonts")
|
||||||
|
|
||||||
|
# Non Docker Installation
|
||||||
|
|
||||||
|
# When running using `pip install` the static directory is in the site packages.
|
||||||
|
if not FONTS_DIR.exists():
|
||||||
|
FONTS_DIR = Path(site.getsitepackages()[0]) / "static/fonts"
|
||||||
|
# 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")
|
||||||
|
|
||||||
pdf.add_font("NotoSans", "", f"{FONTS_DIR}/NotoSans-Regular.ttf")
|
pdf.add_font("NotoSans", "", f"{FONTS_DIR}/NotoSans-Regular.ttf")
|
||||||
pdf.add_font("NotoSans", "b", f"{FONTS_DIR}/NotoSans-Bold.ttf")
|
pdf.add_font("NotoSans", "b", f"{FONTS_DIR}/NotoSans-Bold.ttf")
|
||||||
|
|||||||
@@ -77,6 +77,16 @@ for source in log_sources:
|
|||||||
|
|
||||||
log.setLevel(SRC_LOG_LEVELS["CONFIG"])
|
log.setLevel(SRC_LOG_LEVELS["CONFIG"])
|
||||||
|
|
||||||
|
|
||||||
|
class EndpointFilter(logging.Filter):
|
||||||
|
def filter(self, record: logging.LogRecord) -> bool:
|
||||||
|
return record.getMessage().find("/health") == -1
|
||||||
|
|
||||||
|
|
||||||
|
# Filter out /endpoint
|
||||||
|
logging.getLogger("uvicorn.access").addFilter(EndpointFilter())
|
||||||
|
|
||||||
|
|
||||||
WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
|
WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
|
||||||
if WEBUI_NAME != "Open WebUI":
|
if WEBUI_NAME != "Open WebUI":
|
||||||
WEBUI_NAME += " (Open WebUI)"
|
WEBUI_NAME += " (Open WebUI)"
|
||||||
@@ -339,6 +349,12 @@ GOOGLE_OAUTH_SCOPE = PersistentConfig(
|
|||||||
os.environ.get("GOOGLE_OAUTH_SCOPE", "openid email profile"),
|
os.environ.get("GOOGLE_OAUTH_SCOPE", "openid email profile"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
GOOGLE_REDIRECT_URI = PersistentConfig(
|
||||||
|
"GOOGLE_REDIRECT_URI",
|
||||||
|
"oauth.google.redirect_uri",
|
||||||
|
os.environ.get("GOOGLE_REDIRECT_URI", ""),
|
||||||
|
)
|
||||||
|
|
||||||
MICROSOFT_CLIENT_ID = PersistentConfig(
|
MICROSOFT_CLIENT_ID = PersistentConfig(
|
||||||
"MICROSOFT_CLIENT_ID",
|
"MICROSOFT_CLIENT_ID",
|
||||||
"oauth.microsoft.client_id",
|
"oauth.microsoft.client_id",
|
||||||
@@ -363,6 +379,12 @@ MICROSOFT_OAUTH_SCOPE = PersistentConfig(
|
|||||||
os.environ.get("MICROSOFT_OAUTH_SCOPE", "openid email profile"),
|
os.environ.get("MICROSOFT_OAUTH_SCOPE", "openid email profile"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
MICROSOFT_REDIRECT_URI = PersistentConfig(
|
||||||
|
"MICROSOFT_REDIRECT_URI",
|
||||||
|
"oauth.microsoft.redirect_uri",
|
||||||
|
os.environ.get("MICROSOFT_REDIRECT_URI", ""),
|
||||||
|
)
|
||||||
|
|
||||||
OAUTH_CLIENT_ID = PersistentConfig(
|
OAUTH_CLIENT_ID = PersistentConfig(
|
||||||
"OAUTH_CLIENT_ID",
|
"OAUTH_CLIENT_ID",
|
||||||
"oauth.oidc.client_id",
|
"oauth.oidc.client_id",
|
||||||
@@ -381,6 +403,12 @@ OPENID_PROVIDER_URL = PersistentConfig(
|
|||||||
os.environ.get("OPENID_PROVIDER_URL", ""),
|
os.environ.get("OPENID_PROVIDER_URL", ""),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
OPENID_REDIRECT_URI = PersistentConfig(
|
||||||
|
"OPENID_REDIRECT_URI",
|
||||||
|
"oauth.oidc.redirect_uri",
|
||||||
|
os.environ.get("OPENID_REDIRECT_URI", ""),
|
||||||
|
)
|
||||||
|
|
||||||
OAUTH_SCOPES = PersistentConfig(
|
OAUTH_SCOPES = PersistentConfig(
|
||||||
"OAUTH_SCOPES",
|
"OAUTH_SCOPES",
|
||||||
"oauth.oidc.scopes",
|
"oauth.oidc.scopes",
|
||||||
@@ -414,6 +442,7 @@ def load_oauth_providers():
|
|||||||
"client_secret": GOOGLE_CLIENT_SECRET.value,
|
"client_secret": GOOGLE_CLIENT_SECRET.value,
|
||||||
"server_metadata_url": "https://accounts.google.com/.well-known/openid-configuration",
|
"server_metadata_url": "https://accounts.google.com/.well-known/openid-configuration",
|
||||||
"scope": GOOGLE_OAUTH_SCOPE.value,
|
"scope": GOOGLE_OAUTH_SCOPE.value,
|
||||||
|
"redirect_uri": GOOGLE_REDIRECT_URI.value,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -426,6 +455,7 @@ def load_oauth_providers():
|
|||||||
"client_secret": MICROSOFT_CLIENT_SECRET.value,
|
"client_secret": MICROSOFT_CLIENT_SECRET.value,
|
||||||
"server_metadata_url": f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration",
|
"server_metadata_url": f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration",
|
||||||
"scope": MICROSOFT_OAUTH_SCOPE.value,
|
"scope": MICROSOFT_OAUTH_SCOPE.value,
|
||||||
|
"redirect_uri": MICROSOFT_REDIRECT_URI.value,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -439,6 +469,7 @@ def load_oauth_providers():
|
|||||||
"server_metadata_url": OPENID_PROVIDER_URL.value,
|
"server_metadata_url": OPENID_PROVIDER_URL.value,
|
||||||
"scope": OAUTH_SCOPES.value,
|
"scope": OAUTH_SCOPES.value,
|
||||||
"name": OAUTH_PROVIDER_NAME.value,
|
"name": OAUTH_PROVIDER_NAME.value,
|
||||||
|
"redirect_uri": OPENID_REDIRECT_URI.value,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -709,6 +740,12 @@ ENABLE_SIGNUP = PersistentConfig(
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ENABLE_LOGIN_FORM = PersistentConfig(
|
||||||
|
"ENABLE_LOGIN_FORM",
|
||||||
|
"ui.ENABLE_LOGIN_FORM",
|
||||||
|
os.environ.get("ENABLE_LOGIN_FORM", "True").lower() == "true",
|
||||||
|
)
|
||||||
|
|
||||||
DEFAULT_LOCALE = PersistentConfig(
|
DEFAULT_LOCALE = PersistentConfig(
|
||||||
"DEFAULT_LOCALE",
|
"DEFAULT_LOCALE",
|
||||||
"ui.default_locale",
|
"ui.default_locale",
|
||||||
@@ -787,6 +824,10 @@ WEBHOOK_URL = PersistentConfig(
|
|||||||
|
|
||||||
ENABLE_ADMIN_EXPORT = os.environ.get("ENABLE_ADMIN_EXPORT", "True").lower() == "true"
|
ENABLE_ADMIN_EXPORT = os.environ.get("ENABLE_ADMIN_EXPORT", "True").lower() == "true"
|
||||||
|
|
||||||
|
ENABLE_ADMIN_CHAT_ACCESS = (
|
||||||
|
os.environ.get("ENABLE_ADMIN_CHAT_ACCESS", "True").lower() == "true"
|
||||||
|
)
|
||||||
|
|
||||||
ENABLE_COMMUNITY_SHARING = PersistentConfig(
|
ENABLE_COMMUNITY_SHARING = PersistentConfig(
|
||||||
"ENABLE_COMMUNITY_SHARING",
|
"ENABLE_COMMUNITY_SHARING",
|
||||||
"ui.enable_community_sharing",
|
"ui.enable_community_sharing",
|
||||||
@@ -1265,6 +1306,24 @@ COMFYUI_SD3 = PersistentConfig(
|
|||||||
os.environ.get("COMFYUI_SD3", "").lower() == "true",
|
os.environ.get("COMFYUI_SD3", "").lower() == "true",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
COMFYUI_FLUX = PersistentConfig(
|
||||||
|
"COMFYUI_FLUX",
|
||||||
|
"image_generation.comfyui.flux",
|
||||||
|
os.environ.get("COMFYUI_FLUX", "").lower() == "true",
|
||||||
|
)
|
||||||
|
|
||||||
|
COMFYUI_FLUX_WEIGHT_DTYPE = PersistentConfig(
|
||||||
|
"COMFYUI_FLUX_WEIGHT_DTYPE",
|
||||||
|
"image_generation.comfyui.flux_weight_dtype",
|
||||||
|
os.getenv("COMFYUI_FLUX_WEIGHT_DTYPE", ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
COMFYUI_FLUX_FP8_CLIP = PersistentConfig(
|
||||||
|
"COMFYUI_FLUX_FP8_CLIP",
|
||||||
|
"image_generation.comfyui.flux_fp8_clip",
|
||||||
|
os.environ.get("COMFYUI_FLUX_FP8_CLIP", "").lower() == "true",
|
||||||
|
)
|
||||||
|
|
||||||
IMAGES_OPENAI_API_BASE_URL = PersistentConfig(
|
IMAGES_OPENAI_API_BASE_URL = PersistentConfig(
|
||||||
"IMAGES_OPENAI_API_BASE_URL",
|
"IMAGES_OPENAI_API_BASE_URL",
|
||||||
"image_generation.openai.api_base_url",
|
"image_generation.openai.api_base_url",
|
||||||
@@ -1329,6 +1388,11 @@ AUDIO_TTS_OPENAI_API_KEY = PersistentConfig(
|
|||||||
os.getenv("AUDIO_TTS_OPENAI_API_KEY", OPENAI_API_KEY),
|
os.getenv("AUDIO_TTS_OPENAI_API_KEY", OPENAI_API_KEY),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AUDIO_TTS_API_KEY = PersistentConfig(
|
||||||
|
"AUDIO_TTS_API_KEY",
|
||||||
|
"audio.tts.api_key",
|
||||||
|
os.getenv("AUDIO_TTS_API_KEY", ""),
|
||||||
|
)
|
||||||
|
|
||||||
AUDIO_TTS_ENGINE = PersistentConfig(
|
AUDIO_TTS_ENGINE = PersistentConfig(
|
||||||
"AUDIO_TTS_ENGINE",
|
"AUDIO_TTS_ENGINE",
|
||||||
|
|||||||
+111
-108
@@ -13,8 +13,6 @@ import aiohttp
|
|||||||
import requests
|
import requests
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import shutil
|
import shutil
|
||||||
import os
|
|
||||||
import uuid
|
|
||||||
import inspect
|
import inspect
|
||||||
|
|
||||||
from fastapi import FastAPI, Request, Depends, status, UploadFile, File, Form
|
from fastapi import FastAPI, Request, Depends, status, UploadFile, File, Form
|
||||||
@@ -29,7 +27,7 @@ from starlette.middleware.sessions import SessionMiddleware
|
|||||||
from starlette.responses import StreamingResponse, Response, RedirectResponse
|
from starlette.responses import StreamingResponse, Response, RedirectResponse
|
||||||
|
|
||||||
|
|
||||||
from apps.socket.main import sio, app as socket_app, get_event_emitter, get_event_call
|
from apps.socket.main import app as socket_app, get_event_emitter, get_event_call
|
||||||
from apps.ollama.main import (
|
from apps.ollama.main import (
|
||||||
app as ollama_app,
|
app as ollama_app,
|
||||||
get_all_models as get_ollama_models,
|
get_all_models as get_ollama_models,
|
||||||
@@ -79,6 +77,7 @@ from utils.task import (
|
|||||||
from utils.misc import (
|
from utils.misc import (
|
||||||
get_last_user_message,
|
get_last_user_message,
|
||||||
add_or_update_system_message,
|
add_or_update_system_message,
|
||||||
|
prepend_to_first_user_message_content,
|
||||||
parse_duration,
|
parse_duration,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -117,6 +116,7 @@ from config import (
|
|||||||
WEBUI_SECRET_KEY,
|
WEBUI_SECRET_KEY,
|
||||||
WEBUI_SESSION_COOKIE_SAME_SITE,
|
WEBUI_SESSION_COOKIE_SAME_SITE,
|
||||||
WEBUI_SESSION_COOKIE_SECURE,
|
WEBUI_SESSION_COOKIE_SECURE,
|
||||||
|
ENABLE_ADMIN_CHAT_ACCESS,
|
||||||
AppConfig,
|
AppConfig,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -618,32 +618,15 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
|||||||
content={"detail": str(e)},
|
content={"detail": str(e)},
|
||||||
)
|
)
|
||||||
|
|
||||||
# Extract valves from the request body
|
metadata = {
|
||||||
valves = None
|
"chat_id": body.pop("chat_id", None),
|
||||||
if "valves" in body:
|
"message_id": body.pop("id", None),
|
||||||
valves = body["valves"]
|
"session_id": body.pop("session_id", None),
|
||||||
del body["valves"]
|
"valves": body.pop("valves", None),
|
||||||
|
}
|
||||||
|
|
||||||
# Extract session_id, chat_id and message_id from the request body
|
__event_emitter__ = get_event_emitter(metadata)
|
||||||
session_id = None
|
__event_call__ = get_event_call(metadata)
|
||||||
if "session_id" in body:
|
|
||||||
session_id = body["session_id"]
|
|
||||||
del body["session_id"]
|
|
||||||
chat_id = None
|
|
||||||
if "chat_id" in body:
|
|
||||||
chat_id = body["chat_id"]
|
|
||||||
del body["chat_id"]
|
|
||||||
message_id = None
|
|
||||||
if "id" in body:
|
|
||||||
message_id = body["id"]
|
|
||||||
del body["id"]
|
|
||||||
|
|
||||||
__event_emitter__ = await get_event_emitter(
|
|
||||||
{"chat_id": chat_id, "message_id": message_id, "session_id": session_id}
|
|
||||||
)
|
|
||||||
__event_call__ = await get_event_call(
|
|
||||||
{"chat_id": chat_id, "message_id": message_id, "session_id": session_id}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Initialize data_items to store additional data to be sent to the client
|
# Initialize data_items to store additional data to be sent to the client
|
||||||
data_items = []
|
data_items = []
|
||||||
@@ -686,24 +669,29 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
|||||||
if len(contexts) > 0:
|
if len(contexts) > 0:
|
||||||
context_string = "/n".join(contexts).strip()
|
context_string = "/n".join(contexts).strip()
|
||||||
prompt = get_last_user_message(body["messages"])
|
prompt = get_last_user_message(body["messages"])
|
||||||
body["messages"] = add_or_update_system_message(
|
|
||||||
rag_template(
|
# Workaround for Ollama 2.0+ system prompt issue
|
||||||
rag_app.state.config.RAG_TEMPLATE, context_string, prompt
|
# TODO: replace with add_or_update_system_message
|
||||||
),
|
if model["owned_by"] == "ollama":
|
||||||
body["messages"],
|
body["messages"] = prepend_to_first_user_message_content(
|
||||||
)
|
rag_template(
|
||||||
|
rag_app.state.config.RAG_TEMPLATE, context_string, prompt
|
||||||
|
),
|
||||||
|
body["messages"],
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
body["messages"] = add_or_update_system_message(
|
||||||
|
rag_template(
|
||||||
|
rag_app.state.config.RAG_TEMPLATE, context_string, prompt
|
||||||
|
),
|
||||||
|
body["messages"],
|
||||||
|
)
|
||||||
|
|
||||||
# If there are citations, add them to the data_items
|
# If there are citations, add them to the data_items
|
||||||
if len(citations) > 0:
|
if len(citations) > 0:
|
||||||
data_items.append({"citations": citations})
|
data_items.append({"citations": citations})
|
||||||
|
|
||||||
body["metadata"] = {
|
body["metadata"] = metadata
|
||||||
"session_id": session_id,
|
|
||||||
"chat_id": chat_id,
|
|
||||||
"message_id": message_id,
|
|
||||||
"valves": valves,
|
|
||||||
}
|
|
||||||
|
|
||||||
modified_body_bytes = json.dumps(body).encode("utf-8")
|
modified_body_bytes = json.dumps(body).encode("utf-8")
|
||||||
# Replace the request body with the modified one
|
# Replace the request body with the modified one
|
||||||
request._body = modified_body_bytes
|
request._body = modified_body_bytes
|
||||||
@@ -970,7 +958,7 @@ async def get_all_models():
|
|||||||
|
|
||||||
custom_models = Models.get_all_models()
|
custom_models = Models.get_all_models()
|
||||||
for custom_model in custom_models:
|
for custom_model in custom_models:
|
||||||
if custom_model.base_model_id == None:
|
if custom_model.base_model_id is None:
|
||||||
for model in models:
|
for model in models:
|
||||||
if (
|
if (
|
||||||
custom_model.id == model["id"]
|
custom_model.id == model["id"]
|
||||||
@@ -979,32 +967,15 @@ async def get_all_models():
|
|||||||
model["name"] = custom_model.name
|
model["name"] = custom_model.name
|
||||||
model["info"] = custom_model.model_dump()
|
model["info"] = custom_model.model_dump()
|
||||||
|
|
||||||
action_ids = [] + global_action_ids
|
action_ids = []
|
||||||
if "info" in model and "meta" in model["info"]:
|
if "info" in model and "meta" in model["info"]:
|
||||||
action_ids.extend(model["info"]["meta"].get("actionIds", []))
|
action_ids.extend(model["info"]["meta"].get("actionIds", []))
|
||||||
action_ids = list(set(action_ids))
|
|
||||||
action_ids = [
|
|
||||||
action_id
|
|
||||||
for action_id in action_ids
|
|
||||||
if action_id in enabled_action_ids
|
|
||||||
]
|
|
||||||
|
|
||||||
model["actions"] = []
|
|
||||||
for action_id in action_ids:
|
|
||||||
action = Functions.get_function_by_id(action_id)
|
|
||||||
model["actions"].append(
|
|
||||||
{
|
|
||||||
"id": action_id,
|
|
||||||
"name": action.name,
|
|
||||||
"description": action.meta.description,
|
|
||||||
"icon_url": action.meta.manifest.get("icon_url", None),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
model["action_ids"] = action_ids
|
||||||
else:
|
else:
|
||||||
owned_by = "openai"
|
owned_by = "openai"
|
||||||
pipe = None
|
pipe = None
|
||||||
actions = []
|
action_ids = []
|
||||||
|
|
||||||
for model in models:
|
for model in models:
|
||||||
if (
|
if (
|
||||||
@@ -1015,26 +986,8 @@ async def get_all_models():
|
|||||||
if "pipe" in model:
|
if "pipe" in model:
|
||||||
pipe = model["pipe"]
|
pipe = model["pipe"]
|
||||||
|
|
||||||
action_ids = [] + global_action_ids
|
|
||||||
if "info" in model and "meta" in model["info"]:
|
if "info" in model and "meta" in model["info"]:
|
||||||
action_ids.extend(model["info"]["meta"].get("actionIds", []))
|
action_ids.extend(model["info"]["meta"].get("actionIds", []))
|
||||||
action_ids = list(set(action_ids))
|
|
||||||
action_ids = [
|
|
||||||
action_id
|
|
||||||
for action_id in action_ids
|
|
||||||
if action_id in enabled_action_ids
|
|
||||||
]
|
|
||||||
|
|
||||||
actions = [
|
|
||||||
{
|
|
||||||
"id": action_id,
|
|
||||||
"name": Functions.get_function_by_id(action_id).name,
|
|
||||||
"description": Functions.get_function_by_id(
|
|
||||||
action_id
|
|
||||||
).meta.description,
|
|
||||||
}
|
|
||||||
for action_id in action_ids
|
|
||||||
]
|
|
||||||
break
|
break
|
||||||
|
|
||||||
models.append(
|
models.append(
|
||||||
@@ -1047,10 +1000,59 @@ async def get_all_models():
|
|||||||
"info": custom_model.model_dump(),
|
"info": custom_model.model_dump(),
|
||||||
"preset": True,
|
"preset": True,
|
||||||
**({"pipe": pipe} if pipe is not None else {}),
|
**({"pipe": pipe} if pipe is not None else {}),
|
||||||
"actions": actions,
|
"action_ids": action_ids,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for model in models:
|
||||||
|
action_ids = []
|
||||||
|
if "action_ids" in model:
|
||||||
|
action_ids = model["action_ids"]
|
||||||
|
del model["action_ids"]
|
||||||
|
|
||||||
|
action_ids = action_ids + global_action_ids
|
||||||
|
action_ids = list(set(action_ids))
|
||||||
|
action_ids = [
|
||||||
|
action_id for action_id in action_ids if action_id in enabled_action_ids
|
||||||
|
]
|
||||||
|
|
||||||
|
model["actions"] = []
|
||||||
|
for action_id in action_ids:
|
||||||
|
action = Functions.get_function_by_id(action_id)
|
||||||
|
|
||||||
|
if action_id in webui_app.state.FUNCTIONS:
|
||||||
|
function_module = webui_app.state.FUNCTIONS[action_id]
|
||||||
|
else:
|
||||||
|
function_module, _, _ = load_function_module_by_id(action_id)
|
||||||
|
webui_app.state.FUNCTIONS[action_id] = function_module
|
||||||
|
|
||||||
|
if hasattr(function_module, "actions"):
|
||||||
|
actions = function_module.actions
|
||||||
|
model["actions"].extend(
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": f"{action_id}.{_action['id']}",
|
||||||
|
"name": _action.get(
|
||||||
|
"name", f"{action.name} ({_action['id']})"
|
||||||
|
),
|
||||||
|
"description": action.meta.description,
|
||||||
|
"icon_url": _action.get(
|
||||||
|
"icon_url", action.meta.manifest.get("icon_url", None)
|
||||||
|
),
|
||||||
|
}
|
||||||
|
for _action in actions
|
||||||
|
]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
model["actions"].append(
|
||||||
|
{
|
||||||
|
"id": action_id,
|
||||||
|
"name": action.name,
|
||||||
|
"description": action.meta.description,
|
||||||
|
"icon_url": action.meta.manifest.get("icon_url", None),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
app.state.MODELS = {model["id"]: model for model in models}
|
app.state.MODELS = {model["id"]: model for model in models}
|
||||||
webui_app.state.MODELS = app.state.MODELS
|
webui_app.state.MODELS = app.state.MODELS
|
||||||
|
|
||||||
@@ -1165,13 +1167,13 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
|
|||||||
status_code=r.status_code,
|
status_code=r.status_code,
|
||||||
content=res,
|
content=res,
|
||||||
)
|
)
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
__event_emitter__ = await get_event_emitter(
|
__event_emitter__ = get_event_emitter(
|
||||||
{
|
{
|
||||||
"chat_id": data["chat_id"],
|
"chat_id": data["chat_id"],
|
||||||
"message_id": data["id"],
|
"message_id": data["id"],
|
||||||
@@ -1179,7 +1181,7 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
__event_call__ = await get_event_call(
|
__event_call__ = get_event_call(
|
||||||
{
|
{
|
||||||
"chat_id": data["chat_id"],
|
"chat_id": data["chat_id"],
|
||||||
"message_id": data["id"],
|
"message_id": data["id"],
|
||||||
@@ -1284,9 +1286,12 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
|
|||||||
|
|
||||||
|
|
||||||
@app.post("/api/chat/actions/{action_id}")
|
@app.post("/api/chat/actions/{action_id}")
|
||||||
async def chat_completed(
|
async def chat_action(action_id: str, form_data: dict, user=Depends(get_verified_user)):
|
||||||
action_id: str, form_data: dict, user=Depends(get_verified_user)
|
if "." in action_id:
|
||||||
):
|
action_id, sub_action_id = action_id.split(".")
|
||||||
|
else:
|
||||||
|
sub_action_id = None
|
||||||
|
|
||||||
action = Functions.get_function_by_id(action_id)
|
action = Functions.get_function_by_id(action_id)
|
||||||
if not action:
|
if not action:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1303,14 +1308,14 @@ async def chat_completed(
|
|||||||
)
|
)
|
||||||
model = app.state.MODELS[model_id]
|
model = app.state.MODELS[model_id]
|
||||||
|
|
||||||
__event_emitter__ = await get_event_emitter(
|
__event_emitter__ = get_event_emitter(
|
||||||
{
|
{
|
||||||
"chat_id": data["chat_id"],
|
"chat_id": data["chat_id"],
|
||||||
"message_id": data["id"],
|
"message_id": data["id"],
|
||||||
"session_id": data["session_id"],
|
"session_id": data["session_id"],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
__event_call__ = await get_event_call(
|
__event_call__ = get_event_call(
|
||||||
{
|
{
|
||||||
"chat_id": data["chat_id"],
|
"chat_id": data["chat_id"],
|
||||||
"message_id": data["id"],
|
"message_id": data["id"],
|
||||||
@@ -1339,7 +1344,7 @@ async def chat_completed(
|
|||||||
# Extra parameters to be passed to the function
|
# Extra parameters to be passed to the function
|
||||||
extra_params = {
|
extra_params = {
|
||||||
"__model__": model,
|
"__model__": model,
|
||||||
"__id__": action_id,
|
"__id__": sub_action_id if sub_action_id is not None else action_id,
|
||||||
"__event_emitter__": __event_emitter__,
|
"__event_emitter__": __event_emitter__,
|
||||||
"__event_call__": __event_call__,
|
"__event_call__": __event_call__,
|
||||||
}
|
}
|
||||||
@@ -1658,7 +1663,7 @@ async def get_pipelines_list(user=Depends(get_admin_user)):
|
|||||||
urlIdxs = [
|
urlIdxs = [
|
||||||
idx
|
idx
|
||||||
for idx, response in enumerate(responses)
|
for idx, response in enumerate(responses)
|
||||||
if response != None and "pipelines" in response
|
if response is not None and "pipelines" in response
|
||||||
]
|
]
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -1719,7 +1724,7 @@ async def upload_pipeline(
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "detail" in res:
|
if "detail" in res:
|
||||||
detail = res["detail"]
|
detail = res["detail"]
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1739,7 +1744,6 @@ class AddPipelineForm(BaseModel):
|
|||||||
|
|
||||||
@app.post("/api/pipelines/add")
|
@app.post("/api/pipelines/add")
|
||||||
async def add_pipeline(form_data: AddPipelineForm, user=Depends(get_admin_user)):
|
async def add_pipeline(form_data: AddPipelineForm, user=Depends(get_admin_user)):
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
try:
|
try:
|
||||||
urlIdx = form_data.urlIdx
|
urlIdx = form_data.urlIdx
|
||||||
@@ -1766,7 +1770,7 @@ async def add_pipeline(form_data: AddPipelineForm, user=Depends(get_admin_user))
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "detail" in res:
|
if "detail" in res:
|
||||||
detail = res["detail"]
|
detail = res["detail"]
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1782,7 +1786,6 @@ class DeletePipelineForm(BaseModel):
|
|||||||
|
|
||||||
@app.delete("/api/pipelines/delete")
|
@app.delete("/api/pipelines/delete")
|
||||||
async def delete_pipeline(form_data: DeletePipelineForm, user=Depends(get_admin_user)):
|
async def delete_pipeline(form_data: DeletePipelineForm, user=Depends(get_admin_user)):
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
try:
|
try:
|
||||||
urlIdx = form_data.urlIdx
|
urlIdx = form_data.urlIdx
|
||||||
@@ -1809,7 +1812,7 @@ async def delete_pipeline(form_data: DeletePipelineForm, user=Depends(get_admin_
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "detail" in res:
|
if "detail" in res:
|
||||||
detail = res["detail"]
|
detail = res["detail"]
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1842,7 +1845,7 @@ async def get_pipelines(urlIdx: Optional[int] = None, user=Depends(get_admin_use
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "detail" in res:
|
if "detail" in res:
|
||||||
detail = res["detail"]
|
detail = res["detail"]
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1857,10 +1860,8 @@ async def get_pipeline_valves(
|
|||||||
pipeline_id: str,
|
pipeline_id: str,
|
||||||
user=Depends(get_admin_user),
|
user=Depends(get_admin_user),
|
||||||
):
|
):
|
||||||
models = await get_all_models()
|
|
||||||
r = None
|
r = None
|
||||||
try:
|
try:
|
||||||
|
|
||||||
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
||||||
key = openai_app.state.config.OPENAI_API_KEYS[urlIdx]
|
key = openai_app.state.config.OPENAI_API_KEYS[urlIdx]
|
||||||
|
|
||||||
@@ -1897,8 +1898,6 @@ async def get_pipeline_valves_spec(
|
|||||||
pipeline_id: str,
|
pipeline_id: str,
|
||||||
user=Depends(get_admin_user),
|
user=Depends(get_admin_user),
|
||||||
):
|
):
|
||||||
models = await get_all_models()
|
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
try:
|
try:
|
||||||
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
||||||
@@ -1921,7 +1920,7 @@ async def get_pipeline_valves_spec(
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "detail" in res:
|
if "detail" in res:
|
||||||
detail = res["detail"]
|
detail = res["detail"]
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1937,8 +1936,6 @@ async def update_pipeline_valves(
|
|||||||
form_data: dict,
|
form_data: dict,
|
||||||
user=Depends(get_admin_user),
|
user=Depends(get_admin_user),
|
||||||
):
|
):
|
||||||
models = await get_all_models()
|
|
||||||
|
|
||||||
r = None
|
r = None
|
||||||
try:
|
try:
|
||||||
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
url = openai_app.state.config.OPENAI_API_BASE_URLS[urlIdx]
|
||||||
@@ -1966,7 +1963,7 @@ async def update_pipeline_valves(
|
|||||||
res = r.json()
|
res = r.json()
|
||||||
if "detail" in res:
|
if "detail" in res:
|
||||||
detail = res["detail"]
|
detail = res["detail"]
|
||||||
except:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -1995,10 +1992,12 @@ async def get_app_config():
|
|||||||
"auth": WEBUI_AUTH,
|
"auth": WEBUI_AUTH,
|
||||||
"auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
|
"auth_trusted_header": bool(webui_app.state.AUTH_TRUSTED_EMAIL_HEADER),
|
||||||
"enable_signup": webui_app.state.config.ENABLE_SIGNUP,
|
"enable_signup": webui_app.state.config.ENABLE_SIGNUP,
|
||||||
|
"enable_login_form": webui_app.state.config.ENABLE_LOGIN_FORM,
|
||||||
"enable_web_search": rag_app.state.config.ENABLE_RAG_WEB_SEARCH,
|
"enable_web_search": rag_app.state.config.ENABLE_RAG_WEB_SEARCH,
|
||||||
"enable_image_generation": images_app.state.config.ENABLED,
|
"enable_image_generation": images_app.state.config.ENABLED,
|
||||||
"enable_community_sharing": webui_app.state.config.ENABLE_COMMUNITY_SHARING,
|
"enable_community_sharing": webui_app.state.config.ENABLE_COMMUNITY_SHARING,
|
||||||
"enable_admin_export": ENABLE_ADMIN_EXPORT,
|
"enable_admin_export": ENABLE_ADMIN_EXPORT,
|
||||||
|
"enable_admin_chat_access": ENABLE_ADMIN_CHAT_ACCESS,
|
||||||
},
|
},
|
||||||
"audio": {
|
"audio": {
|
||||||
"tts": {
|
"tts": {
|
||||||
@@ -2066,7 +2065,7 @@ async def update_webhook_url(form_data: UrlForm, user=Depends(get_admin_user)):
|
|||||||
|
|
||||||
|
|
||||||
@app.get("/api/version")
|
@app.get("/api/version")
|
||||||
async def get_app_config():
|
async def get_app_version():
|
||||||
return {
|
return {
|
||||||
"version": VERSION,
|
"version": VERSION,
|
||||||
}
|
}
|
||||||
@@ -2089,7 +2088,7 @@ async def get_app_latest_release_version():
|
|||||||
latest_version = data["tag_name"]
|
latest_version = data["tag_name"]
|
||||||
|
|
||||||
return {"current": VERSION, "latest": latest_version[1:]}
|
return {"current": VERSION, "latest": latest_version[1:]}
|
||||||
except aiohttp.ClientError as e:
|
except aiohttp.ClientError:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
||||||
detail=ERROR_MESSAGES.RATE_LIMIT_EXCEEDED,
|
detail=ERROR_MESSAGES.RATE_LIMIT_EXCEEDED,
|
||||||
@@ -2111,6 +2110,7 @@ for provider_name, provider_config in OAUTH_PROVIDERS.items():
|
|||||||
client_kwargs={
|
client_kwargs={
|
||||||
"scope": provider_config["scope"],
|
"scope": provider_config["scope"],
|
||||||
},
|
},
|
||||||
|
redirect_uri=provider_config["redirect_uri"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# SessionMiddleware is used by authlib for oauth
|
# SessionMiddleware is used by authlib for oauth
|
||||||
@@ -2128,7 +2128,10 @@ if len(OAUTH_PROVIDERS) > 0:
|
|||||||
async def oauth_login(provider: str, request: Request):
|
async def oauth_login(provider: str, request: Request):
|
||||||
if provider not in OAUTH_PROVIDERS:
|
if provider not in OAUTH_PROVIDERS:
|
||||||
raise HTTPException(404)
|
raise HTTPException(404)
|
||||||
redirect_uri = request.url_for("oauth_callback", provider=provider)
|
# If the provider has a custom redirect URL, use that, otherwise automatically generate one
|
||||||
|
redirect_uri = OAUTH_PROVIDERS[provider].get("redirect_uri") or request.url_for(
|
||||||
|
"oauth_callback", provider=provider
|
||||||
|
)
|
||||||
return await oauth.create_client(provider).authorize_redirect(request, redirect_uri)
|
return await oauth.create_client(provider).authorize_redirect(request, redirect_uri)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+14
-13
@@ -12,6 +12,7 @@ passlib[bcrypt]==1.7.4
|
|||||||
|
|
||||||
requests==2.32.3
|
requests==2.32.3
|
||||||
aiohttp==3.9.5
|
aiohttp==3.9.5
|
||||||
|
|
||||||
sqlalchemy==2.0.31
|
sqlalchemy==2.0.31
|
||||||
alembic==1.13.2
|
alembic==1.13.2
|
||||||
peewee==3.17.6
|
peewee==3.17.6
|
||||||
@@ -19,10 +20,10 @@ peewee-migrate==1.12.2
|
|||||||
psycopg2-binary==2.9.9
|
psycopg2-binary==2.9.9
|
||||||
PyMySQL==1.1.1
|
PyMySQL==1.1.1
|
||||||
bcrypt==4.1.3
|
bcrypt==4.1.3
|
||||||
SQLAlchemy
|
|
||||||
pymongo
|
pymongo
|
||||||
redis
|
redis
|
||||||
boto3==1.34.110
|
boto3==1.34.153
|
||||||
|
|
||||||
argon2-cffi==23.1.0
|
argon2-cffi==23.1.0
|
||||||
APScheduler==3.10.4
|
APScheduler==3.10.4
|
||||||
@@ -30,31 +31,31 @@ APScheduler==3.10.4
|
|||||||
# AI libraries
|
# AI libraries
|
||||||
openai
|
openai
|
||||||
anthropic
|
anthropic
|
||||||
google-generativeai==0.5.4
|
google-generativeai==0.7.2
|
||||||
tiktoken
|
tiktoken
|
||||||
|
|
||||||
langchain==0.2.6
|
langchain==0.2.11
|
||||||
langchain-community==0.2.6
|
langchain-community==0.2.10
|
||||||
langchain-chroma==0.1.2
|
langchain-chroma==0.1.2
|
||||||
|
|
||||||
fake-useragent==1.5.1
|
fake-useragent==1.5.1
|
||||||
chromadb==0.5.4
|
chromadb==0.5.4
|
||||||
sentence-transformers==3.0.1
|
sentence-transformers==3.0.1
|
||||||
pypdf==4.2.0
|
pypdf==4.3.1
|
||||||
docx2txt==0.8
|
docx2txt==0.8
|
||||||
python-pptx==0.6.23
|
python-pptx==1.0.0
|
||||||
unstructured==0.14.10
|
unstructured==0.15.0
|
||||||
Markdown==3.6
|
Markdown==3.6
|
||||||
pypandoc==1.13
|
pypandoc==1.13
|
||||||
pandas==2.2.2
|
pandas==2.2.2
|
||||||
openpyxl==3.1.5
|
openpyxl==3.1.5
|
||||||
pyxlsb==1.0.10
|
pyxlsb==1.0.10
|
||||||
xlrd==2.0.1
|
xlrd==2.0.1
|
||||||
validators==0.28.1
|
validators==0.33.0
|
||||||
psutil
|
psutil
|
||||||
|
|
||||||
opencv-python-headless==4.10.0.84
|
opencv-python-headless==4.10.0.84
|
||||||
rapidocr-onnxruntime==1.3.22
|
rapidocr-onnxruntime==1.3.24
|
||||||
|
|
||||||
fpdf2==2.7.9
|
fpdf2==2.7.9
|
||||||
rank-bm25==0.2.2
|
rank-bm25==0.2.2
|
||||||
@@ -64,14 +65,14 @@ faster-whisper==1.0.2
|
|||||||
PyJWT[crypto]==2.8.0
|
PyJWT[crypto]==2.8.0
|
||||||
authlib==1.3.1
|
authlib==1.3.1
|
||||||
|
|
||||||
black==24.4.2
|
black==24.8.0
|
||||||
langfuse==2.38.0
|
langfuse==2.39.2
|
||||||
youtube-transcript-api==0.6.2
|
youtube-transcript-api==0.6.2
|
||||||
pytube==15.0.0
|
pytube==15.0.0
|
||||||
|
|
||||||
extract_msg
|
extract_msg
|
||||||
pydub
|
pydub
|
||||||
duckduckgo-search~=6.1.12
|
duckduckgo-search~=6.2.1
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
docker~=7.1.0
|
docker~=7.1.0
|
||||||
|
|||||||
+98
-32
@@ -1,44 +1,47 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
|
||||||
import re
|
import re
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from typing import Optional, List, Tuple
|
from typing import Optional, List, Tuple
|
||||||
import uuid
|
import uuid
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
from utils.task import prompt_template
|
||||||
|
|
||||||
def get_last_user_message_item(messages: List[dict]) -> str:
|
|
||||||
|
def get_last_user_message_item(messages: List[dict]) -> Optional[dict]:
|
||||||
for message in reversed(messages):
|
for message in reversed(messages):
|
||||||
if message["role"] == "user":
|
if message["role"] == "user":
|
||||||
return message
|
return message
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_last_user_message(messages: List[dict]) -> str:
|
def get_content_from_message(message: dict) -> Optional[str]:
|
||||||
message = get_last_user_message_item(messages)
|
if isinstance(message["content"], list):
|
||||||
|
for item in message["content"]:
|
||||||
if message is not None:
|
if item["type"] == "text":
|
||||||
if isinstance(message["content"], list):
|
return item["text"]
|
||||||
for item in message["content"]:
|
else:
|
||||||
if item["type"] == "text":
|
|
||||||
return item["text"]
|
|
||||||
return message["content"]
|
return message["content"]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_last_assistant_message(messages: List[dict]) -> str:
|
def get_last_user_message(messages: List[dict]) -> Optional[str]:
|
||||||
|
message = get_last_user_message_item(messages)
|
||||||
|
if message is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return get_content_from_message(message)
|
||||||
|
|
||||||
|
|
||||||
|
def get_last_assistant_message(messages: List[dict]) -> Optional[str]:
|
||||||
for message in reversed(messages):
|
for message in reversed(messages):
|
||||||
if message["role"] == "assistant":
|
if message["role"] == "assistant":
|
||||||
if isinstance(message["content"], list):
|
return get_content_from_message(message)
|
||||||
for item in message["content"]:
|
|
||||||
if item["type"] == "text":
|
|
||||||
return item["text"]
|
|
||||||
return message["content"]
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_system_message(messages: List[dict]) -> dict:
|
def get_system_message(messages: List[dict]) -> Optional[dict]:
|
||||||
for message in messages:
|
for message in messages:
|
||||||
if message["role"] == "system":
|
if message["role"] == "system":
|
||||||
return message
|
return message
|
||||||
@@ -49,10 +52,25 @@ def remove_system_message(messages: List[dict]) -> List[dict]:
|
|||||||
return [message for message in messages if message["role"] != "system"]
|
return [message for message in messages if message["role"] != "system"]
|
||||||
|
|
||||||
|
|
||||||
def pop_system_message(messages: List[dict]) -> Tuple[dict, List[dict]]:
|
def pop_system_message(messages: List[dict]) -> Tuple[Optional[dict], List[dict]]:
|
||||||
return get_system_message(messages), remove_system_message(messages)
|
return get_system_message(messages), remove_system_message(messages)
|
||||||
|
|
||||||
|
|
||||||
|
def prepend_to_first_user_message_content(
|
||||||
|
content: str, messages: List[dict]
|
||||||
|
) -> List[dict]:
|
||||||
|
for message in messages:
|
||||||
|
if message["role"] == "user":
|
||||||
|
if isinstance(message["content"], list):
|
||||||
|
for item in message["content"]:
|
||||||
|
if item["type"] == "text":
|
||||||
|
item["text"] = f"{content}\n{item['text']}"
|
||||||
|
else:
|
||||||
|
message["content"] = f"{content}\n{message['content']}"
|
||||||
|
break
|
||||||
|
return messages
|
||||||
|
|
||||||
|
|
||||||
def add_or_update_system_message(content: str, messages: List[dict]):
|
def add_or_update_system_message(content: str, messages: List[dict]):
|
||||||
"""
|
"""
|
||||||
Adds a new system message at the beginning of the messages list
|
Adds a new system message at the beginning of the messages list
|
||||||
@@ -72,23 +90,71 @@ def add_or_update_system_message(content: str, messages: List[dict]):
|
|||||||
return messages
|
return messages
|
||||||
|
|
||||||
|
|
||||||
def stream_message_template(model: str, message: str):
|
def openai_chat_message_template(model: str):
|
||||||
return {
|
return {
|
||||||
"id": f"{model}-{str(uuid.uuid4())}",
|
"id": f"{model}-{str(uuid.uuid4())}",
|
||||||
"object": "chat.completion.chunk",
|
|
||||||
"created": int(time.time()),
|
"created": int(time.time()),
|
||||||
"model": model,
|
"model": model,
|
||||||
"choices": [
|
"choices": [{"index": 0, "logprobs": None, "finish_reason": None}],
|
||||||
{
|
|
||||||
"index": 0,
|
|
||||||
"delta": {"content": message},
|
|
||||||
"logprobs": None,
|
|
||||||
"finish_reason": None,
|
|
||||||
}
|
|
||||||
],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def openai_chat_chunk_message_template(model: str, message: str) -> dict:
|
||||||
|
template = openai_chat_message_template(model)
|
||||||
|
template["object"] = "chat.completion.chunk"
|
||||||
|
template["choices"][0]["delta"] = {"content": message}
|
||||||
|
return template
|
||||||
|
|
||||||
|
|
||||||
|
def openai_chat_completion_message_template(model: str, message: str) -> dict:
|
||||||
|
template = openai_chat_message_template(model)
|
||||||
|
template["object"] = "chat.completion"
|
||||||
|
template["choices"][0]["message"] = {"content": message, "role": "assistant"}
|
||||||
|
template["choices"][0]["finish_reason"] = "stop"
|
||||||
|
return template
|
||||||
|
|
||||||
|
|
||||||
|
# inplace function: form_data is modified
|
||||||
|
def apply_model_system_prompt_to_body(params: dict, form_data: dict, user) -> dict:
|
||||||
|
system = params.get("system", None)
|
||||||
|
if not system:
|
||||||
|
return form_data
|
||||||
|
|
||||||
|
if user:
|
||||||
|
template_params = {
|
||||||
|
"user_name": user.name,
|
||||||
|
"user_location": user.info.get("location") if user.info else None,
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
template_params = {}
|
||||||
|
system = prompt_template(system, **template_params)
|
||||||
|
form_data["messages"] = add_or_update_system_message(
|
||||||
|
system, form_data.get("messages", [])
|
||||||
|
)
|
||||||
|
return form_data
|
||||||
|
|
||||||
|
|
||||||
|
# inplace function: form_data is modified
|
||||||
|
def apply_model_params_to_body(params: dict, form_data: dict) -> dict:
|
||||||
|
if not params:
|
||||||
|
return form_data
|
||||||
|
|
||||||
|
mappings = {
|
||||||
|
"temperature": float,
|
||||||
|
"top_p": int,
|
||||||
|
"max_tokens": int,
|
||||||
|
"frequency_penalty": int,
|
||||||
|
"seed": lambda x: x,
|
||||||
|
"stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x],
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, cast_func in mappings.items():
|
||||||
|
if (value := params.get(key)) is not None:
|
||||||
|
form_data[key] = cast_func(value)
|
||||||
|
|
||||||
|
return form_data
|
||||||
|
|
||||||
|
|
||||||
def get_gravatar_url(email):
|
def get_gravatar_url(email):
|
||||||
# Trim leading and trailing whitespace from
|
# Trim leading and trailing whitespace from
|
||||||
# an email address and force all characters
|
# an email address and force all characters
|
||||||
@@ -159,7 +225,7 @@ def extract_folders_after_data_docs(path):
|
|||||||
tags = []
|
tags = []
|
||||||
|
|
||||||
folders = parts[index_docs:-1]
|
folders = parts[index_docs:-1]
|
||||||
for idx, part in enumerate(folders):
|
for idx, _ in enumerate(folders):
|
||||||
tags.append("/".join(folders[: idx + 1]))
|
tags.append("/".join(folders[: idx + 1]))
|
||||||
|
|
||||||
return tags
|
return tags
|
||||||
@@ -255,11 +321,11 @@ def parse_ollama_modelfile(model_text):
|
|||||||
value = param_match.group(1)
|
value = param_match.group(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if param_type == int:
|
if param_type is int:
|
||||||
value = int(value)
|
value = int(value)
|
||||||
elif param_type == float:
|
elif param_type is float:
|
||||||
value = float(value)
|
value = float(value)
|
||||||
elif param_type == bool:
|
elif param_type is bool:
|
||||||
value = value.lower() == "true"
|
value = value.lower() == "true"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from typing import Optional
|
|||||||
|
|
||||||
|
|
||||||
def prompt_template(
|
def prompt_template(
|
||||||
template: str, user_name: str = None, user_location: str = None
|
template: str, user_name: Optional[str] = None, user_location: Optional[str] = None
|
||||||
) -> str:
|
) -> str:
|
||||||
# Get the current date
|
# Get the current date
|
||||||
current_date = datetime.now()
|
current_date = datetime.now()
|
||||||
@@ -83,7 +83,6 @@ def title_generation_template(
|
|||||||
def search_query_generation_template(
|
def search_query_generation_template(
|
||||||
template: str, prompt: str, user: Optional[dict] = None
|
template: str, prompt: str, user: Optional[dict] = None
|
||||||
) -> str:
|
) -> str:
|
||||||
|
|
||||||
def replacement_function(match):
|
def replacement_function(match):
|
||||||
full_match = match.group(0)
|
full_match = match.group(0)
|
||||||
start_length = match.group(1)
|
start_length = match.group(1)
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||||
from fastapi import HTTPException, status, Depends, Request
|
from fastapi import HTTPException, status, Depends, Request
|
||||||
from sqlalchemy.orm import Session
|
|
||||||
|
|
||||||
from apps.webui.models.users import Users
|
from apps.webui.models.users import Users
|
||||||
|
|
||||||
from pydantic import BaseModel
|
|
||||||
from typing import Union, Optional
|
from typing import Union, Optional
|
||||||
from constants import ERROR_MESSAGES
|
from constants import ERROR_MESSAGES
|
||||||
from passlib.context import CryptContext
|
from passlib.context import CryptContext
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import requests
|
|
||||||
import jwt
|
import jwt
|
||||||
import uuid
|
import uuid
|
||||||
import logging
|
import logging
|
||||||
@@ -54,7 +51,7 @@ def decode_token(token: str) -> Optional[dict]:
|
|||||||
try:
|
try:
|
||||||
decoded = jwt.decode(token, SESSION_SECRET, algorithms=[ALGORITHM])
|
decoded = jwt.decode(token, SESSION_SECRET, algorithms=[ALGORITHM])
|
||||||
return decoded
|
return decoded
|
||||||
except Exception as e:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@@ -71,7 +68,7 @@ def get_http_authorization_cred(auth_header: str):
|
|||||||
try:
|
try:
|
||||||
scheme, credentials = auth_header.split(" ")
|
scheme, credentials = auth_header.split(" ")
|
||||||
return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials)
|
return HTTPAuthorizationCredentials(scheme=scheme, credentials=credentials)
|
||||||
except:
|
except Exception:
|
||||||
raise ValueError(ERROR_MESSAGES.INVALID_TOKEN)
|
raise ValueError(ERROR_MESSAGES.INVALID_TOKEN)
|
||||||
|
|
||||||
|
|
||||||
@@ -96,7 +93,7 @@ def get_current_user(
|
|||||||
|
|
||||||
# auth by jwt token
|
# auth by jwt token
|
||||||
data = decode_token(token)
|
data = decode_token(token)
|
||||||
if data != None and "id" in data:
|
if data is not None and "id" in data:
|
||||||
user = Users.get_user_by_id(data["id"])
|
user = Users.get_user_by_id(data["id"])
|
||||||
if user is None:
|
if user is None:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pellentesque elit eget gravida cum sociis natoque. Morbi tristique senectus et netus et malesuada. Sapien nec sagittis aliquam malesuada bibendum. Amet consectetur adipiscing elit duis tristique sollicitudin. Non pulvinar neque laoreet suspendisse interdum consectetur libero. Arcu cursus vitae congue mauris rhoncus aenean vel elit scelerisque. Nec feugiat nisl pretium fusce id velit. Imperdiet proin fermentum leo vel. Arcu dui vivamus arcu felis bibendum ut tristique et egestas. Pellentesque sit amet porttitor eget dolor morbi non arcu risus. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor aliquam. Et ultrices neque ornare aenean euismod.
|
||||||
|
|
||||||
|
Enim nulla aliquet porttitor lacus luctus accumsan tortor posuere ac. Viverra nibh cras pulvinar mattis nunc. Lacinia at quis risus sed vulputate. Ac tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Bibendum arcu vitae elementum curabitur vitae nunc. Consectetur adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Velit egestas dui id ornare arcu odio ut. Et malesuada fames ac turpis egestas integer eget aliquet. Lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Morbi tristique senectus et netus. Pretium viverra suspendisse potenti nullam ac tortor vitae. Parturient montes nascetur ridiculus mus mauris vitae. Quis viverra nibh cras pulvinar mattis nunc sed blandit libero. Euismod nisi porta lorem mollis aliquam ut porttitor leo. Mauris in aliquam sem fringilla ut morbi. Faucibus pulvinar elementum integer enim neque. Neque sodales ut etiam sit. Consectetur a erat nam at.
|
||||||
|
|
||||||
|
Sed nisi lacus sed viverra tellus in hac habitasse. Proin sagittis nisl rhoncus mattis rhoncus. Risus commodo viverra maecenas accumsan lacus. Morbi quis commodo odio aenean sed adipiscing. Mollis nunc sed id semper risus in. Ultricies mi eget mauris pharetra et ultrices neque. Amet luctus venenatis lectus magna fringilla urna porttitor rhoncus. Eget magna fermentum iaculis eu non diam phasellus. Id diam maecenas ultricies mi eget mauris pharetra et ultrices. Id donec ultrices tincidunt arcu non sodales. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Urna duis convallis convallis tellus id interdum velit. Rhoncus mattis rhoncus urna neque viverra justo nec. Purus semper eget duis at tellus at urna condimentum. Et odio pellentesque diam volutpat commodo sed egestas. Blandit volutpat maecenas volutpat blandit. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Est ullamcorper eget nulla facilisi etiam dignissim.
|
||||||
|
|
||||||
|
Justo nec ultrices dui sapien eget mi proin sed. Purus gravida quis blandit turpis cursus in hac. Placerat orci nulla pellentesque dignissim enim sit. Morbi tristique senectus et netus et malesuada fames ac. Consequat mauris nunc congue nisi. Eu lobortis elementum nibh tellus molestie nunc non blandit. Viverra justo nec ultrices dui. Morbi non arcu risus quis. Elementum sagittis vitae et leo duis. Lectus mauris ultrices eros in cursus. Neque laoreet suspendisse interdum consectetur.
|
||||||
|
|
||||||
|
Facilisis gravida neque convallis a cras. Nisl rhoncus mattis rhoncus urna neque viverra justo. Faucibus purus in massa tempor. Lacus laoreet non curabitur gravida arcu ac tortor. Tincidunt eget nullam non nisi est sit amet. Ornare lectus sit amet est placerat in egestas. Sollicitudin tempor id eu nisl nunc mi. Scelerisque viverra mauris in aliquam sem fringilla ut. Ullamcorper sit amet risus nullam. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Velit euismod in pellentesque massa placerat duis ultricies lacus. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Lorem ipsum dolor sit amet. Sit amet mauris commodo quis imperdiet. Quam pellentesque nec nam aliquam sem et tortor. Amet nisl purus in mollis nunc. Sed risus pretium quam vulputate dignissim suspendisse in est. Nisl condimentum id venenatis a condimentum. Velit euismod in pellentesque massa. Quam id leo in vitae turpis massa sed.
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||||
|
/// <reference path="../support/index.d.ts" />
|
||||||
|
|
||||||
|
describe('Documents', () => {
|
||||||
|
const timestamp = Date.now();
|
||||||
|
|
||||||
|
before(() => {
|
||||||
|
cy.uploadTestDocument(timestamp);
|
||||||
|
});
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
cy.deleteTestDocument(timestamp);
|
||||||
|
});
|
||||||
|
|
||||||
|
context('Admin', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
// Login as the admin user
|
||||||
|
cy.loginAdmin();
|
||||||
|
// Visit the home page
|
||||||
|
cy.visit('/workspace/documents');
|
||||||
|
cy.get('button').contains('#cypress-test').click();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can see documents', () => {
|
||||||
|
cy.get('div').contains(`document-test-initial-${timestamp}.txt`).should('have.length', 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can see edit button', () => {
|
||||||
|
cy.get('div')
|
||||||
|
.contains(`document-test-initial-${timestamp}.txt`)
|
||||||
|
.get("button[aria-label='Edit Doc']")
|
||||||
|
.should('exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can see delete button', () => {
|
||||||
|
cy.get('div')
|
||||||
|
.contains(`document-test-initial-${timestamp}.txt`)
|
||||||
|
.get("button[aria-label='Delete Doc']")
|
||||||
|
.should('exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can see upload button', () => {
|
||||||
|
cy.get("button[aria-label='Add Docs']").should('exist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
/// <reference types="cypress" />
|
/// <reference types="cypress" />
|
||||||
|
// eslint-disable-next-line @typescript-eslint/triple-slash-reference
|
||||||
|
/// <reference path="../support/index.d.ts" />
|
||||||
|
|
||||||
export const adminUser = {
|
export const adminUser = {
|
||||||
name: 'Admin User',
|
name: 'Admin User',
|
||||||
@@ -10,6 +12,9 @@ const login = (email: string, password: string) => {
|
|||||||
return cy.session(
|
return cy.session(
|
||||||
email,
|
email,
|
||||||
() => {
|
() => {
|
||||||
|
// Make sure to test against us english to have stable tests,
|
||||||
|
// regardless on local language preferences
|
||||||
|
localStorage.setItem('locale', 'en-US');
|
||||||
// Visit auth page
|
// Visit auth page
|
||||||
cy.visit('/auth');
|
cy.visit('/auth');
|
||||||
// Fill out the form
|
// Fill out the form
|
||||||
@@ -68,6 +73,50 @@ Cypress.Commands.add('register', (name, email, password) => register(name, email
|
|||||||
Cypress.Commands.add('registerAdmin', () => registerAdmin());
|
Cypress.Commands.add('registerAdmin', () => registerAdmin());
|
||||||
Cypress.Commands.add('loginAdmin', () => loginAdmin());
|
Cypress.Commands.add('loginAdmin', () => loginAdmin());
|
||||||
|
|
||||||
|
Cypress.Commands.add('uploadTestDocument', (suffix: any) => {
|
||||||
|
// Login as admin
|
||||||
|
cy.loginAdmin();
|
||||||
|
// upload example document
|
||||||
|
cy.visit('/workspace/documents');
|
||||||
|
// Create a document
|
||||||
|
cy.get("button[aria-label='Add Docs']").click();
|
||||||
|
cy.readFile('cypress/data/example-doc.txt').then((text) => {
|
||||||
|
// select file
|
||||||
|
cy.get('#upload-doc-input').selectFile(
|
||||||
|
{
|
||||||
|
contents: Cypress.Buffer.from(text + Date.now()),
|
||||||
|
fileName: `document-test-initial-${suffix}.txt`,
|
||||||
|
mimeType: 'text/plain',
|
||||||
|
lastModified: Date.now()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
force: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
// open tag input
|
||||||
|
cy.get("button[aria-label='Add Tag']").click();
|
||||||
|
cy.get("input[placeholder='Add a tag']").type('cypress-test');
|
||||||
|
cy.get("button[aria-label='Save Tag']").click();
|
||||||
|
|
||||||
|
// submit to upload
|
||||||
|
cy.get("button[type='submit']").click();
|
||||||
|
|
||||||
|
// wait for upload to finish
|
||||||
|
cy.get('button').contains('#cypress-test').should('exist');
|
||||||
|
cy.get('div').contains(`document-test-initial-${suffix}.txt`).should('exist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('deleteTestDocument', (suffix: any) => {
|
||||||
|
cy.loginAdmin();
|
||||||
|
cy.visit('/workspace/documents');
|
||||||
|
// clean up uploaded documents
|
||||||
|
cy.get('div')
|
||||||
|
.contains(`document-test-initial-${suffix}.txt`)
|
||||||
|
.find("button[aria-label='Delete Doc']")
|
||||||
|
.click();
|
||||||
|
});
|
||||||
|
|
||||||
before(() => {
|
before(() => {
|
||||||
cy.registerAdmin();
|
cy.registerAdmin();
|
||||||
});
|
});
|
||||||
|
|||||||
Vendored
+2
@@ -7,5 +7,7 @@ declare namespace Cypress {
|
|||||||
register(name: string, email: string, password: string): Chainable<Element>;
|
register(name: string, email: string, password: string): Chainable<Element>;
|
||||||
registerAdmin(): Chainable<Element>;
|
registerAdmin(): Chainable<Element>;
|
||||||
loginAdmin(): Chainable<Element>;
|
loginAdmin(): Chainable<Element>;
|
||||||
|
uploadTestDocument(suffix: any): Chainable<Element>;
|
||||||
|
deleteTestDocument(suffix: any): Chainable<Element>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-3
@@ -11,10 +11,26 @@ Our primary goal is to ensure the protection and confidentiality of sensitive da
|
|||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
If you discover a security issue within our system, please notify us immediately via a pull request or contact us on discord.
|
We appreciate the community's interest in identifying potential vulnerabilities. However, effective immediately, we will **not** accept low-effort vulnerability reports. To ensure that submissions are constructive and actionable, please adhere to the following guidelines:
|
||||||
|
|
||||||
|
1. **No Vague Reports**: Submissions such as "I found a vulnerability" without any details will be treated as spam and will not be accepted.
|
||||||
|
|
||||||
|
2. **In-Depth Understanding Required**: Reports must reflect a clear understanding of the codebase and provide specific details about the vulnerability, including the affected components and potential impacts.
|
||||||
|
|
||||||
|
3. **Proof of Concept (PoC) is Mandatory**: Each submission must include a well-documented proof of concept (PoC) that demonstrates the vulnerability. If confidentiality is a concern, reporters are encouraged to create a private fork of the repository and share access with the maintainers. Reports lacking valid evidence will be disregarded.
|
||||||
|
|
||||||
|
4. **Required Patch Submission**: Along with the PoC, reporters must provide a patch or actionable steps to remediate the identified vulnerability. This helps us evaluate and implement fixes rapidly.
|
||||||
|
|
||||||
|
5. **Streamlined Merging Process**: When vulnerability reports meet the above criteria, we can consider them for immediate merging, similar to regular pull requests. Well-structured and thorough submissions will expedite the process of enhancing our security.
|
||||||
|
|
||||||
|
Submissions that do not meet these criteria will be closed, and repeat offenders may face a ban from future submissions. We aim to create a respectful and constructive reporting environment, where high-quality submissions foster better security for everyone.
|
||||||
|
|
||||||
## Product Security
|
## Product Security
|
||||||
|
|
||||||
We regularly audit our internal processes and system's architecture for vulnerabilities using a combination of automated and manual testing techniques.
|
We regularly audit our internal processes and system architecture for vulnerabilities using a combination of automated and manual testing techniques. We are also planning to implement SAST and SCA scans in our project soon.
|
||||||
|
|
||||||
We are planning on implementing SAST and SCA scans in our project soon.
|
For immediate concerns or detailed reports that meet our guidelines, please create an issue in our [issue tracker](/open-webui/open-webui/issues) or contact us on [Discord](https://discord.gg/5rJgQTnV4s).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
_Last updated on **2024-08-06**._
|
||||||
|
|||||||
Generated
+11
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "open-webui",
|
"name": "open-webui",
|
||||||
"version": "0.3.10",
|
"version": "0.3.12",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "open-webui",
|
"name": "open-webui",
|
||||||
"version": "0.3.10",
|
"version": "0.3.12",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/lang-javascript": "^6.2.2",
|
"@codemirror/lang-javascript": "^6.2.2",
|
||||||
"@codemirror/lang-python": "^6.1.6",
|
"@codemirror/lang-python": "^6.1.6",
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
"dayjs": "^1.11.10",
|
"dayjs": "^1.11.10",
|
||||||
"eventsource-parser": "^1.1.2",
|
"eventsource-parser": "^1.1.2",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
|
"fuse.js": "^7.0.0",
|
||||||
"highlight.js": "^11.9.0",
|
"highlight.js": "^11.9.0",
|
||||||
"i18next": "^23.10.0",
|
"i18next": "^23.10.0",
|
||||||
"i18next-browser-languagedetector": "^7.2.0",
|
"i18next-browser-languagedetector": "^7.2.0",
|
||||||
@@ -4820,6 +4821,14 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/fuse.js": {
|
||||||
|
"version": "7.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz",
|
||||||
|
"integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/gc-hook": {
|
"node_modules/gc-hook": {
|
||||||
"version": "0.3.1",
|
"version": "0.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz",
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "open-webui",
|
"name": "open-webui",
|
||||||
"version": "0.3.10",
|
"version": "0.3.12",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||||
@@ -60,6 +60,7 @@
|
|||||||
"dayjs": "^1.11.10",
|
"dayjs": "^1.11.10",
|
||||||
"eventsource-parser": "^1.1.2",
|
"eventsource-parser": "^1.1.2",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
|
"fuse.js": "^7.0.0",
|
||||||
"highlight.js": "^11.9.0",
|
"highlight.js": "^11.9.0",
|
||||||
"i18next": "^23.10.0",
|
"i18next": "^23.10.0",
|
||||||
"i18next-browser-languagedetector": "^7.2.0",
|
"i18next-browser-languagedetector": "^7.2.0",
|
||||||
|
|||||||
+36
-21
@@ -8,50 +8,61 @@ license = { file = "LICENSE" }
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"fastapi==0.111.0",
|
"fastapi==0.111.0",
|
||||||
"uvicorn[standard]==0.22.0",
|
"uvicorn[standard]==0.22.0",
|
||||||
"pydantic==2.7.1",
|
"pydantic==2.8.2",
|
||||||
"python-multipart==0.0.9",
|
"python-multipart==0.0.9",
|
||||||
|
|
||||||
"Flask==3.0.3",
|
"Flask==3.0.3",
|
||||||
"Flask-Cors==4.0.1",
|
"Flask-Cors==4.0.1",
|
||||||
|
|
||||||
"python-socketio==5.11.2",
|
"python-socketio==5.11.3",
|
||||||
"python-jose==3.3.0",
|
"python-jose==3.3.0",
|
||||||
"passlib[bcrypt]==1.7.4",
|
"passlib[bcrypt]==1.7.4",
|
||||||
|
|
||||||
"requests==2.32.2",
|
"requests==2.32.3",
|
||||||
"aiohttp==3.9.5",
|
"aiohttp==3.9.5",
|
||||||
"peewee==3.17.5",
|
|
||||||
|
"sqlalchemy==2.0.31",
|
||||||
|
"alembic==1.13.2",
|
||||||
|
"peewee==3.17.6",
|
||||||
"peewee-migrate==1.12.2",
|
"peewee-migrate==1.12.2",
|
||||||
"psycopg2-binary==2.9.9",
|
"psycopg2-binary==2.9.9",
|
||||||
"PyMySQL==1.1.0",
|
"PyMySQL==1.1.1",
|
||||||
"bcrypt==4.1.3",
|
"bcrypt==4.1.3",
|
||||||
|
|
||||||
"boto3==1.34.110",
|
"pymongo",
|
||||||
|
"redis",
|
||||||
|
"boto3==1.34.153",
|
||||||
|
|
||||||
"argon2-cffi==23.1.0",
|
"argon2-cffi==23.1.0",
|
||||||
"APScheduler==3.10.4",
|
"APScheduler==3.10.4",
|
||||||
"google-generativeai==0.5.4",
|
|
||||||
|
|
||||||
"langchain==0.2.0",
|
"openai",
|
||||||
"langchain-community==0.2.0",
|
"anthropic",
|
||||||
"langchain-chroma==0.1.1",
|
"google-generativeai==0.7.2",
|
||||||
|
"tiktoken",
|
||||||
|
|
||||||
|
"langchain==0.2.11",
|
||||||
|
"langchain-community==0.2.10",
|
||||||
|
"langchain-chroma==0.1.2",
|
||||||
|
|
||||||
"fake-useragent==1.5.1",
|
"fake-useragent==1.5.1",
|
||||||
"chromadb==0.5.0",
|
"chromadb==0.5.4",
|
||||||
"sentence-transformers==2.7.0",
|
"sentence-transformers==3.0.1",
|
||||||
"pypdf==4.2.0",
|
"pypdf==4.3.1",
|
||||||
"docx2txt==0.8",
|
"docx2txt==0.8",
|
||||||
"unstructured==0.14.0",
|
"python-pptx==1.0.0",
|
||||||
|
"unstructured==0.15.0",
|
||||||
"Markdown==3.6",
|
"Markdown==3.6",
|
||||||
"pypandoc==1.13",
|
"pypandoc==1.13",
|
||||||
"pandas==2.2.2",
|
"pandas==2.2.2",
|
||||||
"openpyxl==3.1.2",
|
"openpyxl==3.1.5",
|
||||||
"pyxlsb==1.0.10",
|
"pyxlsb==1.0.10",
|
||||||
"xlrd==2.0.1",
|
"xlrd==2.0.1",
|
||||||
"validators==0.28.1",
|
"validators==0.33.0",
|
||||||
|
"psutil",
|
||||||
|
|
||||||
"opencv-python-headless==4.9.0.80",
|
"opencv-python-headless==4.10.0.84",
|
||||||
"rapidocr-onnxruntime==1.3.22",
|
"rapidocr-onnxruntime==1.3.24",
|
||||||
|
|
||||||
"fpdf2==2.7.9",
|
"fpdf2==2.7.9",
|
||||||
"rank-bm25==0.2.2",
|
"rank-bm25==0.2.2",
|
||||||
@@ -61,14 +72,18 @@ dependencies = [
|
|||||||
"PyJWT[crypto]==2.8.0",
|
"PyJWT[crypto]==2.8.0",
|
||||||
"authlib==1.3.1",
|
"authlib==1.3.1",
|
||||||
|
|
||||||
"black==24.4.2",
|
"black==24.8.0",
|
||||||
"langfuse==2.33.0",
|
"langfuse==2.39.2",
|
||||||
"youtube-transcript-api==0.6.2",
|
"youtube-transcript-api==0.6.2",
|
||||||
"pytube==15.0.0",
|
"pytube==15.0.0",
|
||||||
|
|
||||||
"extract_msg",
|
"extract_msg",
|
||||||
"pydub",
|
"pydub",
|
||||||
"duckduckgo-search~=6.1.5"
|
"duckduckgo-search~=6.2.1",
|
||||||
|
|
||||||
|
"docker~=7.1.0",
|
||||||
|
"pytest~=8.2.2",
|
||||||
|
"pytest-docker~=3.1.1"
|
||||||
]
|
]
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">= 3.11, < 3.12.0a1"
|
requires-python = ">= 3.11, < 3.12.0a1"
|
||||||
|
|||||||
+99
-35
@@ -16,10 +16,17 @@ aiohttp==3.9.5
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
aiosignal==1.3.1
|
aiosignal==1.3.1
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
|
alembic==1.13.2
|
||||||
|
# via open-webui
|
||||||
annotated-types==0.6.0
|
annotated-types==0.6.0
|
||||||
# via pydantic
|
# via pydantic
|
||||||
anyio==4.3.0
|
anthropic==0.32.0
|
||||||
|
# via open-webui
|
||||||
|
anyio==4.4.0
|
||||||
|
# via anthropic
|
||||||
# via httpx
|
# via httpx
|
||||||
|
# via langfuse
|
||||||
|
# via openai
|
||||||
# via starlette
|
# via starlette
|
||||||
# via watchfiles
|
# via watchfiles
|
||||||
apscheduler==3.10.4
|
apscheduler==3.10.4
|
||||||
@@ -32,6 +39,7 @@ asgiref==3.8.1
|
|||||||
# via opentelemetry-instrumentation-asgi
|
# via opentelemetry-instrumentation-asgi
|
||||||
attrs==23.2.0
|
attrs==23.2.0
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
|
# via pytest-docker
|
||||||
authlib==1.3.1
|
authlib==1.3.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
av==11.0.0
|
av==11.0.0
|
||||||
@@ -49,13 +57,13 @@ beautifulsoup4==4.12.3
|
|||||||
# via unstructured
|
# via unstructured
|
||||||
bidict==0.23.1
|
bidict==0.23.1
|
||||||
# via python-socketio
|
# via python-socketio
|
||||||
black==24.4.2
|
black==24.8.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
blinker==1.8.2
|
blinker==1.8.2
|
||||||
# via flask
|
# via flask
|
||||||
boto3==1.34.110
|
boto3==1.34.153
|
||||||
# via open-webui
|
# via open-webui
|
||||||
botocore==1.34.110
|
botocore==1.34.155
|
||||||
# via boto3
|
# via boto3
|
||||||
# via s3transfer
|
# via s3transfer
|
||||||
build==1.2.1
|
build==1.2.1
|
||||||
@@ -76,9 +84,9 @@ chardet==5.2.0
|
|||||||
charset-normalizer==3.3.2
|
charset-normalizer==3.3.2
|
||||||
# via requests
|
# via requests
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
chroma-hnswlib==0.7.3
|
chroma-hnswlib==0.7.5
|
||||||
# via chromadb
|
# via chromadb
|
||||||
chromadb==0.5.0
|
chromadb==0.5.4
|
||||||
# via langchain-chroma
|
# via langchain-chroma
|
||||||
# via open-webui
|
# via open-webui
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
@@ -102,7 +110,6 @@ cryptography==42.0.7
|
|||||||
ctranslate2==4.2.1
|
ctranslate2==4.2.1
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
dataclasses-json==0.6.6
|
dataclasses-json==0.6.6
|
||||||
# via langchain
|
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via unstructured
|
# via unstructured
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
@@ -113,11 +120,17 @@ defusedxml==0.7.1
|
|||||||
deprecated==1.2.14
|
deprecated==1.2.14
|
||||||
# via opentelemetry-api
|
# via opentelemetry-api
|
||||||
# via opentelemetry-exporter-otlp-proto-grpc
|
# via opentelemetry-exporter-otlp-proto-grpc
|
||||||
|
distro==1.9.0
|
||||||
|
# via anthropic
|
||||||
|
# via openai
|
||||||
dnspython==2.6.1
|
dnspython==2.6.1
|
||||||
# via email-validator
|
# via email-validator
|
||||||
|
# via pymongo
|
||||||
|
docker==7.1.0
|
||||||
|
# via open-webui
|
||||||
docx2txt==0.8
|
docx2txt==0.8
|
||||||
# via open-webui
|
# via open-webui
|
||||||
duckduckgo-search==6.1.5
|
duckduckgo-search==6.2.6
|
||||||
# via open-webui
|
# via open-webui
|
||||||
easygui==0.98.3
|
easygui==0.98.3
|
||||||
# via oletools
|
# via oletools
|
||||||
@@ -166,7 +179,7 @@ frozenlist==1.4.1
|
|||||||
fsspec==2024.3.1
|
fsspec==2024.3.1
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
# via torch
|
# via torch
|
||||||
google-ai-generativelanguage==0.6.4
|
google-ai-generativelanguage==0.6.6
|
||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
google-api-core==2.19.0
|
google-api-core==2.19.0
|
||||||
# via google-ai-generativelanguage
|
# via google-ai-generativelanguage
|
||||||
@@ -183,7 +196,7 @@ google-auth==2.29.0
|
|||||||
# via kubernetes
|
# via kubernetes
|
||||||
google-auth-httplib2==0.2.0
|
google-auth-httplib2==0.2.0
|
||||||
# via google-api-python-client
|
# via google-api-python-client
|
||||||
google-generativeai==0.5.4
|
google-generativeai==0.7.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
googleapis-common-protos==1.63.0
|
googleapis-common-protos==1.63.0
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
@@ -208,8 +221,11 @@ httplib2==0.22.0
|
|||||||
httptools==0.6.1
|
httptools==0.6.1
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
httpx==0.27.0
|
httpx==0.27.0
|
||||||
|
# via anthropic
|
||||||
|
# via chromadb
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via langfuse
|
# via langfuse
|
||||||
|
# via openai
|
||||||
huggingface-hub==0.23.0
|
huggingface-hub==0.23.0
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
@@ -229,12 +245,16 @@ importlib-metadata==7.0.0
|
|||||||
# via opentelemetry-api
|
# via opentelemetry-api
|
||||||
importlib-resources==6.4.0
|
importlib-resources==6.4.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
|
iniconfig==2.0.0
|
||||||
|
# via pytest
|
||||||
itsdangerous==2.2.0
|
itsdangerous==2.2.0
|
||||||
# via flask
|
# via flask
|
||||||
jinja2==3.1.4
|
jinja2==3.1.4
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via flask
|
# via flask
|
||||||
# via torch
|
# via torch
|
||||||
|
jiter==0.5.0
|
||||||
|
# via anthropic
|
||||||
jmespath==1.0.1
|
jmespath==1.0.1
|
||||||
# via boto3
|
# via boto3
|
||||||
# via botocore
|
# via botocore
|
||||||
@@ -249,14 +269,14 @@ jsonpointer==2.4
|
|||||||
# via jsonpatch
|
# via jsonpatch
|
||||||
kubernetes==29.0.0
|
kubernetes==29.0.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
langchain==0.2.0
|
langchain==0.2.11
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langchain-chroma==0.1.1
|
langchain-chroma==0.1.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langchain-community==0.2.0
|
langchain-community==0.2.10
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langchain-core==0.2.1
|
langchain-core==0.2.28
|
||||||
# via langchain
|
# via langchain
|
||||||
# via langchain-chroma
|
# via langchain-chroma
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
@@ -265,22 +285,26 @@ langchain-text-splitters==0.2.0
|
|||||||
# via langchain
|
# via langchain
|
||||||
langdetect==1.0.9
|
langdetect==1.0.9
|
||||||
# via unstructured
|
# via unstructured
|
||||||
langfuse==2.33.0
|
langfuse==2.39.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langsmith==0.1.57
|
langsmith==0.1.96
|
||||||
# via langchain
|
# via langchain
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via langchain-core
|
# via langchain-core
|
||||||
lark==1.1.8
|
lark==1.1.8
|
||||||
# via rtfde
|
# via rtfde
|
||||||
lxml==5.2.2
|
lxml==5.2.2
|
||||||
|
# via python-pptx
|
||||||
# via unstructured
|
# via unstructured
|
||||||
|
mako==1.3.5
|
||||||
|
# via alembic
|
||||||
markdown==3.6
|
markdown==3.6
|
||||||
# via open-webui
|
# via open-webui
|
||||||
markdown-it-py==3.0.0
|
markdown-it-py==3.0.0
|
||||||
# via rich
|
# via rich
|
||||||
markupsafe==2.1.5
|
markupsafe==2.1.5
|
||||||
# via jinja2
|
# via jinja2
|
||||||
|
# via mako
|
||||||
# via werkzeug
|
# via werkzeug
|
||||||
marshmallow==3.21.2
|
marshmallow==3.21.2
|
||||||
# via dataclasses-json
|
# via dataclasses-json
|
||||||
@@ -339,11 +363,13 @@ onnxruntime==1.17.3
|
|||||||
# via chromadb
|
# via chromadb
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
|
openai==1.38.0
|
||||||
|
# via open-webui
|
||||||
opencv-python==4.9.0.80
|
opencv-python==4.9.0.80
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
opencv-python-headless==4.9.0.80
|
opencv-python-headless==4.10.0.84
|
||||||
# via open-webui
|
# via open-webui
|
||||||
openpyxl==3.1.2
|
openpyxl==3.1.5
|
||||||
# via open-webui
|
# via open-webui
|
||||||
opentelemetry-api==1.24.0
|
opentelemetry-api==1.24.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
@@ -380,7 +406,6 @@ ordered-set==4.1.0
|
|||||||
# via deepdiff
|
# via deepdiff
|
||||||
orjson==3.10.3
|
orjson==3.10.3
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via duckduckgo-search
|
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via langsmith
|
# via langsmith
|
||||||
overrides==7.7.0
|
overrides==7.7.0
|
||||||
@@ -393,6 +418,7 @@ packaging==23.2
|
|||||||
# via langfuse
|
# via langfuse
|
||||||
# via marshmallow
|
# via marshmallow
|
||||||
# via onnxruntime
|
# via onnxruntime
|
||||||
|
# via pytest
|
||||||
# via transformers
|
# via transformers
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
pandas==2.2.2
|
pandas==2.2.2
|
||||||
@@ -403,19 +429,24 @@ pathspec==0.12.1
|
|||||||
# via black
|
# via black
|
||||||
pcodedmp==1.2.6
|
pcodedmp==1.2.6
|
||||||
# via oletools
|
# via oletools
|
||||||
peewee==3.17.5
|
peewee==3.17.6
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via peewee-migrate
|
# via peewee-migrate
|
||||||
peewee-migrate==1.12.2
|
peewee-migrate==1.12.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pillow==10.3.0
|
pillow==10.3.0
|
||||||
# via fpdf2
|
# via fpdf2
|
||||||
|
# via python-pptx
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
platformdirs==4.2.1
|
platformdirs==4.2.1
|
||||||
# via black
|
# via black
|
||||||
|
pluggy==1.5.0
|
||||||
|
# via pytest
|
||||||
posthog==3.5.0
|
posthog==3.5.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
|
primp==0.5.5
|
||||||
|
# via duckduckgo-search
|
||||||
proto-plus==1.23.0
|
proto-plus==1.23.0
|
||||||
# via google-ai-generativelanguage
|
# via google-ai-generativelanguage
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
@@ -428,6 +459,9 @@ protobuf==4.25.3
|
|||||||
# via onnxruntime
|
# via onnxruntime
|
||||||
# via opentelemetry-proto
|
# via opentelemetry-proto
|
||||||
# via proto-plus
|
# via proto-plus
|
||||||
|
psutil==6.0.0
|
||||||
|
# via open-webui
|
||||||
|
# via unstructured
|
||||||
psycopg2-binary==2.9.9
|
psycopg2-binary==2.9.9
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pyasn1==0.6.0
|
pyasn1==0.6.0
|
||||||
@@ -440,7 +474,8 @@ pyclipper==1.3.0.post5
|
|||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
pycparser==2.22
|
pycparser==2.22
|
||||||
# via cffi
|
# via cffi
|
||||||
pydantic==2.7.1
|
pydantic==2.8.2
|
||||||
|
# via anthropic
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
@@ -449,7 +484,8 @@ pydantic==2.7.1
|
|||||||
# via langfuse
|
# via langfuse
|
||||||
# via langsmith
|
# via langsmith
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pydantic-core==2.18.2
|
# via openai
|
||||||
|
pydantic-core==2.20.1
|
||||||
# via pydantic
|
# via pydantic
|
||||||
pydub==0.25.1
|
pydub==0.25.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
@@ -457,22 +493,27 @@ pygments==2.18.0
|
|||||||
# via rich
|
# via rich
|
||||||
pyjwt==2.8.0
|
pyjwt==2.8.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pymysql==1.1.0
|
pymongo==4.8.0
|
||||||
|
# via open-webui
|
||||||
|
pymysql==1.1.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pypandoc==1.13
|
pypandoc==1.13
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pyparsing==2.4.7
|
pyparsing==2.4.7
|
||||||
# via httplib2
|
# via httplib2
|
||||||
# via oletools
|
# via oletools
|
||||||
pypdf==4.2.0
|
pypdf==4.3.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
pypika==0.48.9
|
pypika==0.48.9
|
||||||
# via chromadb
|
# via chromadb
|
||||||
pyproject-hooks==1.1.0
|
pyproject-hooks==1.1.0
|
||||||
# via build
|
# via build
|
||||||
pyreqwest-impersonate==0.4.7
|
pytest==8.2.2
|
||||||
# via duckduckgo-search
|
# via open-webui
|
||||||
|
# via pytest-docker
|
||||||
|
pytest-docker==3.1.1
|
||||||
|
# via open-webui
|
||||||
python-dateutil==2.9.0.post0
|
python-dateutil==2.9.0.post0
|
||||||
# via botocore
|
# via botocore
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
@@ -492,7 +533,9 @@ python-magic==0.4.27
|
|||||||
python-multipart==0.0.9
|
python-multipart==0.0.9
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via open-webui
|
# via open-webui
|
||||||
python-socketio==5.11.2
|
python-pptx==1.0.0
|
||||||
|
# via open-webui
|
||||||
|
python-socketio==5.11.3
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pytube==15.0.0
|
pytube==15.0.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
@@ -516,15 +559,18 @@ rank-bm25==0.2.2
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
rapidfuzz==3.9.0
|
rapidfuzz==3.9.0
|
||||||
# via unstructured
|
# via unstructured
|
||||||
rapidocr-onnxruntime==1.3.22
|
rapidocr-onnxruntime==1.3.24
|
||||||
# via open-webui
|
# via open-webui
|
||||||
red-black-tree-mod==1.20
|
red-black-tree-mod==1.20
|
||||||
# via extract-msg
|
# via extract-msg
|
||||||
|
redis==5.0.8
|
||||||
|
# via open-webui
|
||||||
regex==2024.5.10
|
regex==2024.5.10
|
||||||
# via nltk
|
# via nltk
|
||||||
|
# via tiktoken
|
||||||
# via transformers
|
# via transformers
|
||||||
requests==2.32.2
|
requests==2.32.3
|
||||||
# via chromadb
|
# via docker
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
@@ -534,6 +580,7 @@ requests==2.32.2
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
# via posthog
|
# via posthog
|
||||||
# via requests-oauthlib
|
# via requests-oauthlib
|
||||||
|
# via tiktoken
|
||||||
# via transformers
|
# via transformers
|
||||||
# via unstructured
|
# via unstructured
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
@@ -556,12 +603,12 @@ scikit-learn==1.4.2
|
|||||||
scipy==1.13.0
|
scipy==1.13.0
|
||||||
# via scikit-learn
|
# via scikit-learn
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
sentence-transformers==2.7.0
|
sentence-transformers==3.0.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
setuptools==69.5.1
|
setuptools==69.5.1
|
||||||
# via ctranslate2
|
# via ctranslate2
|
||||||
# via opentelemetry-instrumentation
|
# via opentelemetry-instrumentation
|
||||||
shapely==2.0.4
|
shapely==2.0.5
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
shellingham==1.5.4
|
shellingham==1.5.4
|
||||||
# via typer
|
# via typer
|
||||||
@@ -577,13 +624,17 @@ six==1.16.0
|
|||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
sniffio==1.3.1
|
sniffio==1.3.1
|
||||||
|
# via anthropic
|
||||||
# via anyio
|
# via anyio
|
||||||
# via httpx
|
# via httpx
|
||||||
|
# via openai
|
||||||
soupsieve==2.5
|
soupsieve==2.5
|
||||||
# via beautifulsoup4
|
# via beautifulsoup4
|
||||||
sqlalchemy==2.0.30
|
sqlalchemy==2.0.31
|
||||||
|
# via alembic
|
||||||
# via langchain
|
# via langchain
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
|
# via open-webui
|
||||||
starlette==0.37.2
|
starlette==0.37.2
|
||||||
# via fastapi
|
# via fastapi
|
||||||
sympy==1.12
|
sympy==1.12
|
||||||
@@ -598,7 +649,10 @@ tenacity==8.3.0
|
|||||||
# via langchain-core
|
# via langchain-core
|
||||||
threadpoolctl==3.5.0
|
threadpoolctl==3.5.0
|
||||||
# via scikit-learn
|
# via scikit-learn
|
||||||
|
tiktoken==0.7.0
|
||||||
|
# via open-webui
|
||||||
tokenizers==0.15.2
|
tokenizers==0.15.2
|
||||||
|
# via anthropic
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
# via transformers
|
# via transformers
|
||||||
@@ -609,21 +663,28 @@ tqdm==4.66.4
|
|||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
# via nltk
|
# via nltk
|
||||||
|
# via openai
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
# via transformers
|
# via transformers
|
||||||
|
# via unstructured
|
||||||
transformers==4.39.3
|
transformers==4.39.3
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
typer==0.12.3
|
typer==0.12.3
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via fastapi-cli
|
# via fastapi-cli
|
||||||
typing-extensions==4.11.0
|
typing-extensions==4.11.0
|
||||||
|
# via alembic
|
||||||
|
# via anthropic
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
|
# via langchain-core
|
||||||
|
# via openai
|
||||||
# via opentelemetry-sdk
|
# via opentelemetry-sdk
|
||||||
# via pydantic
|
# via pydantic
|
||||||
# via pydantic-core
|
# via pydantic-core
|
||||||
|
# via python-pptx
|
||||||
# via sqlalchemy
|
# via sqlalchemy
|
||||||
# via torch
|
# via torch
|
||||||
# via typer
|
# via typer
|
||||||
@@ -640,7 +701,7 @@ tzlocal==5.2
|
|||||||
# via extract-msg
|
# via extract-msg
|
||||||
ujson==5.10.0
|
ujson==5.10.0
|
||||||
# via fastapi
|
# via fastapi
|
||||||
unstructured==0.14.0
|
unstructured==0.15.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
unstructured-client==0.22.0
|
unstructured-client==0.22.0
|
||||||
# via unstructured
|
# via unstructured
|
||||||
@@ -648,6 +709,7 @@ uritemplate==4.1.1
|
|||||||
# via google-api-python-client
|
# via google-api-python-client
|
||||||
urllib3==2.2.1
|
urllib3==2.2.1
|
||||||
# via botocore
|
# via botocore
|
||||||
|
# via docker
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
# via requests
|
# via requests
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
@@ -657,7 +719,7 @@ uvicorn==0.22.0
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
uvloop==0.19.0
|
uvloop==0.19.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
validators==0.28.1
|
validators==0.33.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
watchfiles==0.21.0
|
watchfiles==0.21.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
@@ -676,6 +738,8 @@ wsproto==1.2.0
|
|||||||
# via simple-websocket
|
# via simple-websocket
|
||||||
xlrd==2.0.1
|
xlrd==2.0.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
|
xlsxwriter==3.2.0
|
||||||
|
# via python-pptx
|
||||||
yarl==1.9.4
|
yarl==1.9.4
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
youtube-transcript-api==0.6.2
|
youtube-transcript-api==0.6.2
|
||||||
|
|||||||
+99
-35
@@ -16,10 +16,17 @@ aiohttp==3.9.5
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
aiosignal==1.3.1
|
aiosignal==1.3.1
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
|
alembic==1.13.2
|
||||||
|
# via open-webui
|
||||||
annotated-types==0.6.0
|
annotated-types==0.6.0
|
||||||
# via pydantic
|
# via pydantic
|
||||||
anyio==4.3.0
|
anthropic==0.32.0
|
||||||
|
# via open-webui
|
||||||
|
anyio==4.4.0
|
||||||
|
# via anthropic
|
||||||
# via httpx
|
# via httpx
|
||||||
|
# via langfuse
|
||||||
|
# via openai
|
||||||
# via starlette
|
# via starlette
|
||||||
# via watchfiles
|
# via watchfiles
|
||||||
apscheduler==3.10.4
|
apscheduler==3.10.4
|
||||||
@@ -32,6 +39,7 @@ asgiref==3.8.1
|
|||||||
# via opentelemetry-instrumentation-asgi
|
# via opentelemetry-instrumentation-asgi
|
||||||
attrs==23.2.0
|
attrs==23.2.0
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
|
# via pytest-docker
|
||||||
authlib==1.3.1
|
authlib==1.3.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
av==11.0.0
|
av==11.0.0
|
||||||
@@ -49,13 +57,13 @@ beautifulsoup4==4.12.3
|
|||||||
# via unstructured
|
# via unstructured
|
||||||
bidict==0.23.1
|
bidict==0.23.1
|
||||||
# via python-socketio
|
# via python-socketio
|
||||||
black==24.4.2
|
black==24.8.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
blinker==1.8.2
|
blinker==1.8.2
|
||||||
# via flask
|
# via flask
|
||||||
boto3==1.34.110
|
boto3==1.34.153
|
||||||
# via open-webui
|
# via open-webui
|
||||||
botocore==1.34.110
|
botocore==1.34.155
|
||||||
# via boto3
|
# via boto3
|
||||||
# via s3transfer
|
# via s3transfer
|
||||||
build==1.2.1
|
build==1.2.1
|
||||||
@@ -76,9 +84,9 @@ chardet==5.2.0
|
|||||||
charset-normalizer==3.3.2
|
charset-normalizer==3.3.2
|
||||||
# via requests
|
# via requests
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
chroma-hnswlib==0.7.3
|
chroma-hnswlib==0.7.5
|
||||||
# via chromadb
|
# via chromadb
|
||||||
chromadb==0.5.0
|
chromadb==0.5.4
|
||||||
# via langchain-chroma
|
# via langchain-chroma
|
||||||
# via open-webui
|
# via open-webui
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
@@ -102,7 +110,6 @@ cryptography==42.0.7
|
|||||||
ctranslate2==4.2.1
|
ctranslate2==4.2.1
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
dataclasses-json==0.6.6
|
dataclasses-json==0.6.6
|
||||||
# via langchain
|
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via unstructured
|
# via unstructured
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
@@ -113,11 +120,17 @@ defusedxml==0.7.1
|
|||||||
deprecated==1.2.14
|
deprecated==1.2.14
|
||||||
# via opentelemetry-api
|
# via opentelemetry-api
|
||||||
# via opentelemetry-exporter-otlp-proto-grpc
|
# via opentelemetry-exporter-otlp-proto-grpc
|
||||||
|
distro==1.9.0
|
||||||
|
# via anthropic
|
||||||
|
# via openai
|
||||||
dnspython==2.6.1
|
dnspython==2.6.1
|
||||||
# via email-validator
|
# via email-validator
|
||||||
|
# via pymongo
|
||||||
|
docker==7.1.0
|
||||||
|
# via open-webui
|
||||||
docx2txt==0.8
|
docx2txt==0.8
|
||||||
# via open-webui
|
# via open-webui
|
||||||
duckduckgo-search==6.1.5
|
duckduckgo-search==6.2.6
|
||||||
# via open-webui
|
# via open-webui
|
||||||
easygui==0.98.3
|
easygui==0.98.3
|
||||||
# via oletools
|
# via oletools
|
||||||
@@ -166,7 +179,7 @@ frozenlist==1.4.1
|
|||||||
fsspec==2024.3.1
|
fsspec==2024.3.1
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
# via torch
|
# via torch
|
||||||
google-ai-generativelanguage==0.6.4
|
google-ai-generativelanguage==0.6.6
|
||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
google-api-core==2.19.0
|
google-api-core==2.19.0
|
||||||
# via google-ai-generativelanguage
|
# via google-ai-generativelanguage
|
||||||
@@ -183,7 +196,7 @@ google-auth==2.29.0
|
|||||||
# via kubernetes
|
# via kubernetes
|
||||||
google-auth-httplib2==0.2.0
|
google-auth-httplib2==0.2.0
|
||||||
# via google-api-python-client
|
# via google-api-python-client
|
||||||
google-generativeai==0.5.4
|
google-generativeai==0.7.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
googleapis-common-protos==1.63.0
|
googleapis-common-protos==1.63.0
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
@@ -208,8 +221,11 @@ httplib2==0.22.0
|
|||||||
httptools==0.6.1
|
httptools==0.6.1
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
httpx==0.27.0
|
httpx==0.27.0
|
||||||
|
# via anthropic
|
||||||
|
# via chromadb
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via langfuse
|
# via langfuse
|
||||||
|
# via openai
|
||||||
huggingface-hub==0.23.0
|
huggingface-hub==0.23.0
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
@@ -229,12 +245,16 @@ importlib-metadata==7.0.0
|
|||||||
# via opentelemetry-api
|
# via opentelemetry-api
|
||||||
importlib-resources==6.4.0
|
importlib-resources==6.4.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
|
iniconfig==2.0.0
|
||||||
|
# via pytest
|
||||||
itsdangerous==2.2.0
|
itsdangerous==2.2.0
|
||||||
# via flask
|
# via flask
|
||||||
jinja2==3.1.4
|
jinja2==3.1.4
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via flask
|
# via flask
|
||||||
# via torch
|
# via torch
|
||||||
|
jiter==0.5.0
|
||||||
|
# via anthropic
|
||||||
jmespath==1.0.1
|
jmespath==1.0.1
|
||||||
# via boto3
|
# via boto3
|
||||||
# via botocore
|
# via botocore
|
||||||
@@ -249,14 +269,14 @@ jsonpointer==2.4
|
|||||||
# via jsonpatch
|
# via jsonpatch
|
||||||
kubernetes==29.0.0
|
kubernetes==29.0.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
langchain==0.2.0
|
langchain==0.2.11
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langchain-chroma==0.1.1
|
langchain-chroma==0.1.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langchain-community==0.2.0
|
langchain-community==0.2.10
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langchain-core==0.2.1
|
langchain-core==0.2.28
|
||||||
# via langchain
|
# via langchain
|
||||||
# via langchain-chroma
|
# via langchain-chroma
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
@@ -265,22 +285,26 @@ langchain-text-splitters==0.2.0
|
|||||||
# via langchain
|
# via langchain
|
||||||
langdetect==1.0.9
|
langdetect==1.0.9
|
||||||
# via unstructured
|
# via unstructured
|
||||||
langfuse==2.33.0
|
langfuse==2.39.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
langsmith==0.1.57
|
langsmith==0.1.96
|
||||||
# via langchain
|
# via langchain
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
# via langchain-core
|
# via langchain-core
|
||||||
lark==1.1.8
|
lark==1.1.8
|
||||||
# via rtfde
|
# via rtfde
|
||||||
lxml==5.2.2
|
lxml==5.2.2
|
||||||
|
# via python-pptx
|
||||||
# via unstructured
|
# via unstructured
|
||||||
|
mako==1.3.5
|
||||||
|
# via alembic
|
||||||
markdown==3.6
|
markdown==3.6
|
||||||
# via open-webui
|
# via open-webui
|
||||||
markdown-it-py==3.0.0
|
markdown-it-py==3.0.0
|
||||||
# via rich
|
# via rich
|
||||||
markupsafe==2.1.5
|
markupsafe==2.1.5
|
||||||
# via jinja2
|
# via jinja2
|
||||||
|
# via mako
|
||||||
# via werkzeug
|
# via werkzeug
|
||||||
marshmallow==3.21.2
|
marshmallow==3.21.2
|
||||||
# via dataclasses-json
|
# via dataclasses-json
|
||||||
@@ -339,11 +363,13 @@ onnxruntime==1.17.3
|
|||||||
# via chromadb
|
# via chromadb
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
|
openai==1.38.0
|
||||||
|
# via open-webui
|
||||||
opencv-python==4.9.0.80
|
opencv-python==4.9.0.80
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
opencv-python-headless==4.9.0.80
|
opencv-python-headless==4.10.0.84
|
||||||
# via open-webui
|
# via open-webui
|
||||||
openpyxl==3.1.2
|
openpyxl==3.1.5
|
||||||
# via open-webui
|
# via open-webui
|
||||||
opentelemetry-api==1.24.0
|
opentelemetry-api==1.24.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
@@ -380,7 +406,6 @@ ordered-set==4.1.0
|
|||||||
# via deepdiff
|
# via deepdiff
|
||||||
orjson==3.10.3
|
orjson==3.10.3
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via duckduckgo-search
|
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via langsmith
|
# via langsmith
|
||||||
overrides==7.7.0
|
overrides==7.7.0
|
||||||
@@ -393,6 +418,7 @@ packaging==23.2
|
|||||||
# via langfuse
|
# via langfuse
|
||||||
# via marshmallow
|
# via marshmallow
|
||||||
# via onnxruntime
|
# via onnxruntime
|
||||||
|
# via pytest
|
||||||
# via transformers
|
# via transformers
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
pandas==2.2.2
|
pandas==2.2.2
|
||||||
@@ -403,19 +429,24 @@ pathspec==0.12.1
|
|||||||
# via black
|
# via black
|
||||||
pcodedmp==1.2.6
|
pcodedmp==1.2.6
|
||||||
# via oletools
|
# via oletools
|
||||||
peewee==3.17.5
|
peewee==3.17.6
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via peewee-migrate
|
# via peewee-migrate
|
||||||
peewee-migrate==1.12.2
|
peewee-migrate==1.12.2
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pillow==10.3.0
|
pillow==10.3.0
|
||||||
# via fpdf2
|
# via fpdf2
|
||||||
|
# via python-pptx
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
platformdirs==4.2.1
|
platformdirs==4.2.1
|
||||||
# via black
|
# via black
|
||||||
|
pluggy==1.5.0
|
||||||
|
# via pytest
|
||||||
posthog==3.5.0
|
posthog==3.5.0
|
||||||
# via chromadb
|
# via chromadb
|
||||||
|
primp==0.5.5
|
||||||
|
# via duckduckgo-search
|
||||||
proto-plus==1.23.0
|
proto-plus==1.23.0
|
||||||
# via google-ai-generativelanguage
|
# via google-ai-generativelanguage
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
@@ -428,6 +459,9 @@ protobuf==4.25.3
|
|||||||
# via onnxruntime
|
# via onnxruntime
|
||||||
# via opentelemetry-proto
|
# via opentelemetry-proto
|
||||||
# via proto-plus
|
# via proto-plus
|
||||||
|
psutil==6.0.0
|
||||||
|
# via open-webui
|
||||||
|
# via unstructured
|
||||||
psycopg2-binary==2.9.9
|
psycopg2-binary==2.9.9
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pyasn1==0.6.0
|
pyasn1==0.6.0
|
||||||
@@ -440,7 +474,8 @@ pyclipper==1.3.0.post5
|
|||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
pycparser==2.22
|
pycparser==2.22
|
||||||
# via cffi
|
# via cffi
|
||||||
pydantic==2.7.1
|
pydantic==2.8.2
|
||||||
|
# via anthropic
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
@@ -449,7 +484,8 @@ pydantic==2.7.1
|
|||||||
# via langfuse
|
# via langfuse
|
||||||
# via langsmith
|
# via langsmith
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pydantic-core==2.18.2
|
# via openai
|
||||||
|
pydantic-core==2.20.1
|
||||||
# via pydantic
|
# via pydantic
|
||||||
pydub==0.25.1
|
pydub==0.25.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
@@ -457,22 +493,27 @@ pygments==2.18.0
|
|||||||
# via rich
|
# via rich
|
||||||
pyjwt==2.8.0
|
pyjwt==2.8.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pymysql==1.1.0
|
pymongo==4.8.0
|
||||||
|
# via open-webui
|
||||||
|
pymysql==1.1.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pypandoc==1.13
|
pypandoc==1.13
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pyparsing==2.4.7
|
pyparsing==2.4.7
|
||||||
# via httplib2
|
# via httplib2
|
||||||
# via oletools
|
# via oletools
|
||||||
pypdf==4.2.0
|
pypdf==4.3.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
pypika==0.48.9
|
pypika==0.48.9
|
||||||
# via chromadb
|
# via chromadb
|
||||||
pyproject-hooks==1.1.0
|
pyproject-hooks==1.1.0
|
||||||
# via build
|
# via build
|
||||||
pyreqwest-impersonate==0.4.7
|
pytest==8.2.2
|
||||||
# via duckduckgo-search
|
# via open-webui
|
||||||
|
# via pytest-docker
|
||||||
|
pytest-docker==3.1.1
|
||||||
|
# via open-webui
|
||||||
python-dateutil==2.9.0.post0
|
python-dateutil==2.9.0.post0
|
||||||
# via botocore
|
# via botocore
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
@@ -492,7 +533,9 @@ python-magic==0.4.27
|
|||||||
python-multipart==0.0.9
|
python-multipart==0.0.9
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via open-webui
|
# via open-webui
|
||||||
python-socketio==5.11.2
|
python-pptx==1.0.0
|
||||||
|
# via open-webui
|
||||||
|
python-socketio==5.11.3
|
||||||
# via open-webui
|
# via open-webui
|
||||||
pytube==15.0.0
|
pytube==15.0.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
@@ -516,15 +559,18 @@ rank-bm25==0.2.2
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
rapidfuzz==3.9.0
|
rapidfuzz==3.9.0
|
||||||
# via unstructured
|
# via unstructured
|
||||||
rapidocr-onnxruntime==1.3.22
|
rapidocr-onnxruntime==1.3.24
|
||||||
# via open-webui
|
# via open-webui
|
||||||
red-black-tree-mod==1.20
|
red-black-tree-mod==1.20
|
||||||
# via extract-msg
|
# via extract-msg
|
||||||
|
redis==5.0.8
|
||||||
|
# via open-webui
|
||||||
regex==2024.5.10
|
regex==2024.5.10
|
||||||
# via nltk
|
# via nltk
|
||||||
|
# via tiktoken
|
||||||
# via transformers
|
# via transformers
|
||||||
requests==2.32.2
|
requests==2.32.3
|
||||||
# via chromadb
|
# via docker
|
||||||
# via google-api-core
|
# via google-api-core
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
@@ -534,6 +580,7 @@ requests==2.32.2
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
# via posthog
|
# via posthog
|
||||||
# via requests-oauthlib
|
# via requests-oauthlib
|
||||||
|
# via tiktoken
|
||||||
# via transformers
|
# via transformers
|
||||||
# via unstructured
|
# via unstructured
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
@@ -556,12 +603,12 @@ scikit-learn==1.4.2
|
|||||||
scipy==1.13.0
|
scipy==1.13.0
|
||||||
# via scikit-learn
|
# via scikit-learn
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
sentence-transformers==2.7.0
|
sentence-transformers==3.0.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
setuptools==69.5.1
|
setuptools==69.5.1
|
||||||
# via ctranslate2
|
# via ctranslate2
|
||||||
# via opentelemetry-instrumentation
|
# via opentelemetry-instrumentation
|
||||||
shapely==2.0.4
|
shapely==2.0.5
|
||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
shellingham==1.5.4
|
shellingham==1.5.4
|
||||||
# via typer
|
# via typer
|
||||||
@@ -577,13 +624,17 @@ six==1.16.0
|
|||||||
# via rapidocr-onnxruntime
|
# via rapidocr-onnxruntime
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
sniffio==1.3.1
|
sniffio==1.3.1
|
||||||
|
# via anthropic
|
||||||
# via anyio
|
# via anyio
|
||||||
# via httpx
|
# via httpx
|
||||||
|
# via openai
|
||||||
soupsieve==2.5
|
soupsieve==2.5
|
||||||
# via beautifulsoup4
|
# via beautifulsoup4
|
||||||
sqlalchemy==2.0.30
|
sqlalchemy==2.0.31
|
||||||
|
# via alembic
|
||||||
# via langchain
|
# via langchain
|
||||||
# via langchain-community
|
# via langchain-community
|
||||||
|
# via open-webui
|
||||||
starlette==0.37.2
|
starlette==0.37.2
|
||||||
# via fastapi
|
# via fastapi
|
||||||
sympy==1.12
|
sympy==1.12
|
||||||
@@ -598,7 +649,10 @@ tenacity==8.3.0
|
|||||||
# via langchain-core
|
# via langchain-core
|
||||||
threadpoolctl==3.5.0
|
threadpoolctl==3.5.0
|
||||||
# via scikit-learn
|
# via scikit-learn
|
||||||
|
tiktoken==0.7.0
|
||||||
|
# via open-webui
|
||||||
tokenizers==0.15.2
|
tokenizers==0.15.2
|
||||||
|
# via anthropic
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via faster-whisper
|
# via faster-whisper
|
||||||
# via transformers
|
# via transformers
|
||||||
@@ -609,21 +663,28 @@ tqdm==4.66.4
|
|||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
# via nltk
|
# via nltk
|
||||||
|
# via openai
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
# via transformers
|
# via transformers
|
||||||
|
# via unstructured
|
||||||
transformers==4.39.3
|
transformers==4.39.3
|
||||||
# via sentence-transformers
|
# via sentence-transformers
|
||||||
typer==0.12.3
|
typer==0.12.3
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via fastapi-cli
|
# via fastapi-cli
|
||||||
typing-extensions==4.11.0
|
typing-extensions==4.11.0
|
||||||
|
# via alembic
|
||||||
|
# via anthropic
|
||||||
# via chromadb
|
# via chromadb
|
||||||
# via fastapi
|
# via fastapi
|
||||||
# via google-generativeai
|
# via google-generativeai
|
||||||
# via huggingface-hub
|
# via huggingface-hub
|
||||||
|
# via langchain-core
|
||||||
|
# via openai
|
||||||
# via opentelemetry-sdk
|
# via opentelemetry-sdk
|
||||||
# via pydantic
|
# via pydantic
|
||||||
# via pydantic-core
|
# via pydantic-core
|
||||||
|
# via python-pptx
|
||||||
# via sqlalchemy
|
# via sqlalchemy
|
||||||
# via torch
|
# via torch
|
||||||
# via typer
|
# via typer
|
||||||
@@ -640,7 +701,7 @@ tzlocal==5.2
|
|||||||
# via extract-msg
|
# via extract-msg
|
||||||
ujson==5.10.0
|
ujson==5.10.0
|
||||||
# via fastapi
|
# via fastapi
|
||||||
unstructured==0.14.0
|
unstructured==0.15.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
unstructured-client==0.22.0
|
unstructured-client==0.22.0
|
||||||
# via unstructured
|
# via unstructured
|
||||||
@@ -648,6 +709,7 @@ uritemplate==4.1.1
|
|||||||
# via google-api-python-client
|
# via google-api-python-client
|
||||||
urllib3==2.2.1
|
urllib3==2.2.1
|
||||||
# via botocore
|
# via botocore
|
||||||
|
# via docker
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
# via requests
|
# via requests
|
||||||
# via unstructured-client
|
# via unstructured-client
|
||||||
@@ -657,7 +719,7 @@ uvicorn==0.22.0
|
|||||||
# via open-webui
|
# via open-webui
|
||||||
uvloop==0.19.0
|
uvloop==0.19.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
validators==0.28.1
|
validators==0.33.0
|
||||||
# via open-webui
|
# via open-webui
|
||||||
watchfiles==0.21.0
|
watchfiles==0.21.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
@@ -676,6 +738,8 @@ wsproto==1.2.0
|
|||||||
# via simple-websocket
|
# via simple-websocket
|
||||||
xlrd==2.0.1
|
xlrd==2.0.1
|
||||||
# via open-webui
|
# via open-webui
|
||||||
|
xlsxwriter==3.2.0
|
||||||
|
# via python-pptx
|
||||||
yarl==1.9.4
|
yarl==1.9.4
|
||||||
# via aiohttp
|
# via aiohttp
|
||||||
youtube-transcript-api==0.6.2
|
youtube-transcript-api==0.6.2
|
||||||
|
|||||||
+13
@@ -154,3 +154,16 @@ input[type='number'] {
|
|||||||
.tippy-box[data-theme~='dark'] {
|
.tippy-box[data-theme~='dark'] {
|
||||||
@apply rounded-lg bg-gray-950 text-xs border border-gray-900 shadow-xl;
|
@apply rounded-lg bg-gray-950 text-xs border border-gray-900 shadow-xl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.password {
|
||||||
|
-webkit-text-security: disc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.codespan {
|
||||||
|
color: #eb5757;
|
||||||
|
border-width: 0px;
|
||||||
|
padding: 3px 8px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-weight: 600;
|
||||||
|
@apply rounded-md dark:bg-gray-800 bg-gray-100 mx-0.5;
|
||||||
|
}
|
||||||
|
|||||||
@@ -131,3 +131,59 @@ export const synthesizeOpenAISpeech = async (
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getModels = async (token: string = '') => {
|
||||||
|
let error = null;
|
||||||
|
|
||||||
|
const res = await fetch(`${AUDIO_API_BASE_URL}/models`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
Authorization: `Bearer ${token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(async (res) => {
|
||||||
|
if (!res.ok) throw await res.json();
|
||||||
|
return res.json();
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
error = err.detail;
|
||||||
|
console.log(err);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getVoices = async (token: string = '') => {
|
||||||
|
let error = null;
|
||||||
|
|
||||||
|
const res = await fetch(`${AUDIO_API_BASE_URL}/voices`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
Authorization: `Bearer ${token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(async (res) => {
|
||||||
|
if (!res.ok) throw await res.json();
|
||||||
|
return res.json();
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
error = err.detail;
|
||||||
|
console.log(err);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|||||||
@@ -32,10 +32,15 @@ export const createNewChat = async (token: string, chat: object) => {
|
|||||||
return res;
|
return res;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getChatList = async (token: string = '') => {
|
export const getChatList = async (token: string = '', page: number | null = null) => {
|
||||||
let error = null;
|
let error = null;
|
||||||
|
const searchParams = new URLSearchParams();
|
||||||
|
|
||||||
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/`, {
|
if (page !== null) {
|
||||||
|
searchParams.append('page', `${page}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await fetch(`${WEBUI_API_BASE_URL}/chats/?${searchParams.toString()}`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
Accept: 'application/json',
|
Accept: 'application/json',
|
||||||
|
|||||||
@@ -1,13 +1,19 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { getAudioConfig, updateAudioConfig } from '$lib/apis/audio';
|
|
||||||
import { user, settings, config } from '$lib/stores';
|
|
||||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
import Switch from '$lib/components/common/Switch.svelte';
|
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||||
import { getBackendConfig } from '$lib/apis';
|
|
||||||
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
import { getBackendConfig } from '$lib/apis';
|
||||||
|
import {
|
||||||
|
getAudioConfig,
|
||||||
|
updateAudioConfig,
|
||||||
|
getModels as _getModels,
|
||||||
|
getVoices as _getVoices
|
||||||
|
} from '$lib/apis/audio';
|
||||||
|
import { user, settings, config } from '$lib/stores';
|
||||||
|
|
||||||
|
import SensitiveInput from '$lib/components/common/SensitiveInput.svelte';
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
export let saveHandler: Function;
|
export let saveHandler: Function;
|
||||||
@@ -16,6 +22,7 @@
|
|||||||
|
|
||||||
let TTS_OPENAI_API_BASE_URL = '';
|
let TTS_OPENAI_API_BASE_URL = '';
|
||||||
let TTS_OPENAI_API_KEY = '';
|
let TTS_OPENAI_API_KEY = '';
|
||||||
|
let TTS_API_KEY = '';
|
||||||
let TTS_ENGINE = '';
|
let TTS_ENGINE = '';
|
||||||
let TTS_MODEL = '';
|
let TTS_MODEL = '';
|
||||||
let TTS_VOICE = '';
|
let TTS_VOICE = '';
|
||||||
@@ -29,30 +36,41 @@
|
|||||||
let models = [];
|
let models = [];
|
||||||
let nonLocalVoices = false;
|
let nonLocalVoices = false;
|
||||||
|
|
||||||
const getOpenAIVoices = () => {
|
const getModels = async () => {
|
||||||
voices = [
|
if (TTS_ENGINE === '') {
|
||||||
{ name: 'alloy' },
|
models = [];
|
||||||
{ name: 'echo' },
|
} else {
|
||||||
{ name: 'fable' },
|
const res = await _getModels(localStorage.token).catch((e) => {
|
||||||
{ name: 'onyx' },
|
toast.error(e);
|
||||||
{ name: 'nova' },
|
});
|
||||||
{ name: 'shimmer' }
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
const getOpenAIModels = () => {
|
if (res) {
|
||||||
models = [{ name: 'tts-1' }, { name: 'tts-1-hd' }];
|
console.log(res);
|
||||||
};
|
models = res.models;
|
||||||
|
|
||||||
const getWebAPIVoices = () => {
|
|
||||||
const getVoicesLoop = setInterval(async () => {
|
|
||||||
voices = await speechSynthesis.getVoices();
|
|
||||||
|
|
||||||
// do your loop
|
|
||||||
if (voices.length > 0) {
|
|
||||||
clearInterval(getVoicesLoop);
|
|
||||||
}
|
}
|
||||||
}, 100);
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getVoices = async () => {
|
||||||
|
if (TTS_ENGINE === '') {
|
||||||
|
const getVoicesLoop = setInterval(async () => {
|
||||||
|
voices = await speechSynthesis.getVoices();
|
||||||
|
|
||||||
|
// do your loop
|
||||||
|
if (voices.length > 0) {
|
||||||
|
clearInterval(getVoicesLoop);
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
} else {
|
||||||
|
const res = await _getVoices(localStorage.token).catch((e) => {
|
||||||
|
toast.error(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (res) {
|
||||||
|
console.log(res);
|
||||||
|
voices = res.voices;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateConfigHandler = async () => {
|
const updateConfigHandler = async () => {
|
||||||
@@ -60,6 +78,7 @@
|
|||||||
tts: {
|
tts: {
|
||||||
OPENAI_API_BASE_URL: TTS_OPENAI_API_BASE_URL,
|
OPENAI_API_BASE_URL: TTS_OPENAI_API_BASE_URL,
|
||||||
OPENAI_API_KEY: TTS_OPENAI_API_KEY,
|
OPENAI_API_KEY: TTS_OPENAI_API_KEY,
|
||||||
|
API_KEY: TTS_API_KEY,
|
||||||
ENGINE: TTS_ENGINE,
|
ENGINE: TTS_ENGINE,
|
||||||
MODEL: TTS_MODEL,
|
MODEL: TTS_MODEL,
|
||||||
VOICE: TTS_VOICE
|
VOICE: TTS_VOICE
|
||||||
@@ -86,6 +105,7 @@
|
|||||||
console.log(res);
|
console.log(res);
|
||||||
TTS_OPENAI_API_BASE_URL = res.tts.OPENAI_API_BASE_URL;
|
TTS_OPENAI_API_BASE_URL = res.tts.OPENAI_API_BASE_URL;
|
||||||
TTS_OPENAI_API_KEY = res.tts.OPENAI_API_KEY;
|
TTS_OPENAI_API_KEY = res.tts.OPENAI_API_KEY;
|
||||||
|
TTS_API_KEY = res.tts.API_KEY;
|
||||||
|
|
||||||
TTS_ENGINE = res.tts.ENGINE;
|
TTS_ENGINE = res.tts.ENGINE;
|
||||||
TTS_MODEL = res.tts.MODEL;
|
TTS_MODEL = res.tts.MODEL;
|
||||||
@@ -98,12 +118,8 @@
|
|||||||
STT_MODEL = res.stt.MODEL;
|
STT_MODEL = res.stt.MODEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TTS_ENGINE === 'openai') {
|
await getVoices();
|
||||||
getOpenAIVoices();
|
await getModels();
|
||||||
getOpenAIModels();
|
|
||||||
} else {
|
|
||||||
getWebAPIVoices();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -138,7 +154,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="mt-1 flex gap-2 mb-1">
|
<div class="mt-1 flex gap-2 mb-1">
|
||||||
<input
|
<input
|
||||||
class="flex-1 w-full rounded-l-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
placeholder={$i18n.t('API Base URL')}
|
placeholder={$i18n.t('API Base URL')}
|
||||||
bind:value={STT_OPENAI_API_BASE_URL}
|
bind:value={STT_OPENAI_API_BASE_URL}
|
||||||
required
|
required
|
||||||
@@ -182,19 +198,23 @@
|
|||||||
class=" dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
class=" dark:bg-gray-900 w-fit pr-8 rounded px-2 p-1 text-xs bg-transparent outline-none text-right"
|
||||||
bind:value={TTS_ENGINE}
|
bind:value={TTS_ENGINE}
|
||||||
placeholder="Select a mode"
|
placeholder="Select a mode"
|
||||||
on:change={(e) => {
|
on:change={async (e) => {
|
||||||
|
await updateConfigHandler();
|
||||||
|
await getVoices();
|
||||||
|
await getModels();
|
||||||
|
|
||||||
if (e.target.value === 'openai') {
|
if (e.target.value === 'openai') {
|
||||||
getOpenAIVoices();
|
|
||||||
TTS_VOICE = 'alloy';
|
TTS_VOICE = 'alloy';
|
||||||
TTS_MODEL = 'tts-1';
|
TTS_MODEL = 'tts-1';
|
||||||
} else {
|
} else {
|
||||||
getWebAPIVoices();
|
|
||||||
TTS_VOICE = '';
|
TTS_VOICE = '';
|
||||||
|
TTS_MODEL = '';
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<option value="">{$i18n.t('Web API')}</option>
|
<option value="">{$i18n.t('Web API')}</option>
|
||||||
<option value="openai">{$i18n.t('OpenAI')}</option>
|
<option value="openai">{$i18n.t('OpenAI')}</option>
|
||||||
|
<option value="elevenlabs">{$i18n.t('ElevenLabs')}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -203,7 +223,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="mt-1 flex gap-2 mb-1">
|
<div class="mt-1 flex gap-2 mb-1">
|
||||||
<input
|
<input
|
||||||
class="flex-1 w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
placeholder={$i18n.t('API Base URL')}
|
placeholder={$i18n.t('API Base URL')}
|
||||||
bind:value={TTS_OPENAI_API_BASE_URL}
|
bind:value={TTS_OPENAI_API_BASE_URL}
|
||||||
required
|
required
|
||||||
@@ -212,6 +232,17 @@
|
|||||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_OPENAI_API_KEY} />
|
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_OPENAI_API_KEY} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{:else if TTS_ENGINE === 'elevenlabs'}
|
||||||
|
<div>
|
||||||
|
<div class="mt-1 flex gap-2 mb-1">
|
||||||
|
<input
|
||||||
|
class="flex-1 w-full rounded-lg py-2 pl-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
|
placeholder={$i18n.t('API Key')}
|
||||||
|
bind:value={TTS_API_KEY}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<hr class=" dark:border-gray-850 my-2" />
|
<hr class=" dark:border-gray-850 my-2" />
|
||||||
@@ -252,7 +283,7 @@
|
|||||||
|
|
||||||
<datalist id="voice-list">
|
<datalist id="voice-list">
|
||||||
{#each voices as voice}
|
{#each voices as voice}
|
||||||
<option value={voice.name} />
|
<option value={voice.id}>{voice.name}</option>
|
||||||
{/each}
|
{/each}
|
||||||
</datalist>
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
@@ -263,15 +294,56 @@
|
|||||||
<div class="flex w-full">
|
<div class="flex w-full">
|
||||||
<div class="flex-1">
|
<div class="flex-1">
|
||||||
<input
|
<input
|
||||||
list="model-list"
|
list="tts-model-list"
|
||||||
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
bind:value={TTS_MODEL}
|
bind:value={TTS_MODEL}
|
||||||
placeholder="Select a model"
|
placeholder="Select a model"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<datalist id="model-list">
|
<datalist id="tts-model-list">
|
||||||
{#each models as model}
|
{#each models as model}
|
||||||
<option value={model.name} />
|
<option value={model.id} />
|
||||||
|
{/each}
|
||||||
|
</datalist>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{:else if TTS_ENGINE === 'elevenlabs'}
|
||||||
|
<div class=" flex gap-2">
|
||||||
|
<div class="w-full">
|
||||||
|
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Voice')}</div>
|
||||||
|
<div class="flex w-full">
|
||||||
|
<div class="flex-1">
|
||||||
|
<input
|
||||||
|
list="voice-list"
|
||||||
|
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
|
bind:value={TTS_VOICE}
|
||||||
|
placeholder="Select a voice"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<datalist id="voice-list">
|
||||||
|
{#each voices as voice}
|
||||||
|
<option value={voice.id}>{voice.name}</option>
|
||||||
|
{/each}
|
||||||
|
</datalist>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="w-full">
|
||||||
|
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('TTS Model')}</div>
|
||||||
|
<div class="flex w-full">
|
||||||
|
<div class="flex-1">
|
||||||
|
<input
|
||||||
|
list="tts-model-list"
|
||||||
|
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||||
|
bind:value={TTS_MODEL}
|
||||||
|
placeholder="Select a model"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<datalist id="tts-model-list">
|
||||||
|
{#each models as model}
|
||||||
|
<option value={model.id} />
|
||||||
{/each}
|
{/each}
|
||||||
</datalist>
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -269,7 +269,7 @@
|
|||||||
saveHandler();
|
saveHandler();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full">
|
<div class=" space-y-2.5 overflow-y-scroll scrollbar-hidden h-full pr-1.5">
|
||||||
<div class="flex flex-col gap-0.5">
|
<div class="flex flex-col gap-0.5">
|
||||||
<div class=" mb-0.5 text-sm font-medium">{$i18n.t('General Settings')}</div>
|
<div class=" mb-0.5 text-sm font-medium">{$i18n.t('General Settings')}</div>
|
||||||
|
|
||||||
@@ -615,7 +615,7 @@
|
|||||||
<div class=" ">
|
<div class=" ">
|
||||||
<div class=" text-sm font-medium">{$i18n.t('Query Params')}</div>
|
<div class=" text-sm font-medium">{$i18n.t('Query Params')}</div>
|
||||||
|
|
||||||
<div class=" flex">
|
<div class=" flex gap-1">
|
||||||
<div class=" flex w-full justify-between">
|
<div class=" flex w-full justify-between">
|
||||||
<div class="self-center text-xs font-medium min-w-fit">{$i18n.t('Top K')}</div>
|
<div class="self-center text-xs font-medium min-w-fit">{$i18n.t('Top K')}</div>
|
||||||
|
|
||||||
@@ -632,7 +632,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if querySettings.hybrid === true}
|
{#if querySettings.hybrid === true}
|
||||||
<div class="flex w-full">
|
<div class=" flex w-full justify-between">
|
||||||
<div class=" self-center text-xs font-medium min-w-fit">
|
<div class=" self-center text-xs font-medium min-w-fit">
|
||||||
{$i18n.t('Minimum Score')}
|
{$i18n.t('Minimum Score')}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -25,7 +25,8 @@
|
|||||||
user,
|
user,
|
||||||
socket,
|
socket,
|
||||||
showCallOverlay,
|
showCallOverlay,
|
||||||
tools
|
tools,
|
||||||
|
currentChatPage
|
||||||
} from '$lib/stores';
|
} from '$lib/stores';
|
||||||
import {
|
import {
|
||||||
convertMessagesToHistory,
|
convertMessagesToHistory,
|
||||||
@@ -80,6 +81,7 @@
|
|||||||
let eventConfirmationMessage = '';
|
let eventConfirmationMessage = '';
|
||||||
let eventConfirmationInput = false;
|
let eventConfirmationInput = false;
|
||||||
let eventConfirmationInputPlaceholder = '';
|
let eventConfirmationInputPlaceholder = '';
|
||||||
|
let eventConfirmationInputValue = '';
|
||||||
let eventCallback = null;
|
let eventCallback = null;
|
||||||
|
|
||||||
let showModelSelector = true;
|
let showModelSelector = true;
|
||||||
@@ -108,7 +110,6 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
let params = {};
|
let params = {};
|
||||||
let valves = {};
|
|
||||||
|
|
||||||
$: if (history.currentId !== null) {
|
$: if (history.currentId !== null) {
|
||||||
let _messages = [];
|
let _messages = [];
|
||||||
@@ -182,6 +183,7 @@
|
|||||||
eventConfirmationTitle = data.title;
|
eventConfirmationTitle = data.title;
|
||||||
eventConfirmationMessage = data.message;
|
eventConfirmationMessage = data.message;
|
||||||
eventConfirmationInputPlaceholder = data.placeholder;
|
eventConfirmationInputPlaceholder = data.placeholder;
|
||||||
|
eventConfirmationInputValue = data?.value ?? '';
|
||||||
} else {
|
} else {
|
||||||
console.log('Unknown message type', data);
|
console.log('Unknown message type', data);
|
||||||
}
|
}
|
||||||
@@ -281,6 +283,10 @@
|
|||||||
|
|
||||||
if ($page.url.searchParams.get('q')) {
|
if ($page.url.searchParams.get('q')) {
|
||||||
prompt = $page.url.searchParams.get('q') ?? '';
|
prompt = $page.url.searchParams.get('q') ?? '';
|
||||||
|
selectedToolIds = ($page.url.searchParams.get('tool_ids') ?? '')
|
||||||
|
.split(',')
|
||||||
|
.map((id) => id.trim())
|
||||||
|
.filter((id) => id);
|
||||||
|
|
||||||
if (prompt) {
|
if (prompt) {
|
||||||
await tick();
|
await tick();
|
||||||
@@ -416,7 +422,9 @@
|
|||||||
params: params,
|
params: params,
|
||||||
files: chatFiles
|
files: chatFiles
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -462,7 +470,9 @@
|
|||||||
params: params,
|
params: params,
|
||||||
files: chatFiles
|
files: chatFiles
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -622,7 +632,9 @@
|
|||||||
tags: [],
|
tags: [],
|
||||||
timestamp: Date.now()
|
timestamp: Date.now()
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
await chatId.set(chat.id);
|
await chatId.set(chat.id);
|
||||||
} else {
|
} else {
|
||||||
await chatId.set('local');
|
await chatId.set('local');
|
||||||
@@ -698,7 +710,9 @@
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
await chats.set(await getChatList(localStorage.token));
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
|
|
||||||
return _responses;
|
return _responses;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -706,6 +720,7 @@
|
|||||||
let _response = null;
|
let _response = null;
|
||||||
|
|
||||||
const responseMessage = history.messages[responseMessageId];
|
const responseMessage = history.messages[responseMessageId];
|
||||||
|
const userMessage = history.messages[responseMessage.parentId];
|
||||||
|
|
||||||
// Wait until history/message have been updated
|
// Wait until history/message have been updated
|
||||||
await tick();
|
await tick();
|
||||||
@@ -772,11 +787,12 @@
|
|||||||
if (model?.info?.meta?.knowledge ?? false) {
|
if (model?.info?.meta?.knowledge ?? false) {
|
||||||
files.push(...model.info.meta.knowledge);
|
files.push(...model.info.meta.knowledge);
|
||||||
}
|
}
|
||||||
if (responseMessage?.files) {
|
files.push(
|
||||||
files.push(
|
...(userMessage?.files ?? []).filter((item) =>
|
||||||
...responseMessage?.files.filter((item) => ['web_search_results'].includes(item.type))
|
['doc', 'file', 'collection'].includes(item.type)
|
||||||
);
|
),
|
||||||
}
|
...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type))
|
||||||
|
);
|
||||||
|
|
||||||
eventTarget.dispatchEvent(
|
eventTarget.dispatchEvent(
|
||||||
new CustomEvent('chat:start', {
|
new CustomEvent('chat:start', {
|
||||||
@@ -796,8 +812,8 @@
|
|||||||
...(params ?? $settings.params ?? {}),
|
...(params ?? $settings.params ?? {}),
|
||||||
stop:
|
stop:
|
||||||
params?.stop ?? $settings?.params?.stop ?? undefined
|
params?.stop ?? $settings?.params?.stop ?? undefined
|
||||||
? (params?.stop ?? $settings.params.stop).map((str) =>
|
? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map(
|
||||||
decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"'))
|
(str) => decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"'))
|
||||||
)
|
)
|
||||||
: undefined,
|
: undefined,
|
||||||
num_predict: params?.max_tokens ?? $settings?.params?.max_tokens ?? undefined,
|
num_predict: params?.max_tokens ?? $settings?.params?.max_tokens ?? undefined,
|
||||||
@@ -808,7 +824,6 @@
|
|||||||
keep_alive: $settings.keepAlive ?? undefined,
|
keep_alive: $settings.keepAlive ?? undefined,
|
||||||
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
||||||
files: files.length > 0 ? files : undefined,
|
files: files.length > 0 ? files : undefined,
|
||||||
...(Object.keys(valves).length ? { valves } : {}),
|
|
||||||
session_id: $socket?.id,
|
session_id: $socket?.id,
|
||||||
chat_id: $chatId,
|
chat_id: $chatId,
|
||||||
id: responseMessageId
|
id: responseMessageId
|
||||||
@@ -943,7 +958,9 @@
|
|||||||
params: params,
|
params: params,
|
||||||
files: chatFiles
|
files: chatFiles
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1006,17 +1023,20 @@
|
|||||||
|
|
||||||
const sendPromptOpenAI = async (model, userPrompt, responseMessageId, _chatId) => {
|
const sendPromptOpenAI = async (model, userPrompt, responseMessageId, _chatId) => {
|
||||||
let _response = null;
|
let _response = null;
|
||||||
|
|
||||||
const responseMessage = history.messages[responseMessageId];
|
const responseMessage = history.messages[responseMessageId];
|
||||||
|
const userMessage = history.messages[responseMessage.parentId];
|
||||||
|
|
||||||
let files = JSON.parse(JSON.stringify(chatFiles));
|
let files = JSON.parse(JSON.stringify(chatFiles));
|
||||||
if (model?.info?.meta?.knowledge ?? false) {
|
if (model?.info?.meta?.knowledge ?? false) {
|
||||||
files.push(...model.info.meta.knowledge);
|
files.push(...model.info.meta.knowledge);
|
||||||
}
|
}
|
||||||
if (responseMessage?.files) {
|
files.push(
|
||||||
files.push(
|
...(userMessage?.files ?? []).filter((item) =>
|
||||||
...responseMessage?.files.filter((item) => ['web_search_results'].includes(item.type))
|
['doc', 'file', 'collection'].includes(item.type)
|
||||||
);
|
),
|
||||||
}
|
...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type))
|
||||||
|
);
|
||||||
|
|
||||||
scrollToBottom();
|
scrollToBottom();
|
||||||
|
|
||||||
@@ -1094,8 +1114,8 @@
|
|||||||
seed: params?.seed ?? $settings?.params?.seed ?? undefined,
|
seed: params?.seed ?? $settings?.params?.seed ?? undefined,
|
||||||
stop:
|
stop:
|
||||||
params?.stop ?? $settings?.params?.stop ?? undefined
|
params?.stop ?? $settings?.params?.stop ?? undefined
|
||||||
? (params?.stop ?? $settings.params.stop).map((str) =>
|
? (params?.stop.split(',').map((token) => token.trim()) ?? $settings.params.stop).map(
|
||||||
decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"'))
|
(str) => decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"'))
|
||||||
)
|
)
|
||||||
: undefined,
|
: undefined,
|
||||||
temperature: params?.temperature ?? $settings?.params?.temperature ?? undefined,
|
temperature: params?.temperature ?? $settings?.params?.temperature ?? undefined,
|
||||||
@@ -1105,7 +1125,6 @@
|
|||||||
max_tokens: params?.max_tokens ?? $settings?.params?.max_tokens ?? undefined,
|
max_tokens: params?.max_tokens ?? $settings?.params?.max_tokens ?? undefined,
|
||||||
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
||||||
files: files.length > 0 ? files : undefined,
|
files: files.length > 0 ? files : undefined,
|
||||||
...(Object.keys(valves).length ? { valves } : {}),
|
|
||||||
session_id: $socket?.id,
|
session_id: $socket?.id,
|
||||||
chat_id: $chatId,
|
chat_id: $chatId,
|
||||||
id: responseMessageId
|
id: responseMessageId
|
||||||
@@ -1120,7 +1139,6 @@
|
|||||||
|
|
||||||
if (res && res.ok && res.body) {
|
if (res && res.ok && res.body) {
|
||||||
const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks);
|
const textStream = await createOpenAITextStream(res.body, $settings.splitLargeChunks);
|
||||||
let lastUsage = null;
|
|
||||||
|
|
||||||
for await (const update of textStream) {
|
for await (const update of textStream) {
|
||||||
const { value, done, citations, error, usage } = update;
|
const { value, done, citations, error, usage } = update;
|
||||||
@@ -1146,7 +1164,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (usage) {
|
if (usage) {
|
||||||
lastUsage = usage;
|
responseMessage.info = { ...usage, openai: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (citations) {
|
if (citations) {
|
||||||
@@ -1200,10 +1218,6 @@
|
|||||||
document.getElementById(`speak-button-${responseMessage.id}`)?.click();
|
document.getElementById(`speak-button-${responseMessage.id}`)?.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastUsage) {
|
|
||||||
responseMessage.info = { ...lastUsage, openai: true };
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($chatId == _chatId) {
|
if ($chatId == _chatId) {
|
||||||
if ($settings.saveChatHistory ?? true) {
|
if ($settings.saveChatHistory ?? true) {
|
||||||
chat = await updateChatById(localStorage.token, _chatId, {
|
chat = await updateChatById(localStorage.token, _chatId, {
|
||||||
@@ -1213,7 +1227,9 @@
|
|||||||
params: params,
|
params: params,
|
||||||
files: chatFiles
|
files: chatFiles
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1378,7 +1394,9 @@
|
|||||||
|
|
||||||
if ($settings.saveChatHistory ?? true) {
|
if ($settings.saveChatHistory ?? true) {
|
||||||
chat = await updateChatById(localStorage.token, _chatId, { title: _title });
|
chat = await updateChatById(localStorage.token, _chatId, { title: _title });
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1484,6 +1502,7 @@
|
|||||||
message={eventConfirmationMessage}
|
message={eventConfirmationMessage}
|
||||||
input={eventConfirmationInput}
|
input={eventConfirmationInput}
|
||||||
inputPlaceholder={eventConfirmationInputPlaceholder}
|
inputPlaceholder={eventConfirmationInputPlaceholder}
|
||||||
|
inputValue={eventConfirmationInputValue}
|
||||||
on:confirm={(e) => {
|
on:confirm={(e) => {
|
||||||
if (e.detail) {
|
if (e.detail) {
|
||||||
eventCallback(e.detail);
|
eventCallback(e.detail);
|
||||||
@@ -1631,7 +1650,6 @@
|
|||||||
bind:show={showControls}
|
bind:show={showControls}
|
||||||
bind:chatFiles
|
bind:chatFiles
|
||||||
bind:params
|
bind:params
|
||||||
bind:valves
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -9,9 +9,7 @@
|
|||||||
export let models = [];
|
export let models = [];
|
||||||
|
|
||||||
export let chatId = null;
|
export let chatId = null;
|
||||||
|
|
||||||
export let chatFiles = [];
|
export let chatFiles = [];
|
||||||
export let valves = {};
|
|
||||||
export let params = {};
|
export let params = {};
|
||||||
|
|
||||||
let largeScreen = false;
|
let largeScreen = false;
|
||||||
@@ -50,7 +48,6 @@
|
|||||||
}}
|
}}
|
||||||
{models}
|
{models}
|
||||||
bind:chatFiles
|
bind:chatFiles
|
||||||
bind:valves
|
|
||||||
bind:params
|
bind:params
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -66,7 +63,6 @@
|
|||||||
}}
|
}}
|
||||||
{models}
|
{models}
|
||||||
bind:chatFiles
|
bind:chatFiles
|
||||||
bind:valves
|
|
||||||
bind:params
|
bind:params
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
|
|
||||||
import XMark from '$lib/components/icons/XMark.svelte';
|
import XMark from '$lib/components/icons/XMark.svelte';
|
||||||
import AdvancedParams from '../Settings/Advanced/AdvancedParams.svelte';
|
import AdvancedParams from '../Settings/Advanced/AdvancedParams.svelte';
|
||||||
import Valves from '$lib/components/common/Valves.svelte';
|
import Valves from '$lib/components/chat/Controls/Valves.svelte';
|
||||||
import FileItem from '$lib/components/common/FileItem.svelte';
|
import FileItem from '$lib/components/common/FileItem.svelte';
|
||||||
|
import Collapsible from '$lib/components/common/Collapsible.svelte';
|
||||||
|
|
||||||
export let models = [];
|
export let models = [];
|
||||||
|
|
||||||
export let chatFiles = [];
|
export let chatFiles = [];
|
||||||
export let valves = {};
|
|
||||||
export let params = {};
|
export let params = {};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -28,64 +28,59 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" dark:text-gray-200 text-sm font-primary">
|
<div class=" dark:text-gray-200 text-sm font-primary py-0.5">
|
||||||
{#if chatFiles.length > 0}
|
{#if chatFiles.length > 0}
|
||||||
<div>
|
<Collapsible title={$i18n.t('Files')} open={true}>
|
||||||
<div class="mb-1.5 font-medium">{$i18n.t('Files')}</div>
|
<div class="flex flex-col gap-1 mt-1.5" slot="content">
|
||||||
|
{#each chatFiles as file, fileIdx}
|
||||||
<div>
|
|
||||||
{#each chatFiles as file}
|
|
||||||
<FileItem
|
<FileItem
|
||||||
className="w-full"
|
className="w-full"
|
||||||
url={`${file?.url}`}
|
url={`${file?.url}`}
|
||||||
name={file.name}
|
name={file.name}
|
||||||
type={file.type}
|
type={file.type}
|
||||||
|
size={file?.size}
|
||||||
dismissible={true}
|
dismissible={true}
|
||||||
on:dismiss={() => {
|
on:dismiss={() => {
|
||||||
// Remove the file from the chatFiles array
|
// Remove the file from the chatFiles array
|
||||||
chatFiles = chatFiles.filter((f) => f.id !== file.id);
|
|
||||||
|
chatFiles.splice(fileIdx, 1);
|
||||||
|
chatFiles = chatFiles;
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Collapsible>
|
||||||
|
|
||||||
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if models.length === 1 && models[0]?.pipe?.valves_spec}
|
<Collapsible title={$i18n.t('Valves')}>
|
||||||
<div>
|
<div class="text-sm mt-1.5" slot="content">
|
||||||
<div class=" font-medium">{$i18n.t('Valves')}</div>
|
<Valves />
|
||||||
|
|
||||||
<div>
|
|
||||||
<Valves valvesSpec={models[0]?.pipe?.valves_spec} bind:valves />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</Collapsible>
|
||||||
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<div class="mb-1.5 font-medium">{$i18n.t('System Prompt')}</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<textarea
|
|
||||||
bind:value={params.system}
|
|
||||||
class="w-full rounded-lg px-4 py-3 text-sm dark:text-gray-300 dark:bg-gray-850 border border-gray-100 dark:border-gray-800 outline-none resize-none"
|
|
||||||
rows="3"
|
|
||||||
placeholder={$i18n.t('Enter system prompt')}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
||||||
|
|
||||||
<div>
|
<Collapsible title={$i18n.t('System Prompt')} open={true}>
|
||||||
<div class="mb-1.5 font-medium">{$i18n.t('Advanced Params')}</div>
|
<div class=" mt-1.5" slot="content">
|
||||||
|
<textarea
|
||||||
<div>
|
bind:value={params.system}
|
||||||
<AdvancedParams bind:params />
|
class="w-full rounded-lg px-3.5 py-2.5 text-sm dark:text-gray-300 dark:bg-gray-850 border border-gray-100 dark:border-gray-800 outline-none resize-none"
|
||||||
|
rows="4"
|
||||||
|
placeholder={$i18n.t('Enter system prompt')}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</Collapsible>
|
||||||
|
|
||||||
|
<hr class="my-2 border-gray-100 dark:border-gray-800" />
|
||||||
|
|
||||||
|
<Collapsible title={$i18n.t('Advanced Params')} open={true}>
|
||||||
|
<div class="text-sm mt-1.5" slot="content">
|
||||||
|
<div>
|
||||||
|
<AdvancedParams bind:params />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Collapsible>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+41
-43
@@ -15,18 +15,14 @@
|
|||||||
updateUserValvesById as updateFunctionUserValvesById
|
updateUserValvesById as updateFunctionUserValvesById
|
||||||
} from '$lib/apis/functions';
|
} from '$lib/apis/functions';
|
||||||
|
|
||||||
import ManageModal from './Personalization/ManageModal.svelte';
|
|
||||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||||
import Switch from '$lib/components/common/Switch.svelte';
|
|
||||||
import Valves from '$lib/components/common/Valves.svelte';
|
import Valves from '$lib/components/common/Valves.svelte';
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
export let saveSettings: Function;
|
|
||||||
|
|
||||||
let tab = 'tools';
|
let tab = 'tools';
|
||||||
let selectedId = '';
|
let selectedId = '';
|
||||||
|
|
||||||
@@ -35,6 +31,19 @@
|
|||||||
let valvesSpec = null;
|
let valvesSpec = null;
|
||||||
let valves = {};
|
let valves = {};
|
||||||
|
|
||||||
|
let debounceTimer;
|
||||||
|
|
||||||
|
const debounceSubmitHandler = async () => {
|
||||||
|
if (debounceTimer) {
|
||||||
|
clearTimeout(debounceTimer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set a new timer
|
||||||
|
debounceTimer = setTimeout(() => {
|
||||||
|
submitHandler();
|
||||||
|
}, 500); // 0.5 second debounce
|
||||||
|
};
|
||||||
|
|
||||||
const getUserValves = async () => {
|
const getUserValves = async () => {
|
||||||
loading = true;
|
loading = true;
|
||||||
if (tab === 'tools') {
|
if (tab === 'tools') {
|
||||||
@@ -112,53 +121,45 @@
|
|||||||
dispatch('save');
|
dispatch('save');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div class="flex flex-col pr-1.5 overflow-y-scroll max-h-[25rem]">
|
<div class="flex flex-col">
|
||||||
<div>
|
|
||||||
<div class="flex items-center justify-between mb-2">
|
|
||||||
<Tooltip content="">
|
|
||||||
<div class="text-sm font-medium">
|
|
||||||
{$i18n.t('Manage Valves')}
|
|
||||||
</div>
|
|
||||||
</Tooltip>
|
|
||||||
|
|
||||||
<div class=" self-end">
|
|
||||||
<select
|
|
||||||
class=" dark:bg-gray-900 w-fit pr-8 rounded text-xs bg-transparent outline-none text-right"
|
|
||||||
bind:value={tab}
|
|
||||||
placeholder="Select"
|
|
||||||
>
|
|
||||||
<option value="tools">{$i18n.t('Tools')}</option>
|
|
||||||
<option value="functions">{$i18n.t('Functions')}</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="space-y-1">
|
<div class="space-y-1">
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<div class="flex-1">
|
<div class="flex-1">
|
||||||
<select
|
<select
|
||||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
class=" w-full rounded text-xs py-2 px-1 bg-transparent outline-none"
|
||||||
|
bind:value={tab}
|
||||||
|
placeholder="Select"
|
||||||
|
>
|
||||||
|
<option value="tools" class="bg-gray-100 dark:bg-gray-800">{$i18n.t('Tools')}</option>
|
||||||
|
<option value="functions" class="bg-gray-100 dark:bg-gray-800"
|
||||||
|
>{$i18n.t('Functions')}</option
|
||||||
|
>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex-1">
|
||||||
|
<select
|
||||||
|
class="w-full rounded py-2 px-1 text-xs bg-transparent outline-none"
|
||||||
bind:value={selectedId}
|
bind:value={selectedId}
|
||||||
on:change={async () => {
|
on:change={async () => {
|
||||||
await tick();
|
await tick();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{#if tab === 'tools'}
|
{#if tab === 'tools'}
|
||||||
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-700"
|
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-800"
|
||||||
>{$i18n.t('Select a tool')}</option
|
>{$i18n.t('Select a tool')}</option
|
||||||
>
|
>
|
||||||
|
|
||||||
{#each $tools as tool, toolIdx}
|
{#each $tools as tool, toolIdx}
|
||||||
<option value={tool.id} class="bg-gray-100 dark:bg-gray-700">{tool.name}</option>
|
<option value={tool.id} class="bg-gray-100 dark:bg-gray-800">{tool.name}</option>
|
||||||
{/each}
|
{/each}
|
||||||
{:else if tab === 'functions'}
|
{:else if tab === 'functions'}
|
||||||
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-700"
|
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-800"
|
||||||
>{$i18n.t('Select a function')}</option
|
>{$i18n.t('Select a function')}</option
|
||||||
>
|
>
|
||||||
|
|
||||||
{#each $functions as func, funcIdx}
|
{#each $functions as func, funcIdx}
|
||||||
<option value={func.id} class="bg-gray-100 dark:bg-700">{func.name}</option>
|
<option value={func.id} class="bg-gray-100 dark:bg-gray-800">{func.name}</option>
|
||||||
{/each}
|
{/each}
|
||||||
{/if}
|
{/if}
|
||||||
</select>
|
</select>
|
||||||
@@ -167,24 +168,21 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if selectedId}
|
{#if selectedId}
|
||||||
<hr class="dark:border-gray-800 my-3 w-full" />
|
<hr class="dark:border-gray-800 my-1 w-full" />
|
||||||
|
|
||||||
<div>
|
<div class="my-2 text-xs">
|
||||||
{#if !loading}
|
{#if !loading}
|
||||||
<Valves {valvesSpec} bind:valves />
|
<Valves
|
||||||
|
{valvesSpec}
|
||||||
|
bind:valves
|
||||||
|
on:change={() => {
|
||||||
|
debounceSubmitHandler();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
{:else}
|
{:else}
|
||||||
<Spinner className="size-5" />
|
<Spinner className="size-5" />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex justify-end text-sm font-medium">
|
|
||||||
<button
|
|
||||||
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
|
|
||||||
type="submit"
|
|
||||||
>
|
|
||||||
{$i18n.t('Save')}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
@@ -98,6 +98,7 @@
|
|||||||
|
|
||||||
const uploadFileHandler = async (file) => {
|
const uploadFileHandler = async (file) => {
|
||||||
console.log(file);
|
console.log(file);
|
||||||
|
|
||||||
// Check if the file is an audio file and transcribe/convert it to text file
|
// Check if the file is an audio file and transcribe/convert it to text file
|
||||||
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
|
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
|
||||||
const res = await transcribeAudio(localStorage.token, file).catch((error) => {
|
const res = await transcribeAudio(localStorage.token, file).catch((error) => {
|
||||||
@@ -112,40 +113,49 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upload the file to the server
|
const fileItem = {
|
||||||
const uploadedFile = await uploadFile(localStorage.token, file).catch((error) => {
|
type: 'file',
|
||||||
toast.error(error);
|
file: '',
|
||||||
return null;
|
id: null,
|
||||||
});
|
url: '',
|
||||||
|
name: file.name,
|
||||||
|
collection_name: '',
|
||||||
|
status: '',
|
||||||
|
size: file.size,
|
||||||
|
error: ''
|
||||||
|
};
|
||||||
|
files = [...files, fileItem];
|
||||||
|
|
||||||
if (uploadedFile) {
|
try {
|
||||||
const fileItem = {
|
const uploadedFile = await uploadFile(localStorage.token, file);
|
||||||
type: 'file',
|
|
||||||
file: uploadedFile,
|
|
||||||
id: uploadedFile.id,
|
|
||||||
url: `${WEBUI_API_BASE_URL}/files/${uploadedFile.id}`,
|
|
||||||
name: file.name,
|
|
||||||
collection_name: '',
|
|
||||||
status: 'uploaded',
|
|
||||||
error: ''
|
|
||||||
};
|
|
||||||
files = [...files, fileItem];
|
|
||||||
|
|
||||||
// TODO: Check if tools & functions have files support to skip this step to delegate file processing
|
if (uploadedFile) {
|
||||||
// Default Upload to VectorDB
|
fileItem.status = 'uploaded';
|
||||||
if (
|
fileItem.file = uploadedFile;
|
||||||
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
fileItem.id = uploadedFile.id;
|
||||||
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
fileItem.url = `${WEBUI_API_BASE_URL}/files/${uploadedFile.id}`;
|
||||||
) {
|
|
||||||
processFileItem(fileItem);
|
// TODO: Check if tools & functions have files support to skip this step to delegate file processing
|
||||||
|
// Default Upload to VectorDB
|
||||||
|
if (
|
||||||
|
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
||||||
|
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
||||||
|
) {
|
||||||
|
processFileItem(fileItem);
|
||||||
|
} else {
|
||||||
|
toast.error(
|
||||||
|
$i18n.t(`Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.`, {
|
||||||
|
file_type: file['type']
|
||||||
|
})
|
||||||
|
);
|
||||||
|
processFileItem(fileItem);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
toast.error(
|
files = files.filter((item) => item.status !== null);
|
||||||
$i18n.t(`Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.`, {
|
|
||||||
file_type: file['type']
|
|
||||||
})
|
|
||||||
);
|
|
||||||
processFileItem(fileItem);
|
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
toast.error(e);
|
||||||
|
files = files.filter((item) => item.status !== null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -162,7 +172,6 @@
|
|||||||
// Remove the failed doc from the files array
|
// Remove the failed doc from the files array
|
||||||
// files = files.filter((f) => f.id !== fileItem.id);
|
// files = files.filter((f) => f.id !== fileItem.id);
|
||||||
toast.error(e);
|
toast.error(e);
|
||||||
|
|
||||||
fileItem.status = 'processed';
|
fileItem.status = 'processed';
|
||||||
files = files;
|
files = files;
|
||||||
}
|
}
|
||||||
@@ -375,7 +384,7 @@
|
|||||||
|
|
||||||
{#if atSelectedModel !== undefined}
|
{#if atSelectedModel !== undefined}
|
||||||
<div
|
<div
|
||||||
class="px-3 py-2.5 text-left w-full flex justify-between items-center absolute bottom-0 left-0 right-0 bg-gradient-to-t from-50% from-white dark:from-gray-900"
|
class="px-3 py-2.5 text-left w-full flex justify-between items-center absolute bottom-0 left-0 right-0 bg-gradient-to-t from-50% from-white dark:from-gray-900 z-50"
|
||||||
>
|
>
|
||||||
<div class="flex items-center gap-2 text-sm dark:text-gray-500">
|
<div class="flex items-center gap-2 text-sm dark:text-gray-500">
|
||||||
<img
|
<img
|
||||||
@@ -545,6 +554,7 @@
|
|||||||
<FileItem
|
<FileItem
|
||||||
name={file.name}
|
name={file.name}
|
||||||
type={file.type}
|
type={file.type}
|
||||||
|
size={file?.size}
|
||||||
status={file.status}
|
status={file.status}
|
||||||
dismissible={true}
|
dismissible={true}
|
||||||
on:dismiss={() => {
|
on:dismiss={() => {
|
||||||
|
|||||||
@@ -147,8 +147,8 @@
|
|||||||
<div class="m-1 overflow-y-auto p-1 rounded-r-lg space-y-0.5 scrollbar-hidden">
|
<div class="m-1 overflow-y-auto p-1 rounded-r-lg space-y-0.5 scrollbar-hidden">
|
||||||
{#each filteredModels as model, modelIdx}
|
{#each filteredModels as model, modelIdx}
|
||||||
<button
|
<button
|
||||||
class=" px-3 py-1.5 rounded-xl w-full text-left {modelIdx === selectedIdx
|
class="px-3 py-1.5 rounded-xl w-full text-left {modelIdx === selectedIdx
|
||||||
? ' bg-gray-50 dark:bg-gray-850 selected-command-option-button'
|
? 'bg-gray-50 dark:bg-gray-850 selected-command-option-button'
|
||||||
: ''}"
|
: ''}"
|
||||||
type="button"
|
type="button"
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
@@ -159,13 +159,18 @@
|
|||||||
}}
|
}}
|
||||||
on:focus={() => {}}
|
on:focus={() => {}}
|
||||||
>
|
>
|
||||||
<div class=" font-medium text-black dark:text-gray-100 line-clamp-1">
|
<div class="flex font-medium text-black dark:text-gray-100 line-clamp-1">
|
||||||
|
<img
|
||||||
|
src={model?.info?.meta?.profile_image_url ?? '/static/favicon.png'}
|
||||||
|
alt={model?.name ?? model.id}
|
||||||
|
class="rounded-full size-6 items-center mr-2"
|
||||||
|
/>
|
||||||
{model.name}
|
{model.name}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- <div class=" text-xs text-gray-600 line-clamp-1">
|
<!-- <div class=" text-xs text-gray-600 line-clamp-1">
|
||||||
{doc.title}
|
{doc.title}
|
||||||
</div> -->
|
</div> -->
|
||||||
</button>
|
</button>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { chats, config, settings, user as _user, mobile } from '$lib/stores';
|
import { chats, config, settings, user as _user, mobile, currentChatPage } from '$lib/stores';
|
||||||
import { tick, getContext, onMount } from 'svelte';
|
import { tick, getContext, onMount } from 'svelte';
|
||||||
|
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
@@ -90,7 +90,8 @@
|
|||||||
history: history
|
history: history
|
||||||
});
|
});
|
||||||
|
|
||||||
await chats.set(await getChatList(localStorage.token));
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
};
|
};
|
||||||
|
|
||||||
const confirmEditResponseMessage = async (messageId, content) => {
|
const confirmEditResponseMessage = async (messageId, content) => {
|
||||||
@@ -146,12 +147,14 @@
|
|||||||
|
|
||||||
await tick();
|
await tick();
|
||||||
|
|
||||||
const element = document.getElementById('messages-container');
|
if ($settings?.scrollOnBranchChange ?? true) {
|
||||||
autoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
|
const element = document.getElementById('messages-container');
|
||||||
|
autoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
scrollToBottom();
|
scrollToBottom();
|
||||||
}, 100);
|
}, 100);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const showNextMessage = async (message) => {
|
const showNextMessage = async (message) => {
|
||||||
@@ -195,12 +198,14 @@
|
|||||||
|
|
||||||
await tick();
|
await tick();
|
||||||
|
|
||||||
const element = document.getElementById('messages-container');
|
if ($settings?.scrollOnBranchChange ?? true) {
|
||||||
autoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
|
const element = document.getElementById('messages-container');
|
||||||
|
autoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
scrollToBottom();
|
scrollToBottom();
|
||||||
}, 100);
|
}, 100);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteMessageHandler = async (messageId) => {
|
const deleteMessageHandler = async (messageId) => {
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ __builtins__.input = input`);
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="mb-4" dir="ltr">
|
<div class="my-2" dir="ltr">
|
||||||
<div
|
<div
|
||||||
class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
|
class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -118,47 +118,47 @@
|
|||||||
currentMessageId = message.id;
|
currentMessageId = message.id;
|
||||||
let messageId = message.id;
|
let messageId = message.id;
|
||||||
console.log(messageId);
|
console.log(messageId);
|
||||||
|
|
||||||
//
|
//
|
||||||
let messageChildrenIds = history.messages[messageId].childrenIds;
|
let messageChildrenIds = history.messages[messageId].childrenIds;
|
||||||
while (messageChildrenIds.length !== 0) {
|
while (messageChildrenIds.length !== 0) {
|
||||||
messageId = messageChildrenIds.at(-1);
|
messageId = messageChildrenIds.at(-1);
|
||||||
messageChildrenIds = history.messages[messageId].childrenIds;
|
messageChildrenIds = history.messages[messageId].childrenIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
history.currentId = messageId;
|
history.currentId = messageId;
|
||||||
dispatch('change');
|
dispatch('change');
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ResponseMessage
|
{#key history.currentId}
|
||||||
message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
|
<ResponseMessage
|
||||||
siblings={groupedMessages[model].messages.map((m) => m.id)}
|
message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
|
||||||
isLastMessage={true}
|
siblings={groupedMessages[model].messages.map((m) => m.id)}
|
||||||
{updateChatMessages}
|
isLastMessage={true}
|
||||||
{confirmEditResponseMessage}
|
{updateChatMessages}
|
||||||
showPreviousMessage={() => showPreviousMessage(model)}
|
{confirmEditResponseMessage}
|
||||||
showNextMessage={() => showNextMessage(model)}
|
showPreviousMessage={() => showPreviousMessage(model)}
|
||||||
{readOnly}
|
showNextMessage={() => showNextMessage(model)}
|
||||||
{rateMessage}
|
{readOnly}
|
||||||
{copyToClipboard}
|
{rateMessage}
|
||||||
{continueGeneration}
|
{copyToClipboard}
|
||||||
regenerateResponse={async (message) => {
|
{continueGeneration}
|
||||||
regenerateResponse(message);
|
regenerateResponse={async (message) => {
|
||||||
await tick();
|
regenerateResponse(message);
|
||||||
groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
|
await tick();
|
||||||
}}
|
groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
|
||||||
on:save={async (e) => {
|
}}
|
||||||
console.log('save', e);
|
on:save={async (e) => {
|
||||||
|
console.log('save', e);
|
||||||
|
|
||||||
const message = e.detail;
|
const message = e.detail;
|
||||||
history.messages[message.id] = message;
|
history.messages[message.id] = message;
|
||||||
await updateChatById(localStorage.token, chatId, {
|
await updateChatById(localStorage.token, chatId, {
|
||||||
messages: messages,
|
messages: messages,
|
||||||
history: history
|
history: history
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
{/key}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Image from '$lib/components/common/Image.svelte';
|
||||||
|
import CodeBlock from './CodeBlock.svelte';
|
||||||
|
|
||||||
|
/* The html content of the tag */
|
||||||
|
export let html; //: string;
|
||||||
|
let parsedHTML = [html];
|
||||||
|
|
||||||
|
export let images;
|
||||||
|
export let codes;
|
||||||
|
|
||||||
|
// all images are in {{IMAGE_0}}, {{IMAGE_1}}.... format
|
||||||
|
// all codes are in {{CODE_0}}, {{CODE_1}}.... format
|
||||||
|
|
||||||
|
const rules = [];
|
||||||
|
rules.forEach((rule) => {
|
||||||
|
parsedHTML = parsedHTML.map((substr) => substr.split(rule.regex)).flat();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each parsedHTML as part}
|
||||||
|
{@const match = rules.find((rule) => rule.regex.test(part))}
|
||||||
|
{#if match}
|
||||||
|
<svelte:component this={match.component} {...match.props}>
|
||||||
|
{@html part}
|
||||||
|
</svelte:component>
|
||||||
|
{:else}
|
||||||
|
{@html part}
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import type { Token } from 'marked';
|
||||||
|
import { unescapeHtml } from '$lib/utils';
|
||||||
|
import Image from '$lib/components/common/Image.svelte';
|
||||||
|
|
||||||
|
export let id: string;
|
||||||
|
export let tokens: Token[];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each tokens as token}
|
||||||
|
{#if token.type === 'escape'}
|
||||||
|
{unescapeHtml(token.text)}
|
||||||
|
{:else if token.type === 'html'}
|
||||||
|
{@html token.text}
|
||||||
|
{:else if token.type === 'link'}
|
||||||
|
<a href={token.href} target="_blank" rel="nofollow" title={token.title}>{token.text}</a>
|
||||||
|
{:else if token.type === 'image'}
|
||||||
|
<Image src={token.href} alt={token.text} />
|
||||||
|
{:else if token.type === 'strong'}
|
||||||
|
<strong>
|
||||||
|
<svelte:self id={`${id}-strong`} tokens={token.tokens} />
|
||||||
|
</strong>
|
||||||
|
{:else if token.type === 'em'}
|
||||||
|
<em>
|
||||||
|
<svelte:self id={`${id}-em`} tokens={token.tokens} />
|
||||||
|
</em>
|
||||||
|
{:else if token.type === 'codespan'}
|
||||||
|
<code class="codespan">{unescapeHtml(token.text.replaceAll('&', '&'))}</code>
|
||||||
|
{:else if token.type === 'br'}
|
||||||
|
<br />
|
||||||
|
{:else if token.type === 'del'}
|
||||||
|
<del>
|
||||||
|
<svelte:self id={`${id}-del`} tokens={token.tokens} />
|
||||||
|
</del>
|
||||||
|
{:else if token.type === 'text'}
|
||||||
|
{unescapeHtml(token.text)}
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { marked } from 'marked';
|
||||||
|
import type { Token } from 'marked';
|
||||||
|
import { revertSanitizedResponseContent, unescapeHtml } from '$lib/utils';
|
||||||
|
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
import Image from '$lib/components/common/Image.svelte';
|
||||||
|
import CodeBlock from '$lib/components/chat/Messages/CodeBlock.svelte';
|
||||||
|
|
||||||
|
import MarkdownInlineTokens from '$lib/components/chat/Messages/MarkdownInlineTokens.svelte';
|
||||||
|
|
||||||
|
export let id: string;
|
||||||
|
export let tokens: Token[];
|
||||||
|
export let top = true;
|
||||||
|
|
||||||
|
let containerElement;
|
||||||
|
|
||||||
|
const headerComponent = (depth: number) => {
|
||||||
|
return 'h' + depth;
|
||||||
|
};
|
||||||
|
|
||||||
|
const renderer = new marked.Renderer();
|
||||||
|
// For code blocks with simple backticks
|
||||||
|
renderer.codespan = (code) => {
|
||||||
|
return `<code class="codespan">${code.replaceAll('&', '&')}</code>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
let codes = [];
|
||||||
|
renderer.code = (code, lang) => {
|
||||||
|
codes.push({
|
||||||
|
code: code,
|
||||||
|
lang: lang
|
||||||
|
});
|
||||||
|
codes = codes;
|
||||||
|
const codeId = `${id}-${codes.length}`;
|
||||||
|
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
const codeElement = document.getElementById(`code-${codeId}`);
|
||||||
|
if (codeElement) {
|
||||||
|
clearInterval(interval);
|
||||||
|
// If the code is already loaded, don't load it again
|
||||||
|
if (codeElement.innerHTML) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new CodeBlock({
|
||||||
|
target: codeElement,
|
||||||
|
props: {
|
||||||
|
id: `${id}-${codes.length}`,
|
||||||
|
lang: lang,
|
||||||
|
code: revertSanitizedResponseContent(code)
|
||||||
|
},
|
||||||
|
hydrate: true,
|
||||||
|
$$inline: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 10);
|
||||||
|
|
||||||
|
return `<div id="code-${id}-${codes.length}"></div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
let images = [];
|
||||||
|
renderer.image = (href, title, text) => {
|
||||||
|
images.push({
|
||||||
|
href: href,
|
||||||
|
title: title,
|
||||||
|
text: text
|
||||||
|
});
|
||||||
|
images = images;
|
||||||
|
|
||||||
|
const imageId = `${id}-${images.length}`;
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
const imageElement = document.getElementById(`image-${imageId}`);
|
||||||
|
if (imageElement) {
|
||||||
|
clearInterval(interval);
|
||||||
|
|
||||||
|
// If the image is already loaded, don't load it again
|
||||||
|
if (imageElement.innerHTML) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('image', href, text);
|
||||||
|
new Image({
|
||||||
|
target: imageElement,
|
||||||
|
props: {
|
||||||
|
src: href,
|
||||||
|
alt: text
|
||||||
|
},
|
||||||
|
$$inline: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 10);
|
||||||
|
|
||||||
|
return `<div id="image-${id}-${images.length}"></div>`;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Open all links in a new tab/window (from https://github.com/markedjs/marked/issues/655#issuecomment-383226346)
|
||||||
|
const origLinkRenderer = renderer.link;
|
||||||
|
renderer.link = (href, title, text) => {
|
||||||
|
const html = origLinkRenderer.call(renderer, href, title, text);
|
||||||
|
return html.replace(/^<a /, '<a target="_blank" rel="nofollow" ');
|
||||||
|
};
|
||||||
|
|
||||||
|
const { extensions, ...defaults } = marked.getDefaults() as marked.MarkedOptions & {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
extensions: any;
|
||||||
|
};
|
||||||
|
|
||||||
|
$: if (tokens) {
|
||||||
|
images = [];
|
||||||
|
codes = [];
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={containerElement} class="flex flex-col">
|
||||||
|
{#each tokens as token, tokenIdx (`${id}-${tokenIdx}`)}
|
||||||
|
{#if token.type === 'code'}
|
||||||
|
{#if token.lang === 'mermaid'}
|
||||||
|
<pre class="mermaid">{revertSanitizedResponseContent(token.text)}</pre>
|
||||||
|
{:else}
|
||||||
|
<CodeBlock
|
||||||
|
id={`${id}-${tokenIdx}`}
|
||||||
|
lang={token?.lang ?? ''}
|
||||||
|
code={revertSanitizedResponseContent(token?.text ?? '')}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
{:else}
|
||||||
|
{@html marked.parse(token.raw, {
|
||||||
|
...defaults,
|
||||||
|
gfm: true,
|
||||||
|
breaks: true,
|
||||||
|
renderer
|
||||||
|
})}
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -20,7 +20,10 @@
|
|||||||
<ChevronDown strokeWidth="3.5" className="size-3.5 " />
|
<ChevronDown strokeWidth="3.5" className="size-3.5 " />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl" slot="content">
|
<div
|
||||||
|
class="text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl mb-1.5"
|
||||||
|
slot="content"
|
||||||
|
>
|
||||||
{#if status?.query}
|
{#if status?.query}
|
||||||
<a
|
<a
|
||||||
href="https://www.google.com/search?q={status.query}"
|
href="https://www.google.com/search?q={status.query}"
|
||||||
|
|||||||
@@ -100,7 +100,13 @@
|
|||||||
{#if file.type === 'image'}
|
{#if file.type === 'image'}
|
||||||
<img src={file.url} alt="input" class=" max-h-96 rounded-lg" draggable="false" />
|
<img src={file.url} alt="input" class=" max-h-96 rounded-lg" draggable="false" />
|
||||||
{:else}
|
{:else}
|
||||||
<FileItem url={file.url} name={file.name} type={file.type} />
|
<FileItem
|
||||||
|
url={file.url}
|
||||||
|
name={file.name}
|
||||||
|
type={file.type}
|
||||||
|
size={file?.size}
|
||||||
|
colorClassName="bg-white dark:bg-gray-850 "
|
||||||
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { DropdownMenu } from 'bits-ui';
|
import { DropdownMenu } from 'bits-ui';
|
||||||
import { marked } from 'marked';
|
import { marked } from 'marked';
|
||||||
|
import Fuse from 'fuse.js';
|
||||||
|
|
||||||
import { flyAndScale } from '$lib/utils/transitions';
|
import { flyAndScale } from '$lib/utils/transitions';
|
||||||
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
|
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
|
||||||
@@ -33,7 +34,7 @@
|
|||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
} = [];
|
} = [];
|
||||||
|
|
||||||
export let className = 'w-[30rem]';
|
export let className = 'w-[32rem]';
|
||||||
|
|
||||||
let show = false;
|
let show = false;
|
||||||
|
|
||||||
@@ -43,17 +44,31 @@
|
|||||||
let searchValue = '';
|
let searchValue = '';
|
||||||
let ollamaVersion = null;
|
let ollamaVersion = null;
|
||||||
|
|
||||||
$: filteredItems = items.filter(
|
let selectedModelIdx = 0;
|
||||||
(item) =>
|
|
||||||
(searchValue
|
const fuse = new Fuse(
|
||||||
? item.value.toLowerCase().includes(searchValue.toLowerCase()) ||
|
items
|
||||||
item.label.toLowerCase().includes(searchValue.toLowerCase()) ||
|
.filter((item) => !item.model?.info?.meta?.hidden)
|
||||||
(item.model?.info?.meta?.tags ?? []).some((tag) =>
|
.map((item) => {
|
||||||
tag.name.toLowerCase().includes(searchValue.toLowerCase())
|
const _item = {
|
||||||
)
|
...item,
|
||||||
: true) && !(item.model?.info?.meta?.hidden ?? false)
|
modelName: item.model?.name,
|
||||||
|
tags: item.model?.info?.meta?.tags?.map((tag) => tag.name).join(' '),
|
||||||
|
desc: item.model?.info?.meta?.description
|
||||||
|
};
|
||||||
|
return _item;
|
||||||
|
}),
|
||||||
|
{
|
||||||
|
keys: ['value', 'label', 'tags', 'desc', 'modelName']
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$: filteredItems = searchValue
|
||||||
|
? fuse.search(searchValue).map((e) => {
|
||||||
|
return e.item;
|
||||||
|
})
|
||||||
|
: items.filter((item) => !item.model?.info?.meta?.hidden);
|
||||||
|
|
||||||
const pullModelHandler = async () => {
|
const pullModelHandler = async () => {
|
||||||
const sanitizedModelTag = searchValue.trim().replace(/^ollama\s+(run|pull)\s+/, '');
|
const sanitizedModelTag = searchValue.trim().replace(/^ollama\s+(run|pull)\s+/, '');
|
||||||
|
|
||||||
@@ -202,6 +217,7 @@
|
|||||||
bind:open={show}
|
bind:open={show}
|
||||||
onOpenChange={async () => {
|
onOpenChange={async () => {
|
||||||
searchValue = '';
|
searchValue = '';
|
||||||
|
selectedModelIdx = 0;
|
||||||
window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0);
|
window.setTimeout(() => document.getElementById('model-search-input')?.focus(), 0);
|
||||||
}}
|
}}
|
||||||
closeFocus={false}
|
closeFocus={false}
|
||||||
@@ -238,19 +254,41 @@
|
|||||||
class="w-full text-sm bg-transparent outline-none"
|
class="w-full text-sm bg-transparent outline-none"
|
||||||
placeholder={searchPlaceholder}
|
placeholder={searchPlaceholder}
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
|
on:keydown={(e) => {
|
||||||
|
if (e.code === 'Enter' && filteredItems.length > 0) {
|
||||||
|
value = filteredItems[selectedModelIdx].value;
|
||||||
|
show = false;
|
||||||
|
return; // dont need to scroll on selection
|
||||||
|
} else if (e.code === 'ArrowDown') {
|
||||||
|
selectedModelIdx = Math.min(selectedModelIdx + 1, filteredItems.length - 1);
|
||||||
|
} else if (e.code === 'ArrowUp') {
|
||||||
|
selectedModelIdx = Math.max(selectedModelIdx - 1, 0);
|
||||||
|
} else {
|
||||||
|
// if the user types something, reset to the top selection.
|
||||||
|
selectedModelIdx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const item = document.querySelector(`[data-arrow-selected="true"]`);
|
||||||
|
item?.scrollIntoView({ block: 'center', inline: 'nearest', behavior: 'instant' });
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="border-gray-100 dark:border-gray-800" />
|
<hr class="border-gray-100 dark:border-gray-800" />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden">
|
<div class="px-3 my-2 max-h-64 overflow-y-auto scrollbar-hidden group">
|
||||||
{#each filteredItems as item}
|
{#each filteredItems as item, index}
|
||||||
<button
|
<button
|
||||||
aria-label="model-item"
|
aria-label="model-item"
|
||||||
class="flex w-full text-left font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 dark:text-gray-100 outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer data-[highlighted]:bg-muted"
|
class="flex w-full text-left font-medium line-clamp-1 select-none items-center rounded-button py-2 pl-3 pr-1.5 text-sm text-gray-700 dark:text-gray-100 outline-none transition-all duration-75 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer data-[highlighted]:bg-muted {index ===
|
||||||
|
selectedModelIdx
|
||||||
|
? 'bg-gray-100 dark:bg-gray-800 group-hover:bg-transparent'
|
||||||
|
: ''}"
|
||||||
|
data-arrow-selected={index === selectedModelIdx}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
value = item.value;
|
value = item.value;
|
||||||
|
selectedModelIdx = index;
|
||||||
|
|
||||||
show = false;
|
show = false;
|
||||||
}}
|
}}
|
||||||
@@ -270,7 +308,14 @@
|
|||||||
<div class="flex items-center gap-2">
|
<div class="flex items-center gap-2">
|
||||||
<div class="flex items-center min-w-fit">
|
<div class="flex items-center min-w-fit">
|
||||||
<div class="line-clamp-1">
|
<div class="line-clamp-1">
|
||||||
{item.label}
|
<div class="flex items-center min-w-fit">
|
||||||
|
<img
|
||||||
|
src={item.model?.info?.meta?.profile_image_url ?? '/static/favicon.png'}
|
||||||
|
alt="Model"
|
||||||
|
class="rounded-full size-5 flex items-center mr-2"
|
||||||
|
/>
|
||||||
|
{item.label}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
|
{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
|
||||||
<div class="flex ml-1 items-center translate-y-[0.5px]">
|
<div class="flex ml-1 items-center translate-y-[0.5px]">
|
||||||
@@ -295,23 +340,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#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]">
|
|
||||||
{#each item.model?.info?.meta.tags as tag}
|
|
||||||
<div
|
|
||||||
class=" text-xs font-bold px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
|
||||||
>
|
|
||||||
{tag.name}
|
|
||||||
</div>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<!-- {JSON.stringify(item.info)} -->
|
<!-- {JSON.stringify(item.info)} -->
|
||||||
|
|
||||||
{#if item.model.owned_by === 'openai'}
|
{#if item.model.owned_by === 'openai'}
|
||||||
<Tooltip content={`${'External'}`}>
|
<Tooltip content={`${'External'}`}>
|
||||||
<div class="">
|
<div class="translate-y-[1px]">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 16 16"
|
viewBox="0 0 16 16"
|
||||||
@@ -342,7 +375,7 @@
|
|||||||
)
|
)
|
||||||
)}`}
|
)}`}
|
||||||
>
|
>
|
||||||
<div class="">
|
<div class=" translate-y-[1px]">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
fill="none"
|
fill="none"
|
||||||
@@ -360,6 +393,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
{/if}
|
{/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]">
|
||||||
|
{#each item.model?.info?.meta.tags as tag}
|
||||||
|
<Tooltip content={tag.name}>
|
||||||
|
<div
|
||||||
|
class=" text-xs font-bold px-1 rounded uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
|
||||||
|
>
|
||||||
|
{tag.name}
|
||||||
|
</div>
|
||||||
|
</Tooltip>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
mirostat_tau: null,
|
mirostat_tau: null,
|
||||||
top_k: null,
|
top_k: null,
|
||||||
top_p: null,
|
top_p: null,
|
||||||
|
min_p: null,
|
||||||
tfs_z: null,
|
tfs_z: null,
|
||||||
num_ctx: null,
|
num_ctx: null,
|
||||||
num_batch: null,
|
num_batch: null,
|
||||||
@@ -385,6 +386,52 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class=" py-0.5 w-full justify-between">
|
||||||
|
<div class="flex w-full justify-between">
|
||||||
|
<div class=" self-center text-xs font-medium">{$i18n.t('Min P')}</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="p-1 px-3 text-xs flex rounded transition flex-shrink-0 outline-none"
|
||||||
|
type="button"
|
||||||
|
on:click={() => {
|
||||||
|
params.min_p = (params?.min_p ?? null) === null ? 0.0 : null;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{#if (params?.min_p ?? 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>
|
||||||
|
|
||||||
|
{#if (params?.min_p ?? null) !== null}
|
||||||
|
<div class="flex mt-0.5 space-x-2">
|
||||||
|
<div class=" flex-1">
|
||||||
|
<input
|
||||||
|
id="steps-range"
|
||||||
|
type="range"
|
||||||
|
min="0"
|
||||||
|
max="1"
|
||||||
|
step="0.05"
|
||||||
|
bind:value={params.min_p}
|
||||||
|
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input
|
||||||
|
bind:value={params.min_p}
|
||||||
|
type="number"
|
||||||
|
class=" bg-transparent text-center w-14"
|
||||||
|
min="0"
|
||||||
|
max="1"
|
||||||
|
step="any"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class=" py-0.5 w-full justify-between">
|
<div class=" py-0.5 w-full justify-between">
|
||||||
<div class="flex w-full justify-between">
|
<div class="flex w-full justify-between">
|
||||||
<div class=" self-center text-xs font-medium">{$i18n.t('Frequency Penalty')}</div>
|
<div class=" self-center text-xs font-medium">{$i18n.t('Frequency Penalty')}</div>
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { user, settings, config } from '$lib/stores';
|
|
||||||
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
|
import { createEventDispatcher, onMount, getContext } from 'svelte';
|
||||||
|
|
||||||
|
import { user, settings, config } from '$lib/stores';
|
||||||
|
import { getVoices as _getVoices } from '$lib/apis/audio';
|
||||||
|
|
||||||
import Switch from '$lib/components/common/Switch.svelte';
|
import Switch from '$lib/components/common/Switch.svelte';
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
@@ -20,26 +23,26 @@
|
|||||||
let voices = [];
|
let voices = [];
|
||||||
let voice = '';
|
let voice = '';
|
||||||
|
|
||||||
const getOpenAIVoices = () => {
|
const getVoices = async () => {
|
||||||
voices = [
|
if ($config.audio.tts.engine === '') {
|
||||||
{ name: 'alloy' },
|
const getVoicesLoop = setInterval(async () => {
|
||||||
{ name: 'echo' },
|
voices = await speechSynthesis.getVoices();
|
||||||
{ name: 'fable' },
|
|
||||||
{ name: 'onyx' },
|
|
||||||
{ name: 'nova' },
|
|
||||||
{ name: 'shimmer' }
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
const getWebAPIVoices = () => {
|
// do your loop
|
||||||
const getVoicesLoop = setInterval(async () => {
|
if (voices.length > 0) {
|
||||||
voices = await speechSynthesis.getVoices();
|
clearInterval(getVoicesLoop);
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
} else {
|
||||||
|
const res = await _getVoices(localStorage.token).catch((e) => {
|
||||||
|
toast.error(e);
|
||||||
|
});
|
||||||
|
|
||||||
// do your loop
|
if (res) {
|
||||||
if (voices.length > 0) {
|
console.log(res);
|
||||||
clearInterval(getVoicesLoop);
|
voices = res.voices;
|
||||||
}
|
}
|
||||||
}, 100);
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleResponseAutoPlayback = async () => {
|
const toggleResponseAutoPlayback = async () => {
|
||||||
@@ -58,14 +61,16 @@
|
|||||||
responseAutoPlayback = $settings.responseAutoPlayback ?? false;
|
responseAutoPlayback = $settings.responseAutoPlayback ?? false;
|
||||||
|
|
||||||
STTEngine = $settings?.audio?.stt?.engine ?? '';
|
STTEngine = $settings?.audio?.stt?.engine ?? '';
|
||||||
voice = $settings?.audio?.tts?.voice ?? $config.audio.tts.voice ?? '';
|
|
||||||
|
if ($settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice) {
|
||||||
|
voice = $settings?.audio?.tts?.voice ?? $config.audio.tts.voice ?? '';
|
||||||
|
} else {
|
||||||
|
voice = $config.audio.tts.voice ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
nonLocalVoices = $settings.audio?.tts?.nonLocalVoices ?? false;
|
nonLocalVoices = $settings.audio?.tts?.nonLocalVoices ?? false;
|
||||||
|
|
||||||
if ($config.audio.tts.engine === 'openai') {
|
await getVoices();
|
||||||
getOpenAIVoices();
|
|
||||||
} else {
|
|
||||||
getWebAPIVoices();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -79,6 +84,7 @@
|
|||||||
},
|
},
|
||||||
tts: {
|
tts: {
|
||||||
voice: voice !== '' ? voice : undefined,
|
voice: voice !== '' ? voice : undefined,
|
||||||
|
defaultVoice: $config?.audio?.tts?.voice ?? '',
|
||||||
nonLocalVoices: $config.audio.tts.engine === '' ? nonLocalVoices : undefined
|
nonLocalVoices: $config.audio.tts.engine === '' ? nonLocalVoices : undefined
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,7 +187,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{:else if $config.audio.tts.engine === 'openai'}
|
{:else if $config.audio.tts.engine !== ''}
|
||||||
<div>
|
<div>
|
||||||
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Voice')}</div>
|
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Set Voice')}</div>
|
||||||
<div class="flex w-full">
|
<div class="flex w-full">
|
||||||
@@ -195,7 +201,7 @@
|
|||||||
|
|
||||||
<datalist id="voice-list">
|
<datalist id="voice-list">
|
||||||
{#each voices as voice}
|
{#each voices as voice}
|
||||||
<option value={voice.name} />
|
<option value={voice.id}>{voice.name}</option>
|
||||||
{/each}
|
{/each}
|
||||||
</datalist>
|
</datalist>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { chats, user, settings } from '$lib/stores';
|
import { chats, user, settings, scrollPaginationEnabled, currentChatPage } from '$lib/stores';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
archiveAllChats,
|
archiveAllChats,
|
||||||
@@ -62,7 +62,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await chats.set(await getChatList(localStorage.token));
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
|
scrollPaginationEnabled.set(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
const exportChats = async () => {
|
const exportChats = async () => {
|
||||||
@@ -77,7 +79,10 @@
|
|||||||
await archiveAllChats(localStorage.token).catch((error) => {
|
await archiveAllChats(localStorage.token).catch((error) => {
|
||||||
toast.error(error);
|
toast.error(error);
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
|
scrollPaginationEnabled.set(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteAllChatsHandler = async () => {
|
const deleteAllChatsHandler = async () => {
|
||||||
@@ -85,7 +90,10 @@
|
|||||||
await deleteAllChats(localStorage.token).catch((error) => {
|
await deleteAllChats(localStorage.token).catch((error) => {
|
||||||
toast.error(error);
|
toast.error(error);
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
|
scrollPaginationEnabled.set(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleSaveChatHistory = async () => {
|
const toggleSaveChatHistory = async () => {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
let responseAutoCopy = false;
|
let responseAutoCopy = false;
|
||||||
let widescreenMode = false;
|
let widescreenMode = false;
|
||||||
let splitLargeChunks = false;
|
let splitLargeChunks = false;
|
||||||
|
let scrollOnBranchChange = true;
|
||||||
let userLocation = false;
|
let userLocation = false;
|
||||||
|
|
||||||
// Interface
|
// Interface
|
||||||
@@ -39,6 +40,11 @@
|
|||||||
saveSettings({ splitLargeChunks: splitLargeChunks });
|
saveSettings({ splitLargeChunks: splitLargeChunks });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const togglesScrollOnBranchChange = async () => {
|
||||||
|
scrollOnBranchChange = !scrollOnBranchChange;
|
||||||
|
saveSettings({ scrollOnBranchChange: scrollOnBranchChange });
|
||||||
|
};
|
||||||
|
|
||||||
const togglewidescreenMode = async () => {
|
const togglewidescreenMode = async () => {
|
||||||
widescreenMode = !widescreenMode;
|
widescreenMode = !widescreenMode;
|
||||||
saveSettings({ widescreenMode: widescreenMode });
|
saveSettings({ widescreenMode: widescreenMode });
|
||||||
@@ -141,6 +147,7 @@
|
|||||||
chatBubble = $settings.chatBubble ?? true;
|
chatBubble = $settings.chatBubble ?? true;
|
||||||
widescreenMode = $settings.widescreenMode ?? false;
|
widescreenMode = $settings.widescreenMode ?? false;
|
||||||
splitLargeChunks = $settings.splitLargeChunks ?? false;
|
splitLargeChunks = $settings.splitLargeChunks ?? false;
|
||||||
|
scrollOnBranchChange = $settings.scrollOnBranchChange ?? true;
|
||||||
chatDirection = $settings.chatDirection ?? 'LTR';
|
chatDirection = $settings.chatDirection ?? 'LTR';
|
||||||
userLocation = $settings.userLocation ?? false;
|
userLocation = $settings.userLocation ?? false;
|
||||||
|
|
||||||
@@ -318,6 +325,28 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class=" py-0.5 flex w-full justify-between">
|
||||||
|
<div class=" self-center text-xs">
|
||||||
|
{$i18n.t('Scroll to bottom when switching between branches')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="p-1 px-3 text-xs flex rounded transition"
|
||||||
|
on:click={() => {
|
||||||
|
togglesScrollOnBranchChange();
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
>
|
||||||
|
{#if scrollOnBranchChange === true}
|
||||||
|
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||||
|
{:else}
|
||||||
|
<span class="ml-2 self-center">{$i18n.t('Off')}</span>
|
||||||
|
{/if}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class=" py-0.5 flex w-full justify-between">
|
<div class=" py-0.5 flex w-full justify-between">
|
||||||
<div class=" self-center text-xs">
|
<div class=" self-center text-xs">
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
import Chats from './Settings/Chats.svelte';
|
import Chats from './Settings/Chats.svelte';
|
||||||
import User from '../icons/User.svelte';
|
import User from '../icons/User.svelte';
|
||||||
import Personalization from './Settings/Personalization.svelte';
|
import Personalization from './Settings/Personalization.svelte';
|
||||||
import Valves from './Settings/Valves.svelte';
|
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
@@ -188,30 +187,6 @@
|
|||||||
<div class=" self-center">{$i18n.t('Audio')}</div>
|
<div class=" self-center">{$i18n.t('Audio')}</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
|
||||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
|
||||||
'valves'
|
|
||||||
? 'bg-gray-200 dark:bg-gray-800'
|
|
||||||
: ' hover:bg-gray-100 dark:hover:bg-gray-850'}"
|
|
||||||
on:click={() => {
|
|
||||||
selectedTab = 'valves';
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<div class=" self-center mr-2">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
fill="currentColor"
|
|
||||||
class="size-4"
|
|
||||||
>
|
|
||||||
<path
|
|
||||||
d="M18.75 12.75h1.5a.75.75 0 0 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM12 6a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 6ZM12 18a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 12 18ZM3.75 6.75h1.5a.75.75 0 1 0 0-1.5h-1.5a.75.75 0 0 0 0 1.5ZM5.25 18.75h-1.5a.75.75 0 0 1 0-1.5h1.5a.75.75 0 0 1 0 1.5ZM3 12a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 3 12ZM9 3.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5ZM12.75 12a2.25 2.25 0 1 1 4.5 0 2.25 2.25 0 0 1-4.5 0ZM9 15.75a2.25 2.25 0 1 0 0 4.5 2.25 2.25 0 0 0 0-4.5Z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class=" self-center">{$i18n.t('Valves')}</div>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button
|
<button
|
||||||
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
|
||||||
'chats'
|
'chats'
|
||||||
@@ -349,13 +324,6 @@
|
|||||||
toast.success($i18n.t('Settings saved successfully!'));
|
toast.success($i18n.t('Settings saved successfully!'));
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{:else if selectedTab === 'valves'}
|
|
||||||
<Valves
|
|
||||||
{saveSettings}
|
|
||||||
on:save={() => {
|
|
||||||
toast.success($i18n.t('Settings saved successfully!'));
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{:else if selectedTab === 'chats'}
|
{:else if selectedTab === 'chats'}
|
||||||
<Chats {saveSettings} />
|
<Chats {saveSettings} />
|
||||||
{:else if selectedTab === 'account'}
|
{:else if selectedTab === 'account'}
|
||||||
|
|||||||
@@ -8,7 +8,13 @@
|
|||||||
getTagsById,
|
getTagsById,
|
||||||
updateChatById
|
updateChatById
|
||||||
} from '$lib/apis/chats';
|
} from '$lib/apis/chats';
|
||||||
import { tags as _tags, chats, pinnedChats } from '$lib/stores';
|
import {
|
||||||
|
tags as _tags,
|
||||||
|
chats,
|
||||||
|
pinnedChats,
|
||||||
|
currentChatPage,
|
||||||
|
scrollPaginationEnabled
|
||||||
|
} from '$lib/stores';
|
||||||
import { createEventDispatcher, onMount } from 'svelte';
|
import { createEventDispatcher, onMount } from 'svelte';
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
@@ -46,11 +52,7 @@
|
|||||||
tags: tags
|
tags: tags
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log($_tags);
|
|
||||||
await _tags.set(await getAllChatTags(localStorage.token));
|
await _tags.set(await getAllChatTags(localStorage.token));
|
||||||
|
|
||||||
console.log($_tags);
|
|
||||||
|
|
||||||
if ($_tags.map((t) => t.name).includes(tagName)) {
|
if ($_tags.map((t) => t.name).includes(tagName)) {
|
||||||
if (tagName === 'pinned') {
|
if (tagName === 'pinned') {
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
@@ -62,8 +64,11 @@
|
|||||||
dispatch('close');
|
dispatch('close');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await chats.set(await getChatList(localStorage.token));
|
// if the tag we deleted is no longer a valid tag, return to main chat list view
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
|
await scrollPaginationEnabled.set(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,41 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { slide } from 'svelte/transition';
|
import { slide } from 'svelte/transition';
|
||||||
import { quintOut } from 'svelte/easing';
|
import { quintOut } from 'svelte/easing';
|
||||||
|
|
||||||
|
import ChevronUp from '../icons/ChevronUp.svelte';
|
||||||
|
import ChevronDown from '../icons/ChevronDown.svelte';
|
||||||
|
|
||||||
export let open = false;
|
export let open = false;
|
||||||
export let className = '';
|
export let className = '';
|
||||||
|
export let title = null;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class={className}>
|
<div class={className}>
|
||||||
<button on:click={() => (open = !open)}>
|
{#if title !== null}
|
||||||
<slot />
|
<button class="w-full" on:click={() => (open = !open)}>
|
||||||
</button>
|
<div class=" w-full font-medium transition flex items-center justify-between gap-2">
|
||||||
|
<div>
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{#if open}
|
||||||
|
<ChevronUp strokeWidth="3.5" className="size-3.5 " />
|
||||||
|
{:else}
|
||||||
|
<ChevronDown strokeWidth="3.5" className="size-3.5 " />
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
{:else}
|
||||||
|
<button on:click={() => (open = !open)}>
|
||||||
|
<div
|
||||||
|
class="flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
|
||||||
{#if open}
|
{#if open}
|
||||||
<div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }}>
|
<div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }}>
|
||||||
|
|||||||
@@ -15,12 +15,12 @@
|
|||||||
|
|
||||||
export let input = false;
|
export let input = false;
|
||||||
export let inputPlaceholder = '';
|
export let inputPlaceholder = '';
|
||||||
|
export let inputValue = '';
|
||||||
|
|
||||||
export let show = false;
|
export let show = false;
|
||||||
|
|
||||||
let modalElement = null;
|
let modalElement = null;
|
||||||
let mounted = false;
|
let mounted = false;
|
||||||
let inputValue = '';
|
|
||||||
|
|
||||||
const handleKeyDown = (event: KeyboardEvent) => {
|
const handleKeyDown = (event: KeyboardEvent) => {
|
||||||
if (event.key === 'Escape') {
|
if (event.key === 'Escape') {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
export let className = 'w-72';
|
export let className = 'w-72';
|
||||||
|
export let colorClassName = 'bg-white dark:bg-gray-800';
|
||||||
export let url: string | null = null;
|
export let url: string | null = null;
|
||||||
|
|
||||||
export let clickHandler: Function | null = null;
|
export let clickHandler: Function | null = null;
|
||||||
@@ -14,11 +15,26 @@
|
|||||||
|
|
||||||
export let name: string;
|
export let name: string;
|
||||||
export let type: string;
|
export let type: string;
|
||||||
|
export let size: number;
|
||||||
|
|
||||||
|
function formatSize(size) {
|
||||||
|
if (size == null) return 'Unknown size';
|
||||||
|
if (typeof size !== 'number' || size < 0) return 'Invalid size';
|
||||||
|
if (size === 0) return '0 B';
|
||||||
|
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
||||||
|
let unitIndex = 0;
|
||||||
|
|
||||||
|
while (size >= 1024 && unitIndex < units.length - 1) {
|
||||||
|
size /= 1024;
|
||||||
|
unitIndex++;
|
||||||
|
}
|
||||||
|
return `${size.toFixed(1)} ${units[unitIndex]}`;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="relative group">
|
<div class="relative group">
|
||||||
<button
|
<button
|
||||||
class="h-14 {className} flex items-center space-x-3 bg-white dark:bg-gray-800 rounded-xl border border-gray-100 dark:border-gray-800 text-left"
|
class="h-14 {className} flex items-center space-x-3 {colorClassName} rounded-xl border border-gray-100 dark:border-gray-800 text-left"
|
||||||
type="button"
|
type="button"
|
||||||
on:click={async () => {
|
on:click={async () => {
|
||||||
if (clickHandler === null) {
|
if (clickHandler === null) {
|
||||||
@@ -92,11 +108,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-col justify-center -space-y-0.5 pl-1.5 pr-4 w-full">
|
<div class="flex flex-col justify-center -space-y-0.5 pl-1.5 pr-4 w-full">
|
||||||
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
|
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1 mb-1">
|
||||||
{name}
|
{name}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" text-gray-500 text-xs">
|
<div class=" flex justify-between text-gray-500 text-xs">
|
||||||
{#if type === 'file'}
|
{#if type === 'file'}
|
||||||
{$i18n.t('File')}
|
{$i18n.t('File')}
|
||||||
{:else if type === 'doc'}
|
{:else if type === 'doc'}
|
||||||
@@ -106,6 +122,9 @@
|
|||||||
{:else}
|
{:else}
|
||||||
<span class=" capitalize">{type}</span>
|
<span class=" capitalize">{type}</span>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if size}
|
||||||
|
<span class="capitalize">{formatSize(size)}</span>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -5,19 +5,21 @@
|
|||||||
export let src = '';
|
export let src = '';
|
||||||
export let alt = '';
|
export let alt = '';
|
||||||
|
|
||||||
let _src = '';
|
export let className = '';
|
||||||
|
|
||||||
|
let _src = '';
|
||||||
$: _src = src.startsWith('/') ? `${WEBUI_BASE_URL}${src}` : src;
|
$: _src = src.startsWith('/') ? `${WEBUI_BASE_URL}${src}` : src;
|
||||||
|
|
||||||
let showImagePreview = false;
|
let showImagePreview = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<ImagePreview bind:show={showImagePreview} src={_src} {alt} />
|
|
||||||
<button
|
<button
|
||||||
|
class={className}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
console.log('image preview');
|
|
||||||
showImagePreview = true;
|
showImagePreview = true;
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<img src={_src} {alt} class=" max-h-96 rounded-lg" draggable="false" data-cy="image" />
|
<img src={_src} {alt} class=" rounded-lg cursor-pointer" draggable="false" data-cy="image" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<ImagePreview bind:show={showImagePreview} src={_src} {alt} />
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
let mounted = false;
|
let mounted = false;
|
||||||
|
|
||||||
|
let previewElement = null;
|
||||||
|
|
||||||
const downloadImage = (url, filename) => {
|
const downloadImage = (url, filename) => {
|
||||||
fetch(url)
|
fetch(url)
|
||||||
.then((response) => response.blob())
|
.then((response) => response.blob())
|
||||||
@@ -34,14 +36,14 @@
|
|||||||
mounted = true;
|
mounted = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
$: if (mounted) {
|
$: if (show && previewElement) {
|
||||||
if (show) {
|
document.body.appendChild(previewElement);
|
||||||
window.addEventListener('keydown', handleKeyDown);
|
window.addEventListener('keydown', handleKeyDown);
|
||||||
document.body.style.overflow = 'hidden';
|
document.body.style.overflow = 'hidden';
|
||||||
} else {
|
} else if (previewElement) {
|
||||||
window.removeEventListener('keydown', handleKeyDown);
|
window.removeEventListener('keydown', handleKeyDown);
|
||||||
document.body.style.overflow = 'unset';
|
document.body.removeChild(previewElement);
|
||||||
}
|
document.body.style.overflow = 'unset';
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -49,9 +51,10 @@
|
|||||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||||
<div
|
<div
|
||||||
class="fixed top-0 right-0 left-0 bottom-0 bg-black text-white w-full min-h-screen h-screen flex justify-center z-50 overflow-hidden overscroll-contain"
|
bind:this={previewElement}
|
||||||
|
class="modal fixed top-0 right-0 left-0 bottom-0 bg-black text-white w-full min-h-screen h-screen flex justify-center z-[9999] overflow-hidden overscroll-contain"
|
||||||
>
|
>
|
||||||
<div class=" absolute left-0 w-full flex justify-between">
|
<div class=" absolute left-0 w-full flex justify-between select-none">
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class=" p-5"
|
class=" p-5"
|
||||||
@@ -95,6 +98,6 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<img {src} {alt} class=" mx-auto h-full object-scale-down" />
|
<img {src} {alt} class=" mx-auto h-full object-scale-down select-none" draggable="false" />
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { createEventDispatcher, onMount } from 'svelte';
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
let loaderElement: HTMLElement;
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
(entries, observer) => {
|
||||||
|
entries.forEach((entry) => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
dispatch('visible');
|
||||||
|
// observer.unobserve(loaderElement); // Stop observing until content is loaded
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
root: null, // viewport
|
||||||
|
rootMargin: '0px',
|
||||||
|
threshold: 0.1 // When 10% of the loader is visible
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
observer.observe(loaderElement);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div bind:this={loaderElement}>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
@@ -13,13 +13,13 @@
|
|||||||
|
|
||||||
<div class={outerClassName}>
|
<div class={outerClassName}>
|
||||||
<input
|
<input
|
||||||
class={inputClassName}
|
class={`${inputClassName} ${show ? '' : 'password'}`}
|
||||||
{placeholder}
|
{placeholder}
|
||||||
bind:value
|
bind:value
|
||||||
required={required && !readOnly}
|
required={required && !readOnly}
|
||||||
disabled={readOnly}
|
disabled={readOnly}
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
{...{ type: show ? 'text' : 'password' }}
|
type="text"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
class={showButtonClassName}
|
class={showButtonClassName}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
{/each}
|
{/each}
|
||||||
</datalist>
|
</datalist>
|
||||||
|
|
||||||
<button type="button" on:click={addTagHandler}>
|
<button type="button" aria-label={$i18n.t('Save Tag')} on:click={addTagHandler}>
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 16 16"
|
viewBox="0 0 16 16"
|
||||||
@@ -63,6 +63,7 @@
|
|||||||
<button
|
<button
|
||||||
class=" cursor-pointer self-center p-0.5 flex h-fit items-center dark:hover:bg-gray-700 rounded-full transition border dark:border-gray-600 border-dashed"
|
class=" cursor-pointer self-center p-0.5 flex h-fit items-center dark:hover:bg-gray-700 rounded-full transition border dark:border-gray-600 border-dashed"
|
||||||
type="button"
|
type="button"
|
||||||
|
aria-label={$i18n.t('Add Tag')}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
showTagInput = !showTagInput;
|
showTagInput = !showTagInput;
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { onMount, getContext } from 'svelte';
|
import { onMount, getContext, createEventDispatcher } from 'svelte';
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
import Switch from './Switch.svelte';
|
import Switch from './Switch.svelte';
|
||||||
@@ -8,7 +9,7 @@
|
|||||||
export let valves = {};
|
export let valves = {};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if valvesSpec}
|
{#if valvesSpec && Object.keys(valvesSpec?.properties ?? {}).length}
|
||||||
{#each Object.keys(valvesSpec.properties) as property, idx}
|
{#each Object.keys(valvesSpec.properties) as property, idx}
|
||||||
<div class=" py-0.5 w-full justify-between">
|
<div class=" py-0.5 w-full justify-between">
|
||||||
<div class="flex w-full justify-between">
|
<div class="flex w-full justify-between">
|
||||||
@@ -28,6 +29,8 @@
|
|||||||
(valves[property] ?? null) === null
|
(valves[property] ?? null) === null
|
||||||
? valvesSpec.properties[property]?.default ?? ''
|
? valvesSpec.properties[property]?.default ?? ''
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
|
dispatch('change');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{#if (valves[property] ?? null) === null}
|
{#if (valves[property] ?? null) === null}
|
||||||
@@ -52,6 +55,9 @@
|
|||||||
<select
|
<select
|
||||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none border border-gray-100 dark:border-gray-800"
|
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none border border-gray-100 dark:border-gray-800"
|
||||||
bind:value={valves[property]}
|
bind:value={valves[property]}
|
||||||
|
on:change={() => {
|
||||||
|
dispatch('change');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{#each valvesSpec.properties[property].enum as option}
|
{#each valvesSpec.properties[property].enum as option}
|
||||||
<option value={option} selected={option === valves[property]}>
|
<option value={option} selected={option === valves[property]}>
|
||||||
@@ -66,7 +72,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" pr-2">
|
<div class=" pr-2">
|
||||||
<Switch bind:state={valves[property]} />
|
<Switch
|
||||||
|
bind:state={valves[property]}
|
||||||
|
on:change={() => {
|
||||||
|
dispatch('change');
|
||||||
|
}}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
@@ -77,6 +88,9 @@
|
|||||||
bind:value={valves[property]}
|
bind:value={valves[property]}
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
required
|
required
|
||||||
|
on:change={() => {
|
||||||
|
dispatch('change');
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
@@ -91,5 +105,5 @@
|
|||||||
</div>
|
</div>
|
||||||
{/each}
|
{/each}
|
||||||
{:else}
|
{:else}
|
||||||
<div class="text-sm">No valves</div>
|
<div class="text-xs">No valves</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -35,12 +35,12 @@
|
|||||||
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
SUPPORTED_FILE_TYPE.includes(file['type']) ||
|
||||||
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
SUPPORTED_FILE_EXTENSIONS.includes(file.name.split('.').at(-1))
|
||||||
) {
|
) {
|
||||||
uploadDoc(file);
|
uploadDoc(file, tags);
|
||||||
} else {
|
} else {
|
||||||
toast.error(
|
toast.error(
|
||||||
`Unknown File Type '${file['type']}', but accepting and treating as plain text`
|
`Unknown File Type '${file['type']}', but accepting and treating as plain text`
|
||||||
);
|
);
|
||||||
uploadDoc(file);
|
uploadDoc(file, tags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,9 @@
|
|||||||
showSidebar,
|
showSidebar,
|
||||||
mobile,
|
mobile,
|
||||||
showArchivedChats,
|
showArchivedChats,
|
||||||
pinnedChats
|
pinnedChats,
|
||||||
|
scrollPaginationEnabled,
|
||||||
|
currentChatPage
|
||||||
} from '$lib/stores';
|
} from '$lib/stores';
|
||||||
import { onMount, getContext, tick } from 'svelte';
|
import { onMount, getContext, tick } from 'svelte';
|
||||||
|
|
||||||
@@ -34,6 +36,8 @@
|
|||||||
import UserMenu from './Sidebar/UserMenu.svelte';
|
import UserMenu from './Sidebar/UserMenu.svelte';
|
||||||
import ChatItem from './Sidebar/ChatItem.svelte';
|
import ChatItem from './Sidebar/ChatItem.svelte';
|
||||||
import DeleteConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
import DeleteConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||||
|
import Spinner from '../common/Spinner.svelte';
|
||||||
|
import Loader from '../common/Loader.svelte';
|
||||||
|
|
||||||
const BREAKPOINT = 768;
|
const BREAKPOINT = 768;
|
||||||
|
|
||||||
@@ -50,6 +54,10 @@
|
|||||||
|
|
||||||
let filteredChatList = [];
|
let filteredChatList = [];
|
||||||
|
|
||||||
|
// Pagination variables
|
||||||
|
let chatListLoading = false;
|
||||||
|
let allChatsLoaded = false;
|
||||||
|
|
||||||
$: filteredChatList = $chats.filter((chat) => {
|
$: filteredChatList = $chats.filter((chat) => {
|
||||||
if (search === '') {
|
if (search === '') {
|
||||||
return true;
|
return true;
|
||||||
@@ -70,6 +78,29 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const enablePagination = async () => {
|
||||||
|
// Reset pagination variables
|
||||||
|
currentChatPage.set(1);
|
||||||
|
allChatsLoaded = false;
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
|
|
||||||
|
// Enable pagination
|
||||||
|
scrollPaginationEnabled.set(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
const loadMoreChats = async () => {
|
||||||
|
chatListLoading = true;
|
||||||
|
|
||||||
|
currentChatPage.set($currentChatPage + 1);
|
||||||
|
const newChatList = await getChatList(localStorage.token, $currentChatPage);
|
||||||
|
|
||||||
|
// once the bottom of the list has been reached (no results) there is no need to continue querying
|
||||||
|
allChatsLoaded = newChatList.length === 0;
|
||||||
|
await chats.set([...$chats, ...newChatList]);
|
||||||
|
|
||||||
|
chatListLoading = false;
|
||||||
|
};
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
mobile.subscribe((e) => {
|
mobile.subscribe((e) => {
|
||||||
if ($showSidebar && e) {
|
if ($showSidebar && e) {
|
||||||
@@ -82,9 +113,8 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
showSidebar.set(window.innerWidth > BREAKPOINT);
|
showSidebar.set(window.innerWidth > BREAKPOINT);
|
||||||
|
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
await chats.set(await getChatList(localStorage.token));
|
await enablePagination();
|
||||||
|
|
||||||
let touchstart;
|
let touchstart;
|
||||||
let touchend;
|
let touchend;
|
||||||
@@ -185,7 +215,11 @@
|
|||||||
await tick();
|
await tick();
|
||||||
goto('/');
|
goto('/');
|
||||||
}
|
}
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
allChatsLoaded = false;
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
|
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -238,7 +272,7 @@
|
|||||||
<div class="px-2.5 flex justify-between space-x-1 text-gray-600 dark:text-gray-400">
|
<div class="px-2.5 flex justify-between space-x-1 text-gray-600 dark:text-gray-400">
|
||||||
<a
|
<a
|
||||||
id="sidebar-new-chat-button"
|
id="sidebar-new-chat-button"
|
||||||
class="flex flex-1 justify-between rounded-xl px-2 py-2 hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
class="flex flex-1 justify-between rounded-xl px-2 py-2 hover:bg-gray-100 dark:hover:bg-gray-900 transition"
|
||||||
href="/"
|
href="/"
|
||||||
draggable="false"
|
draggable="false"
|
||||||
on:click={async () => {
|
on:click={async () => {
|
||||||
@@ -282,7 +316,7 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
class=" cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
|
class=" cursor-pointer px-2 py-2 flex rounded-xl hover:bg-gray-100 dark:hover:bg-gray-900 transition"
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
showSidebar.set(!$showSidebar);
|
showSidebar.set(!$showSidebar);
|
||||||
}}
|
}}
|
||||||
@@ -410,7 +444,10 @@
|
|||||||
class="w-full rounded-r-xl py-1.5 pl-2.5 pr-4 text-sm bg-transparent dark:text-gray-300 outline-none"
|
class="w-full rounded-r-xl py-1.5 pl-2.5 pr-4 text-sm bg-transparent dark:text-gray-300 outline-none"
|
||||||
placeholder={$i18n.t('Search')}
|
placeholder={$i18n.t('Search')}
|
||||||
bind:value={search}
|
bind:value={search}
|
||||||
on:focus={() => {
|
on:focus={async () => {
|
||||||
|
// TODO: migrate backend for more scalable search mechanism
|
||||||
|
scrollPaginationEnabled.set(false);
|
||||||
|
await chats.set(await getChatList(localStorage.token)); // when searching, load all chats
|
||||||
enrichChatsWithContent($chats);
|
enrichChatsWithContent($chats);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@@ -422,7 +459,7 @@
|
|||||||
<button
|
<button
|
||||||
class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
|
class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
|
||||||
on:click={async () => {
|
on:click={async () => {
|
||||||
await chats.set(await getChatList(localStorage.token));
|
await enablePagination();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{$i18n.t('all')}
|
{$i18n.t('all')}
|
||||||
@@ -431,12 +468,17 @@
|
|||||||
<button
|
<button
|
||||||
class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
|
class="px-2.5 text-xs font-medium bg-gray-50 dark:bg-gray-900 dark:hover:bg-gray-800 transition rounded-full"
|
||||||
on:click={async () => {
|
on:click={async () => {
|
||||||
|
scrollPaginationEnabled.set(false);
|
||||||
let chatIds = await getChatListByTagName(localStorage.token, tag.name);
|
let chatIds = await getChatListByTagName(localStorage.token, tag.name);
|
||||||
if (chatIds.length === 0) {
|
if (chatIds.length === 0) {
|
||||||
await tags.set(await getAllChatTags(localStorage.token));
|
await tags.set(await getAllChatTags(localStorage.token));
|
||||||
chatIds = await getChatList(localStorage.token);
|
|
||||||
|
// if the tag we deleted is no longer a valid tag, return to main chat list view
|
||||||
|
await enablePagination();
|
||||||
}
|
}
|
||||||
await chats.set(chatIds);
|
await chats.set(chatIds);
|
||||||
|
|
||||||
|
chatListLoading = false;
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{tag.name}
|
{tag.name}
|
||||||
@@ -527,6 +569,21 @@
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{/each}
|
{/each}
|
||||||
|
|
||||||
|
{#if $scrollPaginationEnabled && !allChatsLoaded}
|
||||||
|
<Loader
|
||||||
|
on:visible={(e) => {
|
||||||
|
if (!chatListLoading) {
|
||||||
|
loadMoreChats();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div class="w-full flex justify-center py-1 text-xs animate-pulse items-center gap-2">
|
||||||
|
<Spinner className=" size-4" />
|
||||||
|
<div class=" ">Loading...</div>
|
||||||
|
</div>
|
||||||
|
</Loader>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
getChatListByTagName,
|
getChatListByTagName,
|
||||||
updateChatById
|
updateChatById
|
||||||
} from '$lib/apis/chats';
|
} from '$lib/apis/chats';
|
||||||
import { chatId, chats, mobile, pinnedChats, showSidebar } from '$lib/stores';
|
import { chatId, chats, mobile, pinnedChats, showSidebar, currentChatPage } from '$lib/stores';
|
||||||
|
|
||||||
import ChatMenu from './ChatMenu.svelte';
|
import ChatMenu from './ChatMenu.svelte';
|
||||||
import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
|
import ShareChatModal from '$lib/components/chat/ShareChatModal.svelte';
|
||||||
@@ -40,7 +40,9 @@
|
|||||||
await updateChatById(localStorage.token, id, {
|
await updateChatById(localStorage.token, id, {
|
||||||
title: _title
|
title: _title
|
||||||
});
|
});
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -53,14 +55,18 @@
|
|||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
goto(`/c/${res.id}`);
|
goto(`/c/${res.id}`);
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const archiveChatHandler = async (id) => {
|
const archiveChatHandler = async (id) => {
|
||||||
await archiveChatById(localStorage.token, id);
|
await archiveChatById(localStorage.token, id);
|
||||||
await chats.set(await getChatList(localStorage.token));
|
|
||||||
|
currentChatPage.set(1);
|
||||||
|
await chats.set(await getChatList(localStorage.token, $currentChatPage));
|
||||||
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
await pinnedChats.set(await getChatListByTagName(localStorage.token, 'pinned'));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
await documents.set(await getDocs(localStorage.token));
|
await documents.set(await getDocs(localStorage.token));
|
||||||
};
|
};
|
||||||
|
|
||||||
const uploadDoc = async (file) => {
|
const uploadDoc = async (file, tags?: object) => {
|
||||||
console.log(file);
|
console.log(file);
|
||||||
// Check if the file is an audio file and transcribe/convert it to text file
|
// Check if the file is an audio file and transcribe/convert it to text file
|
||||||
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
|
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
|
||||||
@@ -84,7 +84,12 @@
|
|||||||
res.collection_name,
|
res.collection_name,
|
||||||
res.filename,
|
res.filename,
|
||||||
transformFileName(res.filename),
|
transformFileName(res.filename),
|
||||||
res.filename
|
res.filename,
|
||||||
|
tags?.length > 0
|
||||||
|
? {
|
||||||
|
tags: tags
|
||||||
|
}
|
||||||
|
: null
|
||||||
).catch((error) => {
|
).catch((error) => {
|
||||||
toast.error(error);
|
toast.error(error);
|
||||||
return null;
|
return null;
|
||||||
@@ -239,6 +244,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
|
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
|
||||||
|
aria-label={$i18n.t('Add Docs')}
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
showAddDocModal = true;
|
showAddDocModal = true;
|
||||||
}}
|
}}
|
||||||
@@ -441,6 +447,7 @@
|
|||||||
<button
|
<button
|
||||||
class="self-center w-fit text-sm z-20 px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
class="self-center w-fit text-sm z-20 px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
type="button"
|
type="button"
|
||||||
|
aria-label={$i18n.t('Edit Doc')}
|
||||||
on:click={async (e) => {
|
on:click={async (e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
showEditDocModal = !showEditDocModal;
|
showEditDocModal = !showEditDocModal;
|
||||||
@@ -488,6 +495,7 @@
|
|||||||
<button
|
<button
|
||||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||||
type="button"
|
type="button"
|
||||||
|
aria-label={$i18n.t('Delete Doc')}
|
||||||
on:click={(e) => {
|
on:click={(e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
||||||
@@ -541,7 +549,8 @@
|
|||||||
doc.collection_name,
|
doc.collection_name,
|
||||||
doc.filename,
|
doc.filename,
|
||||||
doc.name,
|
doc.name,
|
||||||
doc.title
|
doc.title,
|
||||||
|
doc.content
|
||||||
).catch((error) => {
|
).catch((error) => {
|
||||||
toast.error(error);
|
toast.error(error);
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { getContext, onMount } from 'svelte';
|
||||||
|
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||||
|
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||||
|
|
||||||
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
|
export let actions = [];
|
||||||
|
export let selectedActionIds = [];
|
||||||
|
|
||||||
|
let _actions = {};
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
_actions = actions.reduce((acc, action) => {
|
||||||
|
acc[action.id] = {
|
||||||
|
...action,
|
||||||
|
selected: selectedActionIds.includes(action.id)
|
||||||
|
};
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="flex w-full justify-between mb-1">
|
||||||
|
<div class=" self-center text-sm font-semibold">{$i18n.t('Actions')}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class=" text-xs dark:text-gray-500">
|
||||||
|
{$i18n.t('To select actions here, add them to the "Functions" workspace first.')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col">
|
||||||
|
{#if actions.length > 0}
|
||||||
|
<div class=" flex items-center mt-2 flex-wrap">
|
||||||
|
{#each Object.keys(_actions) as action, actionIdx}
|
||||||
|
<div class=" flex items-center gap-2 mr-3">
|
||||||
|
<div class="self-center flex items-center">
|
||||||
|
<Checkbox
|
||||||
|
state={_actions[action].selected ? 'checked' : 'unchecked'}
|
||||||
|
on:change={(e) => {
|
||||||
|
_actions[action].selected = e.detail === 'checked';
|
||||||
|
selectedActionIds = Object.keys(_actions).filter((t) => _actions[t].selected);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class=" py-0.5 text-sm w-full capitalize font-medium">
|
||||||
|
<Tooltip content={_actions[action].meta.description}>
|
||||||
|
{_actions[action].name}
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "الحساب",
|
"Account": "الحساب",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "معلومات دقيقة",
|
"Accurate information": "معلومات دقيقة",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "أضف",
|
"Add": "أضف",
|
||||||
"Add a model id": "إضافة معرف نموذج",
|
"Add a model id": "إضافة معرف نموذج",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "إضافة ذكرايات",
|
"Add Memory": "إضافة ذكرايات",
|
||||||
"Add message": "اضافة رسالة",
|
"Add message": "اضافة رسالة",
|
||||||
"Add Model": "اضافة موديل",
|
"Add Model": "اضافة موديل",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "اضافة تاق",
|
"Add Tags": "اضافة تاق",
|
||||||
"Add User": "اضافة مستخدم",
|
"Add User": "اضافة مستخدم",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "سيؤدي ضبط هذه الإعدادات إلى تطبيق التغييرات بشكل عام على كافة المستخدمين",
|
"Adjusting these settings will apply changes universally to all users.": "سيؤدي ضبط هذه الإعدادات إلى تطبيق التغييرات بشكل عام على كافة المستخدمين",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "حذف المحادثه",
|
"Delete chat": "حذف المحادثه",
|
||||||
"Delete Chat": "حذف المحادثه.",
|
"Delete Chat": "حذف المحادثه.",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "أحذف هذا الرابط",
|
"delete this link": "أحذف هذا الرابط",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "تعديل الملف",
|
"Edit Doc": "تعديل الملف",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "تعديل المستخدم",
|
"Edit User": "تعديل المستخدم",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "البريد",
|
"Email": "البريد",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "نموذج التضمين",
|
"Embedding Model": "نموذج التضمين",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "إدارة النماذج",
|
"Manage Models": "إدارة النماذج",
|
||||||
"Manage Ollama Models": "Ollama إدارة موديلات ",
|
"Manage Ollama Models": "Ollama إدارة موديلات ",
|
||||||
"Manage Pipelines": "إدارة خطوط الأنابيب",
|
"Manage Pipelines": "إدارة خطوط الأنابيب",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "مارس",
|
"March": "مارس",
|
||||||
"Max Tokens (num_predict)": "ماكس توكنز (num_predict)",
|
"Max Tokens (num_predict)": "ماكس توكنز (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "لن تتم مشاركة الرسائل التي ترسلها بعد إنشاء الرابط الخاص بك. سيتمكن المستخدمون الذين لديهم عنوان URL من عرض الدردشة المشتركة",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "لن تتم مشاركة الرسائل التي ترسلها بعد إنشاء الرابط الخاص بك. سيتمكن المستخدمون الذين لديهم عنوان URL من عرض الدردشة المشتركة",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "الحد الأدنى من النقاط",
|
"Minimum Score": "الحد الأدنى من النقاط",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "حفظ",
|
"Save": "حفظ",
|
||||||
"Save & Create": "حفظ وإنشاء",
|
"Save & Create": "حفظ وإنشاء",
|
||||||
"Save & Update": "حفظ وتحديث",
|
"Save & Update": "حفظ وتحديث",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "لم يعد حفظ سجلات الدردشة مباشرة في مساحة تخزين متصفحك مدعومًا. يرجى تخصيص بعض الوقت لتنزيل وحذف سجلات الدردشة الخاصة بك عن طريق النقر على الزر أدناه. لا تقلق، يمكنك بسهولة إعادة استيراد سجلات الدردشة الخاصة بك إلى الواجهة الخلفية من خلاله",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "لم يعد حفظ سجلات الدردشة مباشرة في مساحة تخزين متصفحك مدعومًا. يرجى تخصيص بعض الوقت لتنزيل وحذف سجلات الدردشة الخاصة بك عن طريق النقر على الزر أدناه. لا تقلق، يمكنك بسهولة إعادة استيراد سجلات الدردشة الخاصة بك إلى الواجهة الخلفية من خلاله",
|
||||||
"Scan": "مسح",
|
"Scan": "مسح",
|
||||||
"Scan complete!": "تم المسح",
|
"Scan complete!": "تم المسح",
|
||||||
"Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
|
"Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "البحث",
|
"Search": "البحث",
|
||||||
"Search a model": "البحث عن موديل",
|
"Search a model": "البحث عن موديل",
|
||||||
"Search Chats": "البحث في الدردشات",
|
"Search Chats": "البحث في الدردشات",
|
||||||
@@ -621,6 +627,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "الى كتابة المحادثه",
|
"to chat input.": "الى كتابة المحادثه",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "اليوم",
|
"Today": "اليوم",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Акаунт",
|
"Account": "Акаунт",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "Точни информация",
|
"Accurate information": "Точни информация",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "Добавяне",
|
"Add": "Добавяне",
|
||||||
"Add a model id": "Добавяне на ИД на модел",
|
"Add a model id": "Добавяне на ИД на модел",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Добавяне на Памет",
|
"Add Memory": "Добавяне на Памет",
|
||||||
"Add message": "Добавяне на съобщение",
|
"Add message": "Добавяне на съобщение",
|
||||||
"Add Model": "Добавяне на Модел",
|
"Add Model": "Добавяне на Модел",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "добавяне на тагове",
|
"Add Tags": "добавяне на тагове",
|
||||||
"Add User": "Добавяне на потребител",
|
"Add User": "Добавяне на потребител",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "При промяна на тези настройки промените се прилагат за всички потребители.",
|
"Adjusting these settings will apply changes universally to all users.": "При промяна на тези настройки промените се прилагат за всички потребители.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Изтриване на чат",
|
"Delete chat": "Изтриване на чат",
|
||||||
"Delete Chat": "Изтриване на Чат",
|
"Delete Chat": "Изтриване на Чат",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "Изтриване на този линк",
|
"delete this link": "Изтриване на този линк",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Редактиране на документ",
|
"Edit Doc": "Редактиране на документ",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "Редактиране на потребител",
|
"Edit User": "Редактиране на потребител",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Имейл",
|
"Email": "Имейл",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "Модел за вграждане",
|
"Embedding Model": "Модел за вграждане",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Управление на Моделите",
|
"Manage Models": "Управление на Моделите",
|
||||||
"Manage Ollama Models": "Управление на Ollama Моделите",
|
"Manage Ollama Models": "Управление на Ollama Моделите",
|
||||||
"Manage Pipelines": "Управление на тръбопроводи",
|
"Manage Pipelines": "Управление на тръбопроводи",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "Март",
|
"March": "Март",
|
||||||
"Max Tokens (num_predict)": "Макс токени (num_predict)",
|
"Max Tokens (num_predict)": "Макс токени (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Съобщенията, които изпращате след създаването на връзката, няма да бъдат споделяни. Потребителите с URL адреса ще могат да видят споделения чат.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Съобщенията, които изпращате след създаването на връзката, няма да бъдат споделяни. Потребителите с URL адреса ще могат да видят споделения чат.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Минимална оценка",
|
"Minimum Score": "Минимална оценка",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Запис",
|
"Save": "Запис",
|
||||||
"Save & Create": "Запис & Създаване",
|
"Save & Create": "Запис & Създаване",
|
||||||
"Save & Update": "Запис & Актуализиране",
|
"Save & Update": "Запис & Актуализиране",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Запазването на чат логове директно в хранилището на вашия браузър вече не се поддържа. Моля, отделете малко време, за да изтеглите и изтриете чат логовете си, като щракнете върху бутона по-долу. Не се притеснявайте, можете лесно да импортирате отново чат логовете си в бекенда чрез",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Запазването на чат логове директно в хранилището на вашия браузър вече не се поддържа. Моля, отделете малко време, за да изтеглите и изтриете чат логовете си, като щракнете върху бутона по-долу. Не се притеснявайте, можете лесно да импортирате отново чат логовете си в бекенда чрез",
|
||||||
"Scan": "Сканиране",
|
"Scan": "Сканиране",
|
||||||
"Scan complete!": "Сканиране завършено!",
|
"Scan complete!": "Сканиране завършено!",
|
||||||
"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
|
"Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Търси",
|
"Search": "Търси",
|
||||||
"Search a model": "Търси модел",
|
"Search a model": "Търси модел",
|
||||||
"Search Chats": "Търсене на чатове",
|
"Search Chats": "Търсене на чатове",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "към чат входа.",
|
"to chat input.": "към чат входа.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "днес",
|
"Today": "днес",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "একাউন্ট",
|
"Account": "একাউন্ট",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "সঠিক তথ্য",
|
"Accurate information": "সঠিক তথ্য",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "যোগ করুন",
|
"Add": "যোগ করুন",
|
||||||
"Add a model id": "একটি মডেল ID যোগ করুন",
|
"Add a model id": "একটি মডেল ID যোগ করুন",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "মেমোরি যোগ করুন",
|
"Add Memory": "মেমোরি যোগ করুন",
|
||||||
"Add message": "মেসেজ যোগ করুন",
|
"Add message": "মেসেজ যোগ করুন",
|
||||||
"Add Model": "মডেল যোগ করুন",
|
"Add Model": "মডেল যোগ করুন",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "ট্যাগ যোগ করুন",
|
"Add Tags": "ট্যাগ যোগ করুন",
|
||||||
"Add User": "ইউজার যোগ করুন",
|
"Add User": "ইউজার যোগ করুন",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "এই সেটিংগুলো পরিবর্তন করলে তা সব ইউজারের উপরেই প্রয়োগ করা হবে",
|
"Adjusting these settings will apply changes universally to all users.": "এই সেটিংগুলো পরিবর্তন করলে তা সব ইউজারের উপরেই প্রয়োগ করা হবে",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "চ্যাট মুছে ফেলুন",
|
"Delete chat": "চ্যাট মুছে ফেলুন",
|
||||||
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "এই লিংক মুছে ফেলুন",
|
"delete this link": "এই লিংক মুছে ফেলুন",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "ডকুমেন্ট এডিট করুন",
|
"Edit Doc": "ডকুমেন্ট এডিট করুন",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "ইউজার এডিট করুন",
|
"Edit User": "ইউজার এডিট করুন",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "ইমেইল",
|
"Email": "ইমেইল",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "ইমেজ ইমেবডিং মডেল",
|
"Embedding Model": "ইমেজ ইমেবডিং মডেল",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
|
"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
|
||||||
"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
|
"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
|
||||||
"Manage Pipelines": "পাইপলাইন পরিচালনা করুন",
|
"Manage Pipelines": "পাইপলাইন পরিচালনা করুন",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "মার্চ",
|
"March": "মার্চ",
|
||||||
"Max Tokens (num_predict)": "সর্বোচ্চ টোকেন (num_predict)",
|
"Max Tokens (num_predict)": "সর্বোচ্চ টোকেন (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "আপনার লিঙ্ক তৈরি করার পরে আপনার পাঠানো বার্তাগুলি শেয়ার করা হবে না। ইউআরএল ব্যবহারকারীরা শেয়ার করা চ্যাট দেখতে পারবেন।",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "আপনার লিঙ্ক তৈরি করার পরে আপনার পাঠানো বার্তাগুলি শেয়ার করা হবে না। ইউআরএল ব্যবহারকারীরা শেয়ার করা চ্যাট দেখতে পারবেন।",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Minimum Score",
|
"Minimum Score": "Minimum Score",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "সংরক্ষণ",
|
"Save": "সংরক্ষণ",
|
||||||
"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
|
"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
|
||||||
"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
|
"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "মাধ্যমে",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "মাধ্যমে",
|
||||||
"Scan": "স্ক্যান",
|
"Scan": "স্ক্যান",
|
||||||
"Scan complete!": "স্ক্যান সম্পন্ন হয়েছে!",
|
"Scan complete!": "স্ক্যান সম্পন্ন হয়েছে!",
|
||||||
"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
|
"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "অনুসন্ধান",
|
"Search": "অনুসন্ধান",
|
||||||
"Search a model": "মডেল অনুসন্ধান করুন",
|
"Search a model": "মডেল অনুসন্ধান করুন",
|
||||||
"Search Chats": "চ্যাট অনুসন্ধান করুন",
|
"Search Chats": "চ্যাট অনুসন্ধান করুন",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "চ্যাট ইনপুটে",
|
"to chat input.": "চ্যাট ইনপুটে",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "আজ",
|
"Today": "আজ",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Compte",
|
"Account": "Compte",
|
||||||
"Account Activation Pending": "Activació del compte pendent",
|
"Account Activation Pending": "Activació del compte pendent",
|
||||||
"Accurate information": "Informació precisa",
|
"Accurate information": "Informació precisa",
|
||||||
|
"Actions": "Accions",
|
||||||
"Active Users": "Usuaris actius",
|
"Active Users": "Usuaris actius",
|
||||||
"Add": "Afegir",
|
"Add": "Afegir",
|
||||||
"Add a model id": "Afegeix un identificador de model",
|
"Add a model id": "Afegeix un identificador de model",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Afegir memòria",
|
"Add Memory": "Afegir memòria",
|
||||||
"Add message": "Afegir un missatge",
|
"Add message": "Afegir un missatge",
|
||||||
"Add Model": "Afegir un model",
|
"Add Model": "Afegir un model",
|
||||||
|
"Add Tag": "Afegir etiqueta",
|
||||||
"Add Tags": "Afegir etiquetes",
|
"Add Tags": "Afegir etiquetes",
|
||||||
"Add User": "Afegir un usuari",
|
"Add User": "Afegir un usuari",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Si ajustes aquesta preferència, els canvis s'aplicaran de manera universal a tots els usuaris.",
|
"Adjusting these settings will apply changes universally to all users.": "Si ajustes aquesta preferència, els canvis s'aplicaran de manera universal a tots els usuaris.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Eliminar xat",
|
"Delete chat": "Eliminar xat",
|
||||||
"Delete Chat": "Eliminar xat",
|
"Delete Chat": "Eliminar xat",
|
||||||
"Delete chat?": "Eliminar el xat?",
|
"Delete chat?": "Eliminar el xat?",
|
||||||
|
"Delete Doc": "Eliminar document",
|
||||||
"Delete function?": "Eliminar funció?",
|
"Delete function?": "Eliminar funció?",
|
||||||
"Delete prompt?": "Eliminar indicació?",
|
"Delete prompt?": "Eliminar indicació?",
|
||||||
"delete this link": "Eliminar aquest enllaç",
|
"delete this link": "Eliminar aquest enllaç",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Editar el document",
|
"Edit Doc": "Editar el document",
|
||||||
"Edit Memory": "Editar la memòria",
|
"Edit Memory": "Editar la memòria",
|
||||||
"Edit User": "Editar l'usuari",
|
"Edit User": "Editar l'usuari",
|
||||||
|
"ElevenLabs": "ElevenLabs",
|
||||||
"Email": "Correu electrònic",
|
"Email": "Correu electrònic",
|
||||||
"Embedding Batch Size": "Mida del lot d'incrustació",
|
"Embedding Batch Size": "Mida del lot d'incrustació",
|
||||||
"Embedding Model": "Model d'incrustació",
|
"Embedding Model": "Model d'incrustació",
|
||||||
@@ -274,7 +278,7 @@
|
|||||||
"File": "Arxiu",
|
"File": "Arxiu",
|
||||||
"File Mode": "Mode d'arxiu",
|
"File Mode": "Mode d'arxiu",
|
||||||
"File not found.": "No s'ha trobat l'arxiu.",
|
"File not found.": "No s'ha trobat l'arxiu.",
|
||||||
"Files": "",
|
"Files": "Arxius",
|
||||||
"Filter is now globally disabled": "El filtre ha estat desactivat globalment",
|
"Filter is now globally disabled": "El filtre ha estat desactivat globalment",
|
||||||
"Filter is now globally enabled": "El filtre ha estat activat globalment",
|
"Filter is now globally enabled": "El filtre ha estat activat globalment",
|
||||||
"Filters": "Filtres",
|
"Filters": "Filtres",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Gestionar els models",
|
"Manage Models": "Gestionar els models",
|
||||||
"Manage Ollama Models": "Gestionar els models Ollama",
|
"Manage Ollama Models": "Gestionar els models Ollama",
|
||||||
"Manage Pipelines": "Gestionar les Pipelines",
|
"Manage Pipelines": "Gestionar les Pipelines",
|
||||||
"Manage Valves": "Gestionar les Valves",
|
|
||||||
"March": "Març",
|
"March": "Març",
|
||||||
"Max Tokens (num_predict)": "Nombre màxim de Tokens (num_predict)",
|
"Max Tokens (num_predict)": "Nombre màxim de Tokens (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "Memòria eliminada correctament",
|
"Memory deleted successfully": "Memòria eliminada correctament",
|
||||||
"Memory updated successfully": "Memòria actualitzada correctament",
|
"Memory updated successfully": "Memòria actualitzada correctament",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Els missatges enviats després de crear el teu enllaç no es compartiran. Els usuaris amb l'URL podran veure el xat compartit.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Els missatges enviats després de crear el teu enllaç no es compartiran. Els usuaris amb l'URL podran veure el xat compartit.",
|
||||||
|
"Min P": "Min P",
|
||||||
"Minimum Score": "Puntuació mínima",
|
"Minimum Score": "Puntuació mínima",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Eta de Mirostat",
|
"Mirostat Eta": "Eta de Mirostat",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Desar",
|
"Save": "Desar",
|
||||||
"Save & Create": "Desar i crear",
|
"Save & Create": "Desar i crear",
|
||||||
"Save & Update": "Desar i actualitzar",
|
"Save & Update": "Desar i actualitzar",
|
||||||
|
"Save Tag": "Desar l'etiqueta",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarregr i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Desar els registres de xat directament a l'emmagatzematge del teu navegador ja no està suportat. Si us plau, descarregr i elimina els registres de xat fent clic al botó de sota. No et preocupis, pots tornar a importar fàcilment els teus registres de xat al backend a través de",
|
||||||
"Scan": "Escanejar",
|
"Scan": "Escanejar",
|
||||||
"Scan complete!": "Escaneigr completat!",
|
"Scan complete!": "Escaneigr completat!",
|
||||||
"Scan for documents from {{path}}": "Escanejar documents des de {{path}}",
|
"Scan for documents from {{path}}": "Escanejar documents des de {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Cercar",
|
"Search": "Cercar",
|
||||||
"Search a model": "Cercar un model",
|
"Search a model": "Cercar un model",
|
||||||
"Search Chats": "Cercar xats",
|
"Search Chats": "Cercar xats",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Per accedir a la WebUI, poseu-vos en contacte amb l'administrador. Els administradors poden gestionar els estats dels usuaris des del tauler d'administració.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Per accedir a la WebUI, poseu-vos en contacte amb l'administrador. Els administradors poden gestionar els estats dels usuaris des del tauler d'administració.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Per afegir documents aquí, puja-ls primer a l'espai de treball \"Documents\".",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Per afegir documents aquí, puja-ls primer a l'espai de treball \"Documents\".",
|
||||||
"to chat input.": "a l'entrada del xat.",
|
"to chat input.": "a l'entrada del xat.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "Per seleccionar accions aquí, afegeix-los primer a l'espai de treball \"Funcions\".",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "Per seleccionar filtres aquí, afegeix-los primer a l'espai de treball \"Funcions\".",
|
"To select filters here, add them to the \"Functions\" workspace first.": "Per seleccionar filtres aquí, afegeix-los primer a l'espai de treball \"Funcions\".",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Per seleccionar kits d'eines aquí, afegeix-los primer a l'espai de treball \"Eines\".",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Per seleccionar kits d'eines aquí, afegeix-los primer a l'espai de treball \"Eines\".",
|
||||||
"Today": "Avui",
|
"Today": "Avui",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Account",
|
"Account": "Account",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "",
|
"Accurate information": "",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "",
|
"Add": "",
|
||||||
"Add a model id": "",
|
"Add a model id": "",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "",
|
"Add Memory": "",
|
||||||
"Add message": "Pagdugang og mensahe",
|
"Add message": "Pagdugang og mensahe",
|
||||||
"Add Model": "",
|
"Add Model": "",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "idugang ang mga tag",
|
"Add Tags": "idugang ang mga tag",
|
||||||
"Add User": "",
|
"Add User": "",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Ang pag-adjust niini nga mga setting magamit ang mga pagbag-o sa tanan nga tiggamit.",
|
"Adjusting these settings will apply changes universally to all users.": "Ang pag-adjust niini nga mga setting magamit ang mga pagbag-o sa tanan nga tiggamit.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Pagtangtang sa panaghisgot",
|
"Delete chat": "Pagtangtang sa panaghisgot",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "I-edit ang dokumento",
|
"Edit Doc": "I-edit ang dokumento",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "I-edit ang tiggamit",
|
"Edit User": "I-edit ang tiggamit",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "E-mail",
|
"Email": "E-mail",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "",
|
"Embedding Model": "",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Pagdumala sa mga templates",
|
"Manage Models": "Pagdumala sa mga templates",
|
||||||
"Manage Ollama Models": "Pagdumala sa mga modelo sa Ollama",
|
"Manage Ollama Models": "Pagdumala sa mga modelo sa Ollama",
|
||||||
"Manage Pipelines": "",
|
"Manage Pipelines": "",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "",
|
"March": "",
|
||||||
"Max Tokens (num_predict)": "",
|
"Max Tokens (num_predict)": "",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Ang labing taas nga 3 nga mga disenyo mahimong ma-download nga dungan. ",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Ang labing taas nga 3 nga mga disenyo mahimong ma-download nga dungan. ",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "",
|
"Minimum Score": "",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Tipigi",
|
"Save": "Tipigi",
|
||||||
"Save & Create": "I-save ug Paghimo",
|
"Save & Create": "I-save ug Paghimo",
|
||||||
"Save & Update": "I-save ug I-update",
|
"Save & Update": "I-save ug I-update",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Ang pag-save sa mga chat log direkta sa imong browser storage dili na suportado. ",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Ang pag-save sa mga chat log direkta sa imong browser storage dili na suportado. ",
|
||||||
"Scan": "Aron ma-scan",
|
"Scan": "Aron ma-scan",
|
||||||
"Scan complete!": "Nakompleto ang pag-scan!",
|
"Scan complete!": "Nakompleto ang pag-scan!",
|
||||||
"Scan for documents from {{path}}": "I-scan ang mga dokumento gikan sa {{path}}",
|
"Scan for documents from {{path}}": "I-scan ang mga dokumento gikan sa {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Pagpanukiduki",
|
"Search": "Pagpanukiduki",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
"Search Chats": "",
|
"Search Chats": "",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "sa entrada sa iring.",
|
"to chat input.": "sa entrada sa iring.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "",
|
"Today": "",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Konto",
|
"Account": "Konto",
|
||||||
"Account Activation Pending": "Kontoaktivierung ausstehend",
|
"Account Activation Pending": "Kontoaktivierung ausstehend",
|
||||||
"Accurate information": "Präzise Information(en)",
|
"Accurate information": "Präzise Information(en)",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "Aktive Benutzer",
|
"Active Users": "Aktive Benutzer",
|
||||||
"Add": "Hinzufügen",
|
"Add": "Hinzufügen",
|
||||||
"Add a model id": "Modell-ID hinzufügen",
|
"Add a model id": "Modell-ID hinzufügen",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Erinnerung hinzufügen",
|
"Add Memory": "Erinnerung hinzufügen",
|
||||||
"Add message": "Nachricht hinzufügen",
|
"Add message": "Nachricht hinzufügen",
|
||||||
"Add Model": "Modell hinzufügen",
|
"Add Model": "Modell hinzufügen",
|
||||||
|
"Add Tag": "Tag hinzufügen",
|
||||||
"Add Tags": "Tags hinzufügen",
|
"Add Tags": "Tags hinzufügen",
|
||||||
"Add User": "Benutzer hinzufügen",
|
"Add User": "Benutzer hinzufügen",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wird Änderungen universell auf alle Benutzer anwenden.",
|
"Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wird Änderungen universell auf alle Benutzer anwenden.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Unterhaltung löschen",
|
"Delete chat": "Unterhaltung löschen",
|
||||||
"Delete Chat": "Unterhaltung löschen",
|
"Delete Chat": "Unterhaltung löschen",
|
||||||
"Delete chat?": "Unterhaltung löschen?",
|
"Delete chat?": "Unterhaltung löschen?",
|
||||||
|
"Delete Doc": "Dokument löschen",
|
||||||
"Delete function?": "Funktion löschen?",
|
"Delete function?": "Funktion löschen?",
|
||||||
"Delete prompt?": "Prompt löschen?",
|
"Delete prompt?": "Prompt löschen?",
|
||||||
"delete this link": "diesen Link löschen",
|
"delete this link": "diesen Link löschen",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Dokument bearbeiten",
|
"Edit Doc": "Dokument bearbeiten",
|
||||||
"Edit Memory": "Erinnerungen bearbeiten",
|
"Edit Memory": "Erinnerungen bearbeiten",
|
||||||
"Edit User": "Benutzer bearbeiten",
|
"Edit User": "Benutzer bearbeiten",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "E-Mail",
|
"Email": "E-Mail",
|
||||||
"Embedding Batch Size": "Embedding-Stapelgröße",
|
"Embedding Batch Size": "Embedding-Stapelgröße",
|
||||||
"Embedding Model": "Embedding-Modell",
|
"Embedding Model": "Embedding-Modell",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Modelle verwalten",
|
"Manage Models": "Modelle verwalten",
|
||||||
"Manage Ollama Models": "Ollama-Modelle verwalten",
|
"Manage Ollama Models": "Ollama-Modelle verwalten",
|
||||||
"Manage Pipelines": "Pipelines verwalten",
|
"Manage Pipelines": "Pipelines verwalten",
|
||||||
"Manage Valves": "Valves verwalten",
|
|
||||||
"March": "März",
|
"March": "März",
|
||||||
"Max Tokens (num_predict)": "Maximale Tokenanzahl (num_predict)",
|
"Max Tokens (num_predict)": "Maximale Tokenanzahl (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuchen Sie es später erneut.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuchen Sie es später erneut.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "Erinnerung erfolgreich gelöscht",
|
"Memory deleted successfully": "Erinnerung erfolgreich gelöscht",
|
||||||
"Memory updated successfully": "Erinnerung erfolgreich aktualisiert",
|
"Memory updated successfully": "Erinnerung erfolgreich aktualisiert",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können die freigegebene Unterhaltung einsehen.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können die freigegebene Unterhaltung einsehen.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Mindestpunktzahl",
|
"Minimum Score": "Mindestpunktzahl",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Speichern",
|
"Save": "Speichern",
|
||||||
"Save & Create": "Erstellen",
|
"Save & Create": "Erstellen",
|
||||||
"Save & Update": "Aktualisieren",
|
"Save & Update": "Aktualisieren",
|
||||||
|
"Save Tag": "Tag speichern",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Unterhaltungen im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Unterhaltungen zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Unterhaltungen problemlos über das Backend wieder importieren.",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Unterhaltungen im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Unterhaltungen zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Unterhaltungen problemlos über das Backend wieder importieren.",
|
||||||
"Scan": "Scannen",
|
"Scan": "Scannen",
|
||||||
"Scan complete!": "Scan abgeschlossen!",
|
"Scan complete!": "Scan abgeschlossen!",
|
||||||
"Scan for documents from {{path}}": "Dokumente im {{path}} scannen",
|
"Scan for documents from {{path}}": "Dokumente im {{path}} scannen",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Suchen",
|
"Search": "Suchen",
|
||||||
"Search a model": "Modell suchen",
|
"Search a model": "Modell suchen",
|
||||||
"Search Chats": "Unterhaltungen durchsuchen...",
|
"Search Chats": "Unterhaltungen durchsuchen...",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Um auf das WebUI zugreifen zu können, wenden Sie sich bitte an einen Administrator. Administratoren können den Benutzerstatus über das Admin-Panel verwalten.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Um auf das WebUI zugreifen zu können, wenden Sie sich bitte an einen Administrator. Administratoren können den Benutzerstatus über das Admin-Panel verwalten.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Um Dokumente hinzuzufügen, laden Sie sie zuerst im Arbeitsbereich „Dokumente“ hoch.",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Um Dokumente hinzuzufügen, laden Sie sie zuerst im Arbeitsbereich „Dokumente“ hoch.",
|
||||||
"to chat input.": "zum Eingabefeld der Unterhaltung.",
|
"to chat input.": "zum Eingabefeld der Unterhaltung.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.",
|
"To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Um Toolkits auszuwählen, fügen Sie sie zunächst dem Arbeitsbereich „Werkzeuge“ hinzu.",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Um Toolkits auszuwählen, fügen Sie sie zunächst dem Arbeitsbereich „Werkzeuge“ hinzu.",
|
||||||
"Today": "Heute",
|
"Today": "Heute",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Account",
|
"Account": "Account",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "",
|
"Accurate information": "",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "",
|
"Add": "",
|
||||||
"Add a model id": "",
|
"Add a model id": "",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "",
|
"Add Memory": "",
|
||||||
"Add message": "Add Prompt",
|
"Add message": "Add Prompt",
|
||||||
"Add Model": "",
|
"Add Model": "",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "",
|
"Add Tags": "",
|
||||||
"Add User": "",
|
"Add User": "",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Adjusting these settings will apply changes to all users. Such universal, very wow.",
|
"Adjusting these settings will apply changes universally to all users.": "Adjusting these settings will apply changes to all users. Such universal, very wow.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Delete chat",
|
"Delete chat": "Delete chat",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Edit Doge",
|
"Edit Doc": "Edit Doge",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "Edit Wowser",
|
"Edit User": "Edit Wowser",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Email",
|
"Email": "Email",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "",
|
"Embedding Model": "",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Manage Wowdels",
|
"Manage Models": "Manage Wowdels",
|
||||||
"Manage Ollama Models": "Manage Ollama Wowdels",
|
"Manage Ollama Models": "Manage Ollama Wowdels",
|
||||||
"Manage Pipelines": "",
|
"Manage Pipelines": "",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "",
|
"March": "",
|
||||||
"Max Tokens (num_predict)": "",
|
"Max Tokens (num_predict)": "",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximum of 3 models can be downloaded simultaneously. Please try again later.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximum of 3 models can be downloaded simultaneously. Please try again later.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "",
|
"Minimum Score": "",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Save much wow",
|
"Save": "Save much wow",
|
||||||
"Save & Create": "Save & Create much create",
|
"Save & Create": "Save & Create much create",
|
||||||
"Save & Update": "Save & Update much update",
|
"Save & Update": "Save & Update much update",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Saving chat logs in browser storage not support anymore. Pls download and delete your chat logs by click button below. Much easy re-import to backend through",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Saving chat logs in browser storage not support anymore. Pls download and delete your chat logs by click button below. Much easy re-import to backend through",
|
||||||
"Scan": "Scan much scan",
|
"Scan": "Scan much scan",
|
||||||
"Scan complete!": "Scan complete! Very wow!",
|
"Scan complete!": "Scan complete! Very wow!",
|
||||||
"Scan for documents from {{path}}": "Scan for documents from {{path}} wow",
|
"Scan for documents from {{path}}": "Scan for documents from {{path}} wow",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Search very search",
|
"Search": "Search very search",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
"Search Chats": "",
|
"Search Chats": "",
|
||||||
@@ -619,6 +625,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "to chat input. Very chat.",
|
"to chat input.": "to chat input. Very chat.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "",
|
"Today": "",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "",
|
"Account": "",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "",
|
"Accurate information": "",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "",
|
"Add": "",
|
||||||
"Add a model id": "",
|
"Add a model id": "",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "",
|
"Add Memory": "",
|
||||||
"Add message": "",
|
"Add message": "",
|
||||||
"Add Model": "",
|
"Add Model": "",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "",
|
"Add Tags": "",
|
||||||
"Add User": "",
|
"Add User": "",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "",
|
"Adjusting these settings will apply changes universally to all users.": "",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "",
|
"Delete chat": "",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "",
|
"Edit Doc": "",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "",
|
"Edit User": "",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "",
|
"Email": "",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "",
|
"Embedding Model": "",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "",
|
"Manage Models": "",
|
||||||
"Manage Ollama Models": "",
|
"Manage Ollama Models": "",
|
||||||
"Manage Pipelines": "",
|
"Manage Pipelines": "",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "",
|
"March": "",
|
||||||
"Max Tokens (num_predict)": "",
|
"Max Tokens (num_predict)": "",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "",
|
"Minimum Score": "",
|
||||||
"Mirostat": "",
|
"Mirostat": "",
|
||||||
"Mirostat Eta": "",
|
"Mirostat Eta": "",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "",
|
"Save": "",
|
||||||
"Save & Create": "",
|
"Save & Create": "",
|
||||||
"Save & Update": "",
|
"Save & Update": "",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "",
|
||||||
"Scan": "",
|
"Scan": "",
|
||||||
"Scan complete!": "",
|
"Scan complete!": "",
|
||||||
"Scan for documents from {{path}}": "",
|
"Scan for documents from {{path}}": "",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "",
|
"Search": "",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
"Search Chats": "",
|
"Search Chats": "",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "",
|
"to chat input.": "",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "",
|
"Today": "",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "",
|
"Account": "",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "",
|
"Accurate information": "",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "",
|
"Add": "",
|
||||||
"Add a model id": "",
|
"Add a model id": "",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "",
|
"Add Memory": "",
|
||||||
"Add message": "",
|
"Add message": "",
|
||||||
"Add Model": "",
|
"Add Model": "",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "",
|
"Add Tags": "",
|
||||||
"Add User": "",
|
"Add User": "",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "",
|
"Adjusting these settings will apply changes universally to all users.": "",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "",
|
"Delete chat": "",
|
||||||
"Delete Chat": "",
|
"Delete Chat": "",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "",
|
"delete this link": "",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "",
|
"Edit Doc": "",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "",
|
"Edit User": "",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "",
|
"Email": "",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "",
|
"Embedding Model": "",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "",
|
"Manage Models": "",
|
||||||
"Manage Ollama Models": "",
|
"Manage Ollama Models": "",
|
||||||
"Manage Pipelines": "",
|
"Manage Pipelines": "",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "",
|
"March": "",
|
||||||
"Max Tokens (num_predict)": "",
|
"Max Tokens (num_predict)": "",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "",
|
"Minimum Score": "",
|
||||||
"Mirostat": "",
|
"Mirostat": "",
|
||||||
"Mirostat Eta": "",
|
"Mirostat Eta": "",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "",
|
"Save": "",
|
||||||
"Save & Create": "",
|
"Save & Create": "",
|
||||||
"Save & Update": "",
|
"Save & Update": "",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "",
|
||||||
"Scan": "",
|
"Scan": "",
|
||||||
"Scan complete!": "",
|
"Scan complete!": "",
|
||||||
"Scan for documents from {{path}}": "",
|
"Scan for documents from {{path}}": "",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "",
|
"Search": "",
|
||||||
"Search a model": "",
|
"Search a model": "",
|
||||||
"Search Chats": "",
|
"Search Chats": "",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "",
|
"to chat input.": "",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "",
|
"Today": "",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Cuenta",
|
"Account": "Cuenta",
|
||||||
"Account Activation Pending": "Activación de cuenta pendiente",
|
"Account Activation Pending": "Activación de cuenta pendiente",
|
||||||
"Accurate information": "Información precisa",
|
"Accurate information": "Información precisa",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "Usuarios activos",
|
"Active Users": "Usuarios activos",
|
||||||
"Add": "Agregar",
|
"Add": "Agregar",
|
||||||
"Add a model id": "Adición de un identificador de modelo",
|
"Add a model id": "Adición de un identificador de modelo",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Agregar Memoria",
|
"Add Memory": "Agregar Memoria",
|
||||||
"Add message": "Agregar Prompt",
|
"Add message": "Agregar Prompt",
|
||||||
"Add Model": "Agregar Modelo",
|
"Add Model": "Agregar Modelo",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "agregar etiquetas",
|
"Add Tags": "agregar etiquetas",
|
||||||
"Add User": "Agregar Usuario",
|
"Add User": "Agregar Usuario",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar estas opciones aplicará los cambios universalmente a todos los usuarios.",
|
"Adjusting these settings will apply changes universally to all users.": "Ajustar estas opciones aplicará los cambios universalmente a todos los usuarios.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Borrar chat",
|
"Delete chat": "Borrar chat",
|
||||||
"Delete Chat": "Borrar Chat",
|
"Delete Chat": "Borrar Chat",
|
||||||
"Delete chat?": "Borrar el chat?",
|
"Delete chat?": "Borrar el chat?",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "Borrar este enlace",
|
"delete this link": "Borrar este enlace",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Editar Documento",
|
"Edit Doc": "Editar Documento",
|
||||||
"Edit Memory": "Editar Memoria",
|
"Edit Memory": "Editar Memoria",
|
||||||
"Edit User": "Editar Usuario",
|
"Edit User": "Editar Usuario",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Email",
|
"Email": "Email",
|
||||||
"Embedding Batch Size": "Tamaño de Embedding",
|
"Embedding Batch Size": "Tamaño de Embedding",
|
||||||
"Embedding Model": "Modelo de Embedding",
|
"Embedding Model": "Modelo de Embedding",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Administrar Modelos",
|
"Manage Models": "Administrar Modelos",
|
||||||
"Manage Ollama Models": "Administrar Modelos Ollama",
|
"Manage Ollama Models": "Administrar Modelos Ollama",
|
||||||
"Manage Pipelines": "Administrar Pipelines",
|
"Manage Pipelines": "Administrar Pipelines",
|
||||||
"Manage Valves": "Gestionar Valves",
|
|
||||||
"March": "Marzo",
|
"March": "Marzo",
|
||||||
"Max Tokens (num_predict)": "Máximo de fichas (num_predict)",
|
"Max Tokens (num_predict)": "Máximo de fichas (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se pueden descargar un máximo de 3 modelos simultáneamente. Por favor, inténtelo de nuevo más tarde.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se pueden descargar un máximo de 3 modelos simultáneamente. Por favor, inténtelo de nuevo más tarde.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "Memoria borrada correctamente",
|
"Memory deleted successfully": "Memoria borrada correctamente",
|
||||||
"Memory updated successfully": "Memoria actualizada correctamente",
|
"Memory updated successfully": "Memoria actualizada correctamente",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de crear su enlace no se compartirán. Los usuarios con el enlace podrán ver el chat compartido.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Los mensajes que envíe después de crear su enlace no se compartirán. Los usuarios con el enlace podrán ver el chat compartido.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Puntuación mínima",
|
"Minimum Score": "Puntuación mínima",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Guardar",
|
"Save": "Guardar",
|
||||||
"Save & Create": "Guardar y Crear",
|
"Save & Create": "Guardar y Crear",
|
||||||
"Save & Update": "Guardar y Actualizar",
|
"Save & Update": "Guardar y Actualizar",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Ya no se admite guardar registros de chat directamente en el almacenamiento de su navegador. Tómese un momento para descargar y eliminar sus registros de chat haciendo clic en el botón a continuación. No te preocupes, puedes volver a importar fácilmente tus registros de chat al backend a través de",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Ya no se admite guardar registros de chat directamente en el almacenamiento de su navegador. Tómese un momento para descargar y eliminar sus registros de chat haciendo clic en el botón a continuación. No te preocupes, puedes volver a importar fácilmente tus registros de chat al backend a través de",
|
||||||
"Scan": "Escanear",
|
"Scan": "Escanear",
|
||||||
"Scan complete!": "¡Escaneo completado!",
|
"Scan complete!": "¡Escaneo completado!",
|
||||||
"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
|
"Scan for documents from {{path}}": "Escanear en busca de documentos desde {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Buscar",
|
"Search": "Buscar",
|
||||||
"Search a model": "Buscar un modelo",
|
"Search a model": "Buscar un modelo",
|
||||||
"Search Chats": "Chats de búsqueda",
|
"Search Chats": "Chats de búsqueda",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder al interfaz de usuario web, por favor contacte al administrador. Los administradores pueden administrar los estados de los usuarios desde el panel de administración.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para acceder al interfaz de usuario web, por favor contacte al administrador. Los administradores pueden administrar los estados de los usuarios desde el panel de administración.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Para agregar documentos aquí, subalos al área de trabajo \"Documentos\" primero.",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Para agregar documentos aquí, subalos al área de trabajo \"Documentos\" primero.",
|
||||||
"to chat input.": "a la entrada del chat.",
|
"to chat input.": "a la entrada del chat.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "Para seleccionar filtros aquí, agreguelos al área de trabajo \"Funciones\" primero.",
|
"To select filters here, add them to the \"Functions\" workspace first.": "Para seleccionar filtros aquí, agreguelos al área de trabajo \"Funciones\" primero.",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Para seleccionar herramientas aquí, agreguelas al área de trabajo \"Herramientas\" primero.",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Para seleccionar herramientas aquí, agreguelas al área de trabajo \"Herramientas\" primero.",
|
||||||
"Today": "Hoy",
|
"Today": "Hoy",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "حساب کاربری",
|
"Account": "حساب کاربری",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "اطلاعات دقیق",
|
"Accurate information": "اطلاعات دقیق",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "اضافه کردن",
|
"Add": "اضافه کردن",
|
||||||
"Add a model id": "افزودن شناسه مدل",
|
"Add a model id": "افزودن شناسه مدل",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "اضافه کردن یادگیری",
|
"Add Memory": "اضافه کردن یادگیری",
|
||||||
"Add message": "اضافه کردن پیغام",
|
"Add message": "اضافه کردن پیغام",
|
||||||
"Add Model": "اضافه کردن مدل",
|
"Add Model": "اضافه کردن مدل",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "اضافه کردن تگ\u200cها",
|
"Add Tags": "اضافه کردن تگ\u200cها",
|
||||||
"Add User": "اضافه کردن کاربر",
|
"Add User": "اضافه کردن کاربر",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "با تنظیم این تنظیمات، تغییرات به طور کلی برای همه کاربران اعمال می شود.",
|
"Adjusting these settings will apply changes universally to all users.": "با تنظیم این تنظیمات، تغییرات به طور کلی برای همه کاربران اعمال می شود.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "حذف گپ",
|
"Delete chat": "حذف گپ",
|
||||||
"Delete Chat": "حذف گپ",
|
"Delete Chat": "حذف گپ",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "حذف این لینک",
|
"delete this link": "حذف این لینک",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "ویرایش سند",
|
"Edit Doc": "ویرایش سند",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "ویرایش کاربر",
|
"Edit User": "ویرایش کاربر",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "ایمیل",
|
"Email": "ایمیل",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "مدل پیدائش",
|
"Embedding Model": "مدل پیدائش",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "مدیریت مدل\u200cها",
|
"Manage Models": "مدیریت مدل\u200cها",
|
||||||
"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
|
"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
|
||||||
"Manage Pipelines": "مدیریت خطوط لوله",
|
"Manage Pipelines": "مدیریت خطوط لوله",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "مارچ",
|
"March": "مارچ",
|
||||||
"Max Tokens (num_predict)": "توکنهای بیشینه (num_predict)",
|
"Max Tokens (num_predict)": "توکنهای بیشینه (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "پیام های شما بعد از ایجاد لینک شما به اشتراک نمی گردد. کاربران با لینک URL می توانند چت اشتراک را مشاهده کنند.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "پیام های شما بعد از ایجاد لینک شما به اشتراک نمی گردد. کاربران با لینک URL می توانند چت اشتراک را مشاهده کنند.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "نماد کمینه",
|
"Minimum Score": "نماد کمینه",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "ذخیره",
|
"Save": "ذخیره",
|
||||||
"Save & Create": "ذخیره و ایجاد",
|
"Save & Create": "ذخیره و ایجاد",
|
||||||
"Save & Update": "ذخیره و به\u200cروزرسانی",
|
"Save & Update": "ذخیره و به\u200cروزرسانی",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ذخیره گزارش\u200cهای چت مستقیماً در حافظه مرورگر شما دیگر پشتیبانی نمی\u200cشود. لطفاً با کلیک بر روی دکمه زیر، چند لحظه برای دانلود و حذف گزارش های چت خود وقت بگذارید. نگران نباشید، شما به راحتی می توانید گزارش های چت خود را از طریق بکند دوباره وارد کنید",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ذخیره گزارش\u200cهای چت مستقیماً در حافظه مرورگر شما دیگر پشتیبانی نمی\u200cشود. لطفاً با کلیک بر روی دکمه زیر، چند لحظه برای دانلود و حذف گزارش های چت خود وقت بگذارید. نگران نباشید، شما به راحتی می توانید گزارش های چت خود را از طریق بکند دوباره وارد کنید",
|
||||||
"Scan": "اسکن",
|
"Scan": "اسکن",
|
||||||
"Scan complete!": "اسکن کامل شد!",
|
"Scan complete!": "اسکن کامل شد!",
|
||||||
"Scan for documents from {{path}}": "اسکن اسناد از {{path}}",
|
"Scan for documents from {{path}}": "اسکن اسناد از {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "جستجو",
|
"Search": "جستجو",
|
||||||
"Search a model": "جستجوی مدل",
|
"Search a model": "جستجوی مدل",
|
||||||
"Search Chats": "جستجو گپ ها",
|
"Search Chats": "جستجو گپ ها",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "در ورودی گپ.",
|
"to chat input.": "در ورودی گپ.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "امروز",
|
"Today": "امروز",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Tili",
|
"Account": "Tili",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "Tarkkaa tietoa",
|
"Accurate information": "Tarkkaa tietoa",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "Lisää",
|
"Add": "Lisää",
|
||||||
"Add a model id": "Mallitunnuksen lisääminen",
|
"Add a model id": "Mallitunnuksen lisääminen",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Lisää muistia",
|
"Add Memory": "Lisää muistia",
|
||||||
"Add message": "Lisää viesti",
|
"Add message": "Lisää viesti",
|
||||||
"Add Model": "Lisää malli",
|
"Add Model": "Lisää malli",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Lisää tageja",
|
"Add Tags": "Lisää tageja",
|
||||||
"Add User": "Lisää käyttäjä",
|
"Add User": "Lisää käyttäjä",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Näiden asetusten säätäminen vaikuttaa kaikkiin käyttäjiin.",
|
"Adjusting these settings will apply changes universally to all users.": "Näiden asetusten säätäminen vaikuttaa kaikkiin käyttäjiin.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Poista keskustelu",
|
"Delete chat": "Poista keskustelu",
|
||||||
"Delete Chat": "Poista keskustelu",
|
"Delete Chat": "Poista keskustelu",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "poista tämä linkki",
|
"delete this link": "poista tämä linkki",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Muokkaa asiakirjaa",
|
"Edit Doc": "Muokkaa asiakirjaa",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "Muokkaa käyttäjää",
|
"Edit User": "Muokkaa käyttäjää",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Sähköposti",
|
"Email": "Sähköposti",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "Upotusmalli",
|
"Embedding Model": "Upotusmalli",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Hallitse malleja",
|
"Manage Models": "Hallitse malleja",
|
||||||
"Manage Ollama Models": "Hallitse Ollama-malleja",
|
"Manage Ollama Models": "Hallitse Ollama-malleja",
|
||||||
"Manage Pipelines": "Hallitse putkia",
|
"Manage Pipelines": "Hallitse putkia",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "maaliskuu",
|
"March": "maaliskuu",
|
||||||
"Max Tokens (num_predict)": "Tokenien enimmäismäärä (num_predict)",
|
"Max Tokens (num_predict)": "Tokenien enimmäismäärä (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämiäsi viestejä ei jaeta. Käyttäjät, joilla on URL-osoite, voivat tarkastella jaettua keskustelua.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämiäsi viestejä ei jaeta. Käyttäjät, joilla on URL-osoite, voivat tarkastella jaettua keskustelua.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Vähimmäispisteet",
|
"Minimum Score": "Vähimmäispisteet",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Tallenna",
|
"Save": "Tallenna",
|
||||||
"Save & Create": "Tallenna ja luo",
|
"Save & Create": "Tallenna ja luo",
|
||||||
"Save & Update": "Tallenna ja päivitä",
|
"Save & Update": "Tallenna ja päivitä",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettua. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettua. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin",
|
||||||
"Scan": "Skannaa",
|
"Scan": "Skannaa",
|
||||||
"Scan complete!": "Skannaus valmis!",
|
"Scan complete!": "Skannaus valmis!",
|
||||||
"Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}",
|
"Scan for documents from {{path}}": "Skannaa asiakirjoja polusta {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Haku",
|
"Search": "Haku",
|
||||||
"Search a model": "Hae mallia",
|
"Search a model": "Hae mallia",
|
||||||
"Search Chats": "Etsi chatteja",
|
"Search Chats": "Etsi chatteja",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "keskustelusyötteeseen.",
|
"to chat input.": "keskustelusyötteeseen.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "Tänään",
|
"Today": "Tänään",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Compte",
|
"Account": "Compte",
|
||||||
"Account Activation Pending": "Activation du compte en attente",
|
"Account Activation Pending": "Activation du compte en attente",
|
||||||
"Accurate information": "Information exacte",
|
"Accurate information": "Information exacte",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "Utilisateurs actifs",
|
"Active Users": "Utilisateurs actifs",
|
||||||
"Add": "Ajouter",
|
"Add": "Ajouter",
|
||||||
"Add a model id": "Ajouter un identifiant de modèle",
|
"Add a model id": "Ajouter un identifiant de modèle",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Ajouter de la mémoire",
|
"Add Memory": "Ajouter de la mémoire",
|
||||||
"Add message": "Ajouter un message",
|
"Add message": "Ajouter un message",
|
||||||
"Add Model": "Ajouter un modèle",
|
"Add Model": "Ajouter un modèle",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Ajouter des balises",
|
"Add Tags": "Ajouter des balises",
|
||||||
"Add User": "Ajouter un Utilisateur",
|
"Add User": "Ajouter un Utilisateur",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
|
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Supprimer la conversation",
|
"Delete chat": "Supprimer la conversation",
|
||||||
"Delete Chat": "Supprimer la Conversation",
|
"Delete Chat": "Supprimer la Conversation",
|
||||||
"Delete chat?": "Supprimer la conversation ?",
|
"Delete chat?": "Supprimer la conversation ?",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "Supprimer la fonction ?",
|
"Delete function?": "Supprimer la fonction ?",
|
||||||
"Delete prompt?": "Supprimer la prompt ?",
|
"Delete prompt?": "Supprimer la prompt ?",
|
||||||
"delete this link": "supprimer ce lien",
|
"delete this link": "supprimer ce lien",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Modifier le document",
|
"Edit Doc": "Modifier le document",
|
||||||
"Edit Memory": "Modifier la mémoire",
|
"Edit Memory": "Modifier la mémoire",
|
||||||
"Edit User": "Modifier l'utilisateur",
|
"Edit User": "Modifier l'utilisateur",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "E-mail",
|
"Email": "E-mail",
|
||||||
"Embedding Batch Size": "Taille du lot d'encodage",
|
"Embedding Batch Size": "Taille du lot d'encodage",
|
||||||
"Embedding Model": "Modèle d'embedding",
|
"Embedding Model": "Modèle d'embedding",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Gérer les Modèles",
|
"Manage Models": "Gérer les Modèles",
|
||||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||||
"Manage Pipelines": "Gérer les pipelines",
|
"Manage Pipelines": "Gérer les pipelines",
|
||||||
"Manage Valves": "Gérer les vannes",
|
|
||||||
"March": "Mars",
|
"March": "Mars",
|
||||||
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé en même temps. Veuillez réessayer ultérieurement.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé en même temps. Veuillez réessayer ultérieurement.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "La mémoire a été supprimée avec succès",
|
"Memory deleted successfully": "La mémoire a été supprimée avec succès",
|
||||||
"Memory updated successfully": "La mémoire a été mise à jour avec succès",
|
"Memory updated successfully": "La mémoire a été mise à jour avec succès",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Score minimal",
|
"Minimum Score": "Score minimal",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Enregistrer",
|
"Save": "Enregistrer",
|
||||||
"Save & Create": "Enregistrer & Créer",
|
"Save & Create": "Enregistrer & Créer",
|
||||||
"Save & Update": "Enregistrer & Mettre à jour",
|
"Save & Update": "Enregistrer & Mettre à jour",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des journaux de discussion directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un instant pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Pas de soucis, vous pouvez facilement les réimporter depuis le backend via l'interface ci-dessous",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des journaux de discussion directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un instant pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Pas de soucis, vous pouvez facilement les réimporter depuis le backend via l'interface ci-dessous",
|
||||||
"Scan": "Scanner",
|
"Scan": "Scanner",
|
||||||
"Scan complete!": "Scan terminé !",
|
"Scan complete!": "Scan terminé !",
|
||||||
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Recherche",
|
"Search": "Recherche",
|
||||||
"Search a model": "Rechercher un modèle",
|
"Search a model": "Rechercher un modèle",
|
||||||
"Search Chats": "Rechercher des conversations",
|
"Search Chats": "Rechercher des conversations",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Pour ajouter des documents ici, téléchargez-les d'abord dans l'espace de travail « Documents ». ",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Pour ajouter des documents ici, téléchargez-les d'abord dans l'espace de travail « Documents ». ",
|
||||||
"to chat input.": "à l'entrée de discussion.",
|
"to chat input.": "à l'entrée de discussion.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
|
"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Pour sélectionner des toolkits ici, ajoutez-les d'abord à l'espace de travail « Outils ». ",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Pour sélectionner des toolkits ici, ajoutez-les d'abord à l'espace de travail « Outils ». ",
|
||||||
"Today": "Aujourd'hui",
|
"Today": "Aujourd'hui",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Compte",
|
"Account": "Compte",
|
||||||
"Account Activation Pending": "Activation du compte en attente",
|
"Account Activation Pending": "Activation du compte en attente",
|
||||||
"Accurate information": "Information exacte",
|
"Accurate information": "Information exacte",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "Utilisateurs actifs",
|
"Active Users": "Utilisateurs actifs",
|
||||||
"Add": "Ajouter",
|
"Add": "Ajouter",
|
||||||
"Add a model id": "Ajouter un identifiant de modèle",
|
"Add a model id": "Ajouter un identifiant de modèle",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Ajouter de la mémoire",
|
"Add Memory": "Ajouter de la mémoire",
|
||||||
"Add message": "Ajouter un message",
|
"Add message": "Ajouter un message",
|
||||||
"Add Model": "Ajouter un modèle",
|
"Add Model": "Ajouter un modèle",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Ajouter des balises",
|
"Add Tags": "Ajouter des balises",
|
||||||
"Add User": "Ajouter un Utilisateur",
|
"Add User": "Ajouter un Utilisateur",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
|
"Adjusting these settings will apply changes universally to all users.": "L'ajustement de ces paramètres appliquera universellement les changements à tous les utilisateurs.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Supprimer la conversation",
|
"Delete chat": "Supprimer la conversation",
|
||||||
"Delete Chat": "Supprimer la Conversation",
|
"Delete Chat": "Supprimer la Conversation",
|
||||||
"Delete chat?": "Supprimer la conversation ?",
|
"Delete chat?": "Supprimer la conversation ?",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "Supprimer la fonction ?",
|
"Delete function?": "Supprimer la fonction ?",
|
||||||
"Delete prompt?": "Supprimer la prompt ?",
|
"Delete prompt?": "Supprimer la prompt ?",
|
||||||
"delete this link": "supprimer ce lien",
|
"delete this link": "supprimer ce lien",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Modifier le document",
|
"Edit Doc": "Modifier le document",
|
||||||
"Edit Memory": "Modifier la mémoire",
|
"Edit Memory": "Modifier la mémoire",
|
||||||
"Edit User": "Modifier l'utilisateur",
|
"Edit User": "Modifier l'utilisateur",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "E-mail",
|
"Email": "E-mail",
|
||||||
"Embedding Batch Size": "Taille du lot d'encodage",
|
"Embedding Batch Size": "Taille du lot d'encodage",
|
||||||
"Embedding Model": "Modèle d'embedding",
|
"Embedding Model": "Modèle d'embedding",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Gérer les Modèles",
|
"Manage Models": "Gérer les Modèles",
|
||||||
"Manage Ollama Models": "Gérer les modèles Ollama",
|
"Manage Ollama Models": "Gérer les modèles Ollama",
|
||||||
"Manage Pipelines": "Gérer les pipelines",
|
"Manage Pipelines": "Gérer les pipelines",
|
||||||
"Manage Valves": "Gérer les vannes",
|
|
||||||
"March": "Mars",
|
"March": "Mars",
|
||||||
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
"Max Tokens (num_predict)": "Tokens maximaux (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé en même temps. Veuillez réessayer ultérieurement.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé en même temps. Veuillez réessayer ultérieurement.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "La mémoire a été supprimée avec succès",
|
"Memory deleted successfully": "La mémoire a été supprimée avec succès",
|
||||||
"Memory updated successfully": "La mémoire a été mise à jour avec succès",
|
"Memory updated successfully": "La mémoire a été mise à jour avec succès",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Les messages que vous envoyez après avoir créé votre lien ne seront pas partagés. Les utilisateurs disposant de l'URL pourront voir le chat partagé.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Score minimal",
|
"Minimum Score": "Score minimal",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Enregistrer",
|
"Save": "Enregistrer",
|
||||||
"Save & Create": "Enregistrer & Créer",
|
"Save & Create": "Enregistrer & Créer",
|
||||||
"Save & Update": "Enregistrer & Mettre à jour",
|
"Save & Update": "Enregistrer & Mettre à jour",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des journaux de discussion directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un instant pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Pas de soucis, vous pouvez facilement les réimporter depuis le backend via l'interface ci-dessous",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "La sauvegarde des journaux de discussion directement dans le stockage de votre navigateur n'est plus prise en charge. Veuillez prendre un instant pour télécharger et supprimer vos journaux de discussion en cliquant sur le bouton ci-dessous. Pas de soucis, vous pouvez facilement les réimporter depuis le backend via l'interface ci-dessous",
|
||||||
"Scan": "Scanner",
|
"Scan": "Scanner",
|
||||||
"Scan complete!": "Scan terminé !",
|
"Scan complete!": "Scan terminé !",
|
||||||
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
"Scan for documents from {{path}}": "Scanner des documents depuis {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Recherche",
|
"Search": "Recherche",
|
||||||
"Search a model": "Rechercher un modèle",
|
"Search a model": "Rechercher un modèle",
|
||||||
"Search Chats": "Rechercher des conversations",
|
"Search Chats": "Rechercher des conversations",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Pour accéder à l'interface Web, veuillez contacter l'administrateur. Les administrateurs peuvent gérer les statuts des utilisateurs depuis le panneau d'administration.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Pour ajouter des documents ici, téléchargez-les d'abord dans l'espace de travail « Documents ». ",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Pour ajouter des documents ici, téléchargez-les d'abord dans l'espace de travail « Documents ». ",
|
||||||
"to chat input.": "à l'entrée de discussion.",
|
"to chat input.": "à l'entrée de discussion.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
|
"To select filters here, add them to the \"Functions\" workspace first.": "Pour sélectionner des filtres ici, ajoutez-les d'abord à l'espace de travail « Fonctions ». ",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Pour sélectionner des toolkits ici, ajoutez-les d'abord à l'espace de travail « Outils ». ",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Pour sélectionner des toolkits ici, ajoutez-les d'abord à l'espace de travail « Outils ». ",
|
||||||
"Today": "Aujourd'hui",
|
"Today": "Aujourd'hui",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "חשבון",
|
"Account": "חשבון",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "מידע מדויק",
|
"Accurate information": "מידע מדויק",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "הוסף",
|
"Add": "הוסף",
|
||||||
"Add a model id": "הוספת מזהה דגם",
|
"Add a model id": "הוספת מזהה דגם",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "הוסף זיכרון",
|
"Add Memory": "הוסף זיכרון",
|
||||||
"Add message": "הוסף הודעה",
|
"Add message": "הוסף הודעה",
|
||||||
"Add Model": "הוסף מודל",
|
"Add Model": "הוסף מודל",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "הוסף תגים",
|
"Add Tags": "הוסף תגים",
|
||||||
"Add User": "הוסף משתמש",
|
"Add User": "הוסף משתמש",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "התאמת הגדרות אלו תחול על כל המשתמשים.",
|
"Adjusting these settings will apply changes universally to all users.": "התאמת הגדרות אלו תחול על כל המשתמשים.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "מחק צ'אט",
|
"Delete chat": "מחק צ'אט",
|
||||||
"Delete Chat": "מחק צ'אט",
|
"Delete Chat": "מחק צ'אט",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "מחק את הקישור הזה",
|
"delete this link": "מחק את הקישור הזה",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "ערוך מסמך",
|
"Edit Doc": "ערוך מסמך",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "ערוך משתמש",
|
"Edit User": "ערוך משתמש",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "דוא\"ל",
|
"Email": "דוא\"ל",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "מודל הטמעה",
|
"Embedding Model": "מודל הטמעה",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "נהל מודלים",
|
"Manage Models": "נהל מודלים",
|
||||||
"Manage Ollama Models": "נהל מודלים של Ollama",
|
"Manage Ollama Models": "נהל מודלים של Ollama",
|
||||||
"Manage Pipelines": "ניהול צינורות",
|
"Manage Pipelines": "ניהול צינורות",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "מרץ",
|
"March": "מרץ",
|
||||||
"Max Tokens (num_predict)": "מקסימום אסימונים (num_predict)",
|
"Max Tokens (num_predict)": "מקסימום אסימונים (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "הודעות שתשלח לאחר יצירת הקישור לא ישותפו. משתמשים עם כתובת האתר יוכלו לצפות בצ'אט המשותף.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "הודעות שתשלח לאחר יצירת הקישור לא ישותפו. משתמשים עם כתובת האתר יוכלו לצפות בצ'אט המשותף.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "ציון מינימלי",
|
"Minimum Score": "ציון מינימלי",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "שמור",
|
"Save": "שמור",
|
||||||
"Save & Create": "שמור וצור",
|
"Save & Create": "שמור וצור",
|
||||||
"Save & Update": "שמור ועדכן",
|
"Save & Update": "שמור ועדכן",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "שמירת יומני צ'אט ישירות באחסון הדפדפן שלך אינה נתמכת יותר. אנא הקדש רגע להוריד ולמחוק את יומני הצ'אט שלך על ידי לחיצה על הכפתור למטה. אל דאגה, באפשרותך לייבא מחדש בקלות את יומני הצ'אט שלך לשרת האחורי דרך",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "שמירת יומני צ'אט ישירות באחסון הדפדפן שלך אינה נתמכת יותר. אנא הקדש רגע להוריד ולמחוק את יומני הצ'אט שלך על ידי לחיצה על הכפתור למטה. אל דאגה, באפשרותך לייבא מחדש בקלות את יומני הצ'אט שלך לשרת האחורי דרך",
|
||||||
"Scan": "סרוק",
|
"Scan": "סרוק",
|
||||||
"Scan complete!": "הסריקה הושלמה!",
|
"Scan complete!": "הסריקה הושלמה!",
|
||||||
"Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}",
|
"Scan for documents from {{path}}": "סרוק מסמכים מ-{{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "חפש",
|
"Search": "חפש",
|
||||||
"Search a model": "חפש מודל",
|
"Search a model": "חפש מודל",
|
||||||
"Search Chats": "חיפוש צ'אטים",
|
"Search Chats": "חיפוש צ'אטים",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "לקלטת שיחה.",
|
"to chat input.": "לקלטת שיחה.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "היום",
|
"Today": "היום",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "खाता",
|
"Account": "खाता",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "सटीक जानकारी",
|
"Accurate information": "सटीक जानकारी",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "जोड़ें",
|
"Add": "जोड़ें",
|
||||||
"Add a model id": "मॉडल आईडी जोड़ना",
|
"Add a model id": "मॉडल आईडी जोड़ना",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "मेमोरी जोड़ें",
|
"Add Memory": "मेमोरी जोड़ें",
|
||||||
"Add message": "संदेश डालें",
|
"Add message": "संदेश डालें",
|
||||||
"Add Model": "मॉडल जोड़ें",
|
"Add Model": "मॉडल जोड़ें",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "टैगों को जोड़ें",
|
"Add Tags": "टैगों को जोड़ें",
|
||||||
"Add User": "उपयोगकर्ता जोड़ें",
|
"Add User": "उपयोगकर्ता जोड़ें",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "इन सेटिंग्स को समायोजित करने से परिवर्तन सभी उपयोगकर्ताओं पर सार्वभौमिक रूप से लागू होंगे।",
|
"Adjusting these settings will apply changes universally to all users.": "इन सेटिंग्स को समायोजित करने से परिवर्तन सभी उपयोगकर्ताओं पर सार्वभौमिक रूप से लागू होंगे।",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "चैट हटाएं",
|
"Delete chat": "चैट हटाएं",
|
||||||
"Delete Chat": "चैट हटाएं",
|
"Delete Chat": "चैट हटाएं",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "इस लिंक को हटाएं",
|
"delete this link": "इस लिंक को हटाएं",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "दस्तावेज़ संपादित करें",
|
"Edit Doc": "दस्तावेज़ संपादित करें",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "यूजर को संपादित करो",
|
"Edit User": "यूजर को संपादित करो",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "ईमेल",
|
"Email": "ईमेल",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "मॉडेल अनुकूलन",
|
"Embedding Model": "मॉडेल अनुकूलन",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "मॉडल प्रबंधित करें",
|
"Manage Models": "मॉडल प्रबंधित करें",
|
||||||
"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
|
"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
|
||||||
"Manage Pipelines": "पाइपलाइनों का प्रबंधन करें",
|
"Manage Pipelines": "पाइपलाइनों का प्रबंधन करें",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "मार्च",
|
"March": "मार्च",
|
||||||
"Max Tokens (num_predict)": "अधिकतम टोकन (num_predict)",
|
"Max Tokens (num_predict)": "अधिकतम टोकन (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "अपना लिंक बनाने के बाद आपके द्वारा भेजे गए संदेश साझा नहीं किए जाएंगे। यूआरएल वाले यूजर्स शेयर की गई चैट देख पाएंगे।",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "अपना लिंक बनाने के बाद आपके द्वारा भेजे गए संदेश साझा नहीं किए जाएंगे। यूआरएल वाले यूजर्स शेयर की गई चैट देख पाएंगे।",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "न्यूनतम स्कोर",
|
"Minimum Score": "न्यूनतम स्कोर",
|
||||||
"Mirostat": "मिरोस्टा",
|
"Mirostat": "मिरोस्टा",
|
||||||
"Mirostat Eta": "मिरोस्टा ईटा",
|
"Mirostat Eta": "मिरोस्टा ईटा",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "सहेजें",
|
"Save": "सहेजें",
|
||||||
"Save & Create": "सहेजें और बनाएं",
|
"Save & Create": "सहेजें और बनाएं",
|
||||||
"Save & Update": "सहेजें और अपडेट करें",
|
"Save & Update": "सहेजें और अपडेट करें",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "चैट लॉग को सीधे आपके ब्राउज़र के स्टोरेज में सहेजना अब समर्थित नहीं है। कृपया नीचे दिए गए बटन पर क्लिक करके डाउनलोड करने और अपने चैट लॉग को हटाने के लिए कुछ समय दें। चिंता न करें, आप आसानी से अपने चैट लॉग को बैकएंड पर पुनः आयात कर सकते हैं",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "चैट लॉग को सीधे आपके ब्राउज़र के स्टोरेज में सहेजना अब समर्थित नहीं है। कृपया नीचे दिए गए बटन पर क्लिक करके डाउनलोड करने और अपने चैट लॉग को हटाने के लिए कुछ समय दें। चिंता न करें, आप आसानी से अपने चैट लॉग को बैकएंड पर पुनः आयात कर सकते हैं",
|
||||||
"Scan": "स्कैन",
|
"Scan": "स्कैन",
|
||||||
"Scan complete!": "स्कैन पूरा हुआ!",
|
"Scan complete!": "स्कैन पूरा हुआ!",
|
||||||
"Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें",
|
"Scan for documents from {{path}}": "{{path}} से दस्तावेज़ों को स्कैन करें",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "खोजें",
|
"Search": "खोजें",
|
||||||
"Search a model": "एक मॉडल खोजें",
|
"Search a model": "एक मॉडल खोजें",
|
||||||
"Search Chats": "चैट खोजें",
|
"Search Chats": "चैट खोजें",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "इनपुट चैट करने के लिए.",
|
"to chat input.": "इनपुट चैट करने के लिए.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "आज",
|
"Today": "आज",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Račun",
|
"Account": "Račun",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "Točne informacije",
|
"Accurate information": "Točne informacije",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "Aktivni korisnici",
|
"Active Users": "Aktivni korisnici",
|
||||||
"Add": "Dodaj",
|
"Add": "Dodaj",
|
||||||
"Add a model id": "Dodavanje ID-a modela",
|
"Add a model id": "Dodavanje ID-a modela",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Dodaj memoriju",
|
"Add Memory": "Dodaj memoriju",
|
||||||
"Add message": "Dodaj poruku",
|
"Add message": "Dodaj poruku",
|
||||||
"Add Model": "Dodaj model",
|
"Add Model": "Dodaj model",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Dodaj oznake",
|
"Add Tags": "Dodaj oznake",
|
||||||
"Add User": "Dodaj korisnika",
|
"Add User": "Dodaj korisnika",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Podešavanje će se primijeniti univerzalno na sve korisnike.",
|
"Adjusting these settings will apply changes universally to all users.": "Podešavanje će se primijeniti univerzalno na sve korisnike.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Izbriši razgovor",
|
"Delete chat": "Izbriši razgovor",
|
||||||
"Delete Chat": "Izbriši razgovor",
|
"Delete Chat": "Izbriši razgovor",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "izbriši ovu vezu",
|
"delete this link": "izbriši ovu vezu",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Uredi dokument",
|
"Edit Doc": "Uredi dokument",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "Uredi korisnika",
|
"Edit User": "Uredi korisnika",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Email",
|
"Email": "Email",
|
||||||
"Embedding Batch Size": "Embedding - Veličina batch-a",
|
"Embedding Batch Size": "Embedding - Veličina batch-a",
|
||||||
"Embedding Model": "Embedding model",
|
"Embedding Model": "Embedding model",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Upravljanje modelima",
|
"Manage Models": "Upravljanje modelima",
|
||||||
"Manage Ollama Models": "Upravljanje Ollama modelima",
|
"Manage Ollama Models": "Upravljanje Ollama modelima",
|
||||||
"Manage Pipelines": "Upravljanje cjevovodima",
|
"Manage Pipelines": "Upravljanje cjevovodima",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "Ožujak",
|
"March": "Ožujak",
|
||||||
"Max Tokens (num_predict)": "Maksimalan broj tokena (num_predict)",
|
"Max Tokens (num_predict)": "Maksimalan broj tokena (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalno 3 modela se mogu preuzeti istovremeno. Pokušajte ponovo kasnije.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalno 3 modela se mogu preuzeti istovremeno. Pokušajte ponovo kasnije.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Poruke koje pošaljete nakon stvaranja veze neće se dijeliti. Korisnici s URL-om moći će vidjeti zajednički chat.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Poruke koje pošaljete nakon stvaranja veze neće se dijeliti. Korisnici s URL-om moći će vidjeti zajednički chat.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Minimalna ocjena",
|
"Minimum Score": "Minimalna ocjena",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Spremi",
|
"Save": "Spremi",
|
||||||
"Save & Create": "Spremi i stvori",
|
"Save & Create": "Spremi i stvori",
|
||||||
"Save & Update": "Spremi i ažuriraj",
|
"Save & Update": "Spremi i ažuriraj",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Spremanje zapisnika razgovora izravno u pohranu vašeg preglednika više nije podržano. Molimo vas da odvojite trenutak za preuzimanje i brisanje zapisnika razgovora klikom na gumb ispod. Ne brinite, možete lako ponovno uvesti zapisnike razgovora u backend putem",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Spremanje zapisnika razgovora izravno u pohranu vašeg preglednika više nije podržano. Molimo vas da odvojite trenutak za preuzimanje i brisanje zapisnika razgovora klikom na gumb ispod. Ne brinite, možete lako ponovno uvesti zapisnike razgovora u backend putem",
|
||||||
"Scan": "Skeniraj",
|
"Scan": "Skeniraj",
|
||||||
"Scan complete!": "Skeniranje dovršeno!",
|
"Scan complete!": "Skeniranje dovršeno!",
|
||||||
"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
|
"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Pretraga",
|
"Search": "Pretraga",
|
||||||
"Search a model": "Pretraži model",
|
"Search a model": "Pretraži model",
|
||||||
"Search Chats": "Pretraži razgovore",
|
"Search Chats": "Pretraži razgovore",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Za pristup WebUI-u obratite se administratoru. Administratori mogu upravljati statusima korisnika s Admin panela.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Za pristup WebUI-u obratite se administratoru. Administratori mogu upravljati statusima korisnika s Admin panela.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Da biste ovdje dodali dokumente, prvo ih prenesite u radni prostor \"Dokumenti\".",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Da biste ovdje dodali dokumente, prvo ih prenesite u radni prostor \"Dokumenti\".",
|
||||||
"to chat input.": "u unos razgovora.",
|
"to chat input.": "u unos razgovora.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "Danas",
|
"Today": "Danas",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Akun",
|
"Account": "Akun",
|
||||||
"Account Activation Pending": "Aktivasi Akun Tertunda",
|
"Account Activation Pending": "Aktivasi Akun Tertunda",
|
||||||
"Accurate information": "Informasi yang akurat",
|
"Accurate information": "Informasi yang akurat",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "Pengguna Aktif",
|
"Active Users": "Pengguna Aktif",
|
||||||
"Add": "Tambah",
|
"Add": "Tambah",
|
||||||
"Add a model id": "Tambahkan id model",
|
"Add a model id": "Tambahkan id model",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Menambahkan Memori",
|
"Add Memory": "Menambahkan Memori",
|
||||||
"Add message": "Tambahkan pesan",
|
"Add message": "Tambahkan pesan",
|
||||||
"Add Model": "Tambahkan Model",
|
"Add Model": "Tambahkan Model",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Tambahkan Tag",
|
"Add Tags": "Tambahkan Tag",
|
||||||
"Add User": "Tambah Pengguna",
|
"Add User": "Tambah Pengguna",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Menyesuaikan pengaturan ini akan menerapkan perubahan secara universal ke semua pengguna.",
|
"Adjusting these settings will apply changes universally to all users.": "Menyesuaikan pengaturan ini akan menerapkan perubahan secara universal ke semua pengguna.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Menghapus obrolan",
|
"Delete chat": "Menghapus obrolan",
|
||||||
"Delete Chat": "Menghapus Obrolan",
|
"Delete Chat": "Menghapus Obrolan",
|
||||||
"Delete chat?": "Menghapus obrolan?",
|
"Delete chat?": "Menghapus obrolan?",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "Fungsi hapus?",
|
"Delete function?": "Fungsi hapus?",
|
||||||
"Delete prompt?": "Perintah hapus?",
|
"Delete prompt?": "Perintah hapus?",
|
||||||
"delete this link": "hapus tautan ini",
|
"delete this link": "hapus tautan ini",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Edit Dokumen",
|
"Edit Doc": "Edit Dokumen",
|
||||||
"Edit Memory": "Edit Memori",
|
"Edit Memory": "Edit Memori",
|
||||||
"Edit User": "Edit Pengguna",
|
"Edit User": "Edit Pengguna",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Email",
|
"Email": "Email",
|
||||||
"Embedding Batch Size": "Menyematkan Ukuran Batch",
|
"Embedding Batch Size": "Menyematkan Ukuran Batch",
|
||||||
"Embedding Model": "Model Penyematan",
|
"Embedding Model": "Model Penyematan",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Kelola Model",
|
"Manage Models": "Kelola Model",
|
||||||
"Manage Ollama Models": "Mengelola Model Ollama",
|
"Manage Ollama Models": "Mengelola Model Ollama",
|
||||||
"Manage Pipelines": "Mengelola Saluran Pipa",
|
"Manage Pipelines": "Mengelola Saluran Pipa",
|
||||||
"Manage Valves": "Kelola Katup",
|
|
||||||
"March": "Maret",
|
"March": "Maret",
|
||||||
"Max Tokens (num_predict)": "Token Maksimal (num_prediksi)",
|
"Max Tokens (num_predict)": "Token Maksimal (num_prediksi)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimal 3 model dapat diunduh secara bersamaan. Silakan coba lagi nanti.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimal 3 model dapat diunduh secara bersamaan. Silakan coba lagi nanti.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "Memori berhasil dihapus",
|
"Memory deleted successfully": "Memori berhasil dihapus",
|
||||||
"Memory updated successfully": "Memori berhasil diperbarui",
|
"Memory updated successfully": "Memori berhasil diperbarui",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Pesan yang Anda kirim setelah membuat tautan tidak akan dibagikan. Pengguna yang memiliki URL tersebut akan dapat melihat obrolan yang dibagikan.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Pesan yang Anda kirim setelah membuat tautan tidak akan dibagikan. Pengguna yang memiliki URL tersebut akan dapat melihat obrolan yang dibagikan.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Skor Minimum",
|
"Minimum Score": "Skor Minimum",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Simpan",
|
"Save": "Simpan",
|
||||||
"Save & Create": "Simpan & Buat",
|
"Save & Create": "Simpan & Buat",
|
||||||
"Save & Update": "Simpan & Perbarui",
|
"Save & Update": "Simpan & Perbarui",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Menyimpan log obrolan secara langsung ke penyimpanan browser Anda tidak lagi didukung. Mohon luangkan waktu sejenak untuk mengunduh dan menghapus log obrolan Anda dengan mengeklik tombol di bawah ini. Jangan khawatir, Anda dapat dengan mudah mengimpor kembali log obrolan Anda ke backend melalui",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Menyimpan log obrolan secara langsung ke penyimpanan browser Anda tidak lagi didukung. Mohon luangkan waktu sejenak untuk mengunduh dan menghapus log obrolan Anda dengan mengeklik tombol di bawah ini. Jangan khawatir, Anda dapat dengan mudah mengimpor kembali log obrolan Anda ke backend melalui",
|
||||||
"Scan": "Pindai",
|
"Scan": "Pindai",
|
||||||
"Scan complete!": "Pindai selesai!",
|
"Scan complete!": "Pindai selesai!",
|
||||||
"Scan for documents from {{path}}": "Memindai dokumen dari {{path}}",
|
"Scan for documents from {{path}}": "Memindai dokumen dari {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Cari",
|
"Search": "Cari",
|
||||||
"Search a model": "Mencari model",
|
"Search a model": "Mencari model",
|
||||||
"Search Chats": "Cari Obrolan",
|
"Search Chats": "Cari Obrolan",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Untuk mengakses WebUI, hubungi administrator. Admin dapat mengelola status pengguna dari Panel Admin.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Untuk mengakses WebUI, hubungi administrator. Admin dapat mengelola status pengguna dari Panel Admin.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Untuk menambahkan dokumen di sini, unggah dokumen ke ruang kerja \"Dokumen\" terlebih dahulu.",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Untuk menambahkan dokumen di sini, unggah dokumen ke ruang kerja \"Dokumen\" terlebih dahulu.",
|
||||||
"to chat input.": "Untuk memasukkan input obrolan.",
|
"to chat input.": "Untuk memasukkan input obrolan.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "Untuk memilih filter di sini, tambahkan filter ke ruang kerja \"Fungsi\" terlebih dahulu.",
|
"To select filters here, add them to the \"Functions\" workspace first.": "Untuk memilih filter di sini, tambahkan filter ke ruang kerja \"Fungsi\" terlebih dahulu.",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "Untuk memilih perangkat di sini, tambahkan ke ruang kerja \"Alat\" terlebih dahulu.",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Untuk memilih perangkat di sini, tambahkan ke ruang kerja \"Alat\" terlebih dahulu.",
|
||||||
"Today": "Hari ini",
|
"Today": "Hari ini",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Account",
|
"Account": "Account",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "Informazioni accurate",
|
"Accurate information": "Informazioni accurate",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "Aggiungi",
|
"Add": "Aggiungi",
|
||||||
"Add a model id": "Aggiungere un ID modello",
|
"Add a model id": "Aggiungere un ID modello",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "Aggiungi memoria",
|
"Add Memory": "Aggiungi memoria",
|
||||||
"Add message": "Aggiungi messaggio",
|
"Add message": "Aggiungi messaggio",
|
||||||
"Add Model": "Aggiungi modello",
|
"Add Model": "Aggiungi modello",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Aggiungi tag",
|
"Add Tags": "Aggiungi tag",
|
||||||
"Add User": "Aggiungi utente",
|
"Add User": "Aggiungi utente",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "La modifica di queste impostazioni applicherà le modifiche universalmente a tutti gli utenti.",
|
"Adjusting these settings will apply changes universally to all users.": "La modifica di queste impostazioni applicherà le modifiche universalmente a tutti gli utenti.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Elimina chat",
|
"Delete chat": "Elimina chat",
|
||||||
"Delete Chat": "Elimina chat",
|
"Delete Chat": "Elimina chat",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "elimina questo link",
|
"delete this link": "elimina questo link",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Modifica documento",
|
"Edit Doc": "Modifica documento",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "Modifica utente",
|
"Edit User": "Modifica utente",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "Email",
|
"Email": "Email",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "Modello di embedding",
|
"Embedding Model": "Modello di embedding",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Gestisci modelli",
|
"Manage Models": "Gestisci modelli",
|
||||||
"Manage Ollama Models": "Gestisci modelli Ollama",
|
"Manage Ollama Models": "Gestisci modelli Ollama",
|
||||||
"Manage Pipelines": "Gestire le pipeline",
|
"Manage Pipelines": "Gestire le pipeline",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "Marzo",
|
"March": "Marzo",
|
||||||
"Max Tokens (num_predict)": "Numero massimo di gettoni (num_predict)",
|
"Max Tokens (num_predict)": "Numero massimo di gettoni (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "I messaggi inviati dopo la creazione del link non verranno condivisi. Gli utenti con l'URL saranno in grado di visualizzare la chat condivisa.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "I messaggi inviati dopo la creazione del link non verranno condivisi. Gli utenti con l'URL saranno in grado di visualizzare la chat condivisa.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Punteggio minimo",
|
"Minimum Score": "Punteggio minimo",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Salva",
|
"Save": "Salva",
|
||||||
"Save & Create": "Salva e crea",
|
"Save & Create": "Salva e crea",
|
||||||
"Save & Update": "Salva e aggiorna",
|
"Save & Update": "Salva e aggiorna",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Il salvataggio dei registri della chat direttamente nell'archivio del browser non è più supportato. Si prega di dedicare un momento per scaricare ed eliminare i registri della chat facendo clic sul pulsante in basso. Non preoccuparti, puoi facilmente reimportare i registri della chat nel backend tramite",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Il salvataggio dei registri della chat direttamente nell'archivio del browser non è più supportato. Si prega di dedicare un momento per scaricare ed eliminare i registri della chat facendo clic sul pulsante in basso. Non preoccuparti, puoi facilmente reimportare i registri della chat nel backend tramite",
|
||||||
"Scan": "Scansione",
|
"Scan": "Scansione",
|
||||||
"Scan complete!": "Scansione completata!",
|
"Scan complete!": "Scansione completata!",
|
||||||
"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
|
"Scan for documents from {{path}}": "Cerca documenti da {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Cerca",
|
"Search": "Cerca",
|
||||||
"Search a model": "Cerca un modello",
|
"Search a model": "Cerca un modello",
|
||||||
"Search Chats": "Cerca nelle chat",
|
"Search Chats": "Cerca nelle chat",
|
||||||
@@ -618,6 +624,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "all'input della chat.",
|
"to chat input.": "all'input della chat.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "Oggi",
|
"Today": "Oggi",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "アカウント",
|
"Account": "アカウント",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "情報の正確性",
|
"Accurate information": "情報の正確性",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "追加",
|
"Add": "追加",
|
||||||
"Add a model id": "モデル ID を追加する",
|
"Add a model id": "モデル ID を追加する",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "メモリを追加",
|
"Add Memory": "メモリを追加",
|
||||||
"Add message": "メッセージを追加",
|
"Add message": "メッセージを追加",
|
||||||
"Add Model": "モデルを追加",
|
"Add Model": "モデルを追加",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "タグを追加",
|
"Add Tags": "タグを追加",
|
||||||
"Add User": "ユーザーを追加",
|
"Add User": "ユーザーを追加",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "これらの設定を調整すると、すべてのユーザーに普遍的に変更が適用されます。",
|
"Adjusting these settings will apply changes universally to all users.": "これらの設定を調整すると、すべてのユーザーに普遍的に変更が適用されます。",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "チャットを削除",
|
"Delete chat": "チャットを削除",
|
||||||
"Delete Chat": "チャットを削除",
|
"Delete Chat": "チャットを削除",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "このリンクを削除します",
|
"delete this link": "このリンクを削除します",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "ドキュメントを編集",
|
"Edit Doc": "ドキュメントを編集",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "ユーザーを編集",
|
"Edit User": "ユーザーを編集",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "メールアドレス",
|
"Email": "メールアドレス",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "埋め込みモデル",
|
"Embedding Model": "埋め込みモデル",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "モデルを管理",
|
"Manage Models": "モデルを管理",
|
||||||
"Manage Ollama Models": "Ollama モデルを管理",
|
"Manage Ollama Models": "Ollama モデルを管理",
|
||||||
"Manage Pipelines": "パイプラインの管理",
|
"Manage Pipelines": "パイプラインの管理",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "3月",
|
"March": "3月",
|
||||||
"Max Tokens (num_predict)": "最大トークン数 (num_predict)",
|
"Max Tokens (num_predict)": "最大トークン数 (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "リンクを作成した後、送信したメッセージは共有されません。URL を持つユーザーは共有チャットを閲覧できます。",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "リンクを作成した後、送信したメッセージは共有されません。URL を持つユーザーは共有チャットを閲覧できます。",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "最低スコア",
|
"Minimum Score": "最低スコア",
|
||||||
"Mirostat": "ミロスタット",
|
"Mirostat": "ミロスタット",
|
||||||
"Mirostat Eta": "ミロスタット Eta",
|
"Mirostat Eta": "ミロスタット Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "保存",
|
"Save": "保存",
|
||||||
"Save & Create": "保存して作成",
|
"Save & Create": "保存して作成",
|
||||||
"Save & Update": "保存して更新",
|
"Save & Update": "保存して更新",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "チャットログをブラウザのストレージに直接保存する機能はサポートされなくなりました。下のボタンをクリックして、チャットログをダウンロードして削除してください。ご心配なく。チャットログは、次の方法でバックエンドに簡単に再インポートできます。",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "チャットログをブラウザのストレージに直接保存する機能はサポートされなくなりました。下のボタンをクリックして、チャットログをダウンロードして削除してください。ご心配なく。チャットログは、次の方法でバックエンドに簡単に再インポートできます。",
|
||||||
"Scan": "スキャン",
|
"Scan": "スキャン",
|
||||||
"Scan complete!": "スキャン完了!",
|
"Scan complete!": "スキャン完了!",
|
||||||
"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
|
"Scan for documents from {{path}}": "{{path}} からドキュメントをスキャン",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "検索",
|
"Search": "検索",
|
||||||
"Search a model": "モデルを検索",
|
"Search a model": "モデルを検索",
|
||||||
"Search Chats": "チャットの検索",
|
"Search Chats": "チャットの検索",
|
||||||
@@ -616,6 +622,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "チャット入力へ。",
|
"to chat input.": "チャット入力へ。",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "今日",
|
"Today": "今日",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "ანგარიში",
|
"Account": "ანგარიში",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "დიდი ინფორმაცია",
|
"Accurate information": "დიდი ინფორმაცია",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "დამატება",
|
"Add": "დამატება",
|
||||||
"Add a model id": "დაამატეთ მოდელის ID",
|
"Add a model id": "დაამატეთ მოდელის ID",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "მემორიის დამატება",
|
"Add Memory": "მემორიის დამატება",
|
||||||
"Add message": "შეტყობინების დამატება",
|
"Add message": "შეტყობინების დამატება",
|
||||||
"Add Model": "მოდელის დამატება",
|
"Add Model": "მოდელის დამატება",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "ტეგების დამატება",
|
"Add Tags": "ტეგების დამატება",
|
||||||
"Add User": "მომხმარებლის დამატება",
|
"Add User": "მომხმარებლის დამატება",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "ამ პარამეტრების რეგულირება ცვლილებებს უნივერსალურად გამოიყენებს ყველა მომხმარებლისთვის",
|
"Adjusting these settings will apply changes universally to all users.": "ამ პარამეტრების რეგულირება ცვლილებებს უნივერსალურად გამოიყენებს ყველა მომხმარებლისთვის",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "შეტყობინების წაშლა",
|
"Delete chat": "შეტყობინების წაშლა",
|
||||||
"Delete Chat": "შეტყობინების წაშლა",
|
"Delete Chat": "შეტყობინების წაშლა",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "ბმულის წაშლა",
|
"delete this link": "ბმულის წაშლა",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "დოკუმენტის ედიტირება",
|
"Edit Doc": "დოკუმენტის ედიტირება",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "მომხმარებლის ედიტირება",
|
"Edit User": "მომხმარებლის ედიტირება",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "ელ-ფოსტა",
|
"Email": "ელ-ფოსტა",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "ჩასმის ძირითადი პროგრამა",
|
"Embedding Model": "ჩასმის ძირითადი პროგრამა",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "მოდელების მართვა",
|
"Manage Models": "მოდელების მართვა",
|
||||||
"Manage Ollama Models": "Ollama მოდელების მართვა",
|
"Manage Ollama Models": "Ollama მოდელების მართვა",
|
||||||
"Manage Pipelines": "მილსადენების მართვა",
|
"Manage Pipelines": "მილსადენების მართვა",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "მარტივი",
|
"March": "მარტივი",
|
||||||
"Max Tokens (num_predict)": "მაქს ტოკენსი (num_predict)",
|
"Max Tokens (num_predict)": "მაქს ტოკენსი (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "შეტყობინებები, რომელსაც თქვენ აგზავნით თქვენი ბმულის შექმნის შემდეგ, არ იქნება გაზიარებული. URL– ის მქონე მომხმარებლებს შეეძლებათ ნახონ საერთო ჩატი.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "შეტყობინებები, რომელსაც თქვენ აგზავნით თქვენი ბმულის შექმნის შემდეგ, არ იქნება გაზიარებული. URL– ის მქონე მომხმარებლებს შეეძლებათ ნახონ საერთო ჩატი.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "მინიმალური ქულა",
|
"Minimum Score": "მინიმალური ქულა",
|
||||||
"Mirostat": "მიროსტატი",
|
"Mirostat": "მიროსტატი",
|
||||||
"Mirostat Eta": "მიროსტატი ეტა",
|
"Mirostat Eta": "მიროსტატი ეტა",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "შენახვა",
|
"Save": "შენახვა",
|
||||||
"Save & Create": "დამახსოვრება და შექმნა",
|
"Save & Create": "დამახსოვრება და შექმნა",
|
||||||
"Save & Update": "დამახსოვრება და განახლება",
|
"Save & Update": "დამახსოვრება და განახლება",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ჩეთის ისტორიის შენახვა პირდაპირ თქვენი ბრაუზერის საცავში აღარ არის მხარდაჭერილი. გთხოვთ, დაუთმოთ და წაშალოთ თქვენი ჩატის ჟურნალები ქვემოთ მოცემულ ღილაკზე დაწკაპუნებით. არ ინერვიულოთ, თქვენ შეგიძლიათ მარტივად ხელახლა შემოიტანოთ თქვენი ჩეთის ისტორია ბექენდში",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ჩეთის ისტორიის შენახვა პირდაპირ თქვენი ბრაუზერის საცავში აღარ არის მხარდაჭერილი. გთხოვთ, დაუთმოთ და წაშალოთ თქვენი ჩატის ჟურნალები ქვემოთ მოცემულ ღილაკზე დაწკაპუნებით. არ ინერვიულოთ, თქვენ შეგიძლიათ მარტივად ხელახლა შემოიტანოთ თქვენი ჩეთის ისტორია ბექენდში",
|
||||||
"Scan": "სკანირება",
|
"Scan": "სკანირება",
|
||||||
"Scan complete!": "სკანირება დასრულდა!",
|
"Scan complete!": "სკანირება დასრულდა!",
|
||||||
"Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან",
|
"Scan for documents from {{path}}": "დოკუმენტების სკანირება {{ path}}-დან",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "ძიება",
|
"Search": "ძიება",
|
||||||
"Search a model": "მოდელის ძიება",
|
"Search a model": "მოდელის ძიება",
|
||||||
"Search Chats": "ჩატების ძებნა",
|
"Search Chats": "ჩატების ძებნა",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "ჩატში",
|
"to chat input.": "ჩატში",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "დღეს",
|
"Today": "დღეს",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "계정",
|
"Account": "계정",
|
||||||
"Account Activation Pending": "계정 활성화 보류",
|
"Account Activation Pending": "계정 활성화 보류",
|
||||||
"Accurate information": "정확한 정보",
|
"Accurate information": "정확한 정보",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "활성 사용자",
|
"Active Users": "활성 사용자",
|
||||||
"Add": "추가",
|
"Add": "추가",
|
||||||
"Add a model id": "모델 ID 추가",
|
"Add a model id": "모델 ID 추가",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "메모리 추가",
|
"Add Memory": "메모리 추가",
|
||||||
"Add message": "메시지 추가",
|
"Add message": "메시지 추가",
|
||||||
"Add Model": "모델 추가",
|
"Add Model": "모델 추가",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "태그 추가",
|
"Add Tags": "태그 추가",
|
||||||
"Add User": "사용자 추가",
|
"Add User": "사용자 추가",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "이 설정을 조정하면 모든 사용자에게 적용됩니다.",
|
"Adjusting these settings will apply changes universally to all users.": "이 설정을 조정하면 모든 사용자에게 적용됩니다.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "채팅 삭제",
|
"Delete chat": "채팅 삭제",
|
||||||
"Delete Chat": "채팅 삭제",
|
"Delete Chat": "채팅 삭제",
|
||||||
"Delete chat?": "채팅을 삭제하겠습니까?",
|
"Delete chat?": "채팅을 삭제하겠습니까?",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "이 링크를 삭제합니다.",
|
"delete this link": "이 링크를 삭제합니다.",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "문서 편집",
|
"Edit Doc": "문서 편집",
|
||||||
"Edit Memory": "메모리 편집",
|
"Edit Memory": "메모리 편집",
|
||||||
"Edit User": "사용자 편집",
|
"Edit User": "사용자 편집",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "이메일",
|
"Email": "이메일",
|
||||||
"Embedding Batch Size": "임베딩 배치 크기",
|
"Embedding Batch Size": "임베딩 배치 크기",
|
||||||
"Embedding Model": "임베딩 모델",
|
"Embedding Model": "임베딩 모델",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "모델 관리",
|
"Manage Models": "모델 관리",
|
||||||
"Manage Ollama Models": "Ollama 모델 관리",
|
"Manage Ollama Models": "Ollama 모델 관리",
|
||||||
"Manage Pipelines": "파이프라인 관리",
|
"Manage Pipelines": "파이프라인 관리",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "3월",
|
"March": "3월",
|
||||||
"Max Tokens (num_predict)": "최대 토큰(num_predict)",
|
"Max Tokens (num_predict)": "최대 토큰(num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "링크 생성 후에 보낸 메시지는 공유되지 않습니다. URL이 있는 사용자는 공유된 채팅을 볼 수 있습니다.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "링크 생성 후에 보낸 메시지는 공유되지 않습니다. URL이 있는 사용자는 공유된 채팅을 볼 수 있습니다.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "최소 점수",
|
"Minimum Score": "최소 점수",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "저장",
|
"Save": "저장",
|
||||||
"Save & Create": "저장 및 생성",
|
"Save & Create": "저장 및 생성",
|
||||||
"Save & Update": "저장 및 업데이트",
|
"Save & Update": "저장 및 업데이트",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "브라우저의 저장소에 채팅 로그를 직접 저장하는 것은 더 이상 지원되지 않습니다. 아래 버튼을 클릭하여 채팅 로그를 다운로드하고 삭제하세요. 걱정 마세요. 백엔드를 통해 채팅 로그를 쉽게 다시 가져올 수 있습니다.",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "브라우저의 저장소에 채팅 로그를 직접 저장하는 것은 더 이상 지원되지 않습니다. 아래 버튼을 클릭하여 채팅 로그를 다운로드하고 삭제하세요. 걱정 마세요. 백엔드를 통해 채팅 로그를 쉽게 다시 가져올 수 있습니다.",
|
||||||
"Scan": "스캔",
|
"Scan": "스캔",
|
||||||
"Scan complete!": "스캔 완료!",
|
"Scan complete!": "스캔 완료!",
|
||||||
"Scan for documents from {{path}}": "{{path}} 에서 문서 스캔",
|
"Scan for documents from {{path}}": "{{path}} 에서 문서 스캔",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "검색",
|
"Search": "검색",
|
||||||
"Search a model": "모델 검색",
|
"Search a model": "모델 검색",
|
||||||
"Search Chats": "채팅 검색",
|
"Search Chats": "채팅 검색",
|
||||||
@@ -617,6 +623,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "WebUI에 접속하려면 관리자에게 문의하십시오. 관리자는 관리자 패널에서 사용자 상태를 관리할 수 있습니다.",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "WebUI에 접속하려면 관리자에게 문의하십시오. 관리자는 관리자 패널에서 사용자 상태를 관리할 수 있습니다.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "여기에 문서를 추가하려면, \"문서\" 워크스페이스에 먼저 업로드하세요.",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "여기에 문서를 추가하려면, \"문서\" 워크스페이스에 먼저 업로드하세요.",
|
||||||
"to chat input.": "채팅 입력으로.",
|
"to chat input.": "채팅 입력으로.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "여기서 도구를 선택하려면, \"도구\" 워크스페이스에 먼저 추가하세요.",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "여기서 도구를 선택하려면, \"도구\" 워크스페이스에 먼저 추가하세요.",
|
||||||
"Today": "오늘",
|
"Today": "오늘",
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
"code": "lt-LT",
|
"code": "lt-LT",
|
||||||
"title": "Lithuanian (Lietuvių)"
|
"title": "Lithuanian (Lietuvių)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"code": "ms-MY",
|
||||||
|
"title": "Malay (Bahasa Malaysia)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"code": "nb-NO",
|
"code": "nb-NO",
|
||||||
"title": "Norwegian Bokmål (Norway)"
|
"title": "Norwegian Bokmål (Norway)"
|
||||||
@@ -111,6 +115,10 @@
|
|||||||
"code": "pt-PT",
|
"code": "pt-PT",
|
||||||
"title": "Portuguese (Portugal)"
|
"title": "Portuguese (Portugal)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"code": "ro-RO",
|
||||||
|
"title": "Romanian (Romania)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"code": "ru-RU",
|
"code": "ru-RU",
|
||||||
"title": "Russian (Russia)"
|
"title": "Russian (Russia)"
|
||||||
@@ -123,6 +131,10 @@
|
|||||||
"code": "sr-RS",
|
"code": "sr-RS",
|
||||||
"title": "Serbian (Српски)"
|
"title": "Serbian (Српски)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"code": "th-TH",
|
||||||
|
"title": "Thailand (ไทย)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"code": "tr-TR",
|
"code": "tr-TR",
|
||||||
"title": "Turkish (Türkçe)"
|
"title": "Turkish (Türkçe)"
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
"Account": "Paskyra",
|
"Account": "Paskyra",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "",
|
||||||
"Accurate information": "Tiksli informacija",
|
"Accurate information": "Tiksli informacija",
|
||||||
|
"Actions": "",
|
||||||
"Active Users": "",
|
"Active Users": "",
|
||||||
"Add": "",
|
"Add": "",
|
||||||
"Add a model id": "",
|
"Add a model id": "",
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
"Add Memory": "",
|
"Add Memory": "",
|
||||||
"Add message": "Pridėti žinutę",
|
"Add message": "Pridėti žinutę",
|
||||||
"Add Model": "Pridėti modelį",
|
"Add Model": "Pridėti modelį",
|
||||||
|
"Add Tag": "",
|
||||||
"Add Tags": "Pridėti žymas",
|
"Add Tags": "Pridėti žymas",
|
||||||
"Add User": "Pridėti naudotoją",
|
"Add User": "Pridėti naudotoją",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Šių nustatymų pakeitimas bus pritakytas visiems naudotojams.",
|
"Adjusting these settings will apply changes universally to all users.": "Šių nustatymų pakeitimas bus pritakytas visiems naudotojams.",
|
||||||
@@ -168,6 +170,7 @@
|
|||||||
"Delete chat": "Išrinti pokalbį",
|
"Delete chat": "Išrinti pokalbį",
|
||||||
"Delete Chat": "Ištrinti pokalbį",
|
"Delete Chat": "Ištrinti pokalbį",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "",
|
||||||
|
"Delete Doc": "",
|
||||||
"Delete function?": "",
|
"Delete function?": "",
|
||||||
"Delete prompt?": "",
|
"Delete prompt?": "",
|
||||||
"delete this link": "Ištrinti nuorodą",
|
"delete this link": "Ištrinti nuorodą",
|
||||||
@@ -211,6 +214,7 @@
|
|||||||
"Edit Doc": "Redaguoti dokumentą",
|
"Edit Doc": "Redaguoti dokumentą",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "",
|
||||||
"Edit User": "Redaguoti naudotoją",
|
"Edit User": "Redaguoti naudotoją",
|
||||||
|
"ElevenLabs": "",
|
||||||
"Email": "El. paštas",
|
"Email": "El. paštas",
|
||||||
"Embedding Batch Size": "",
|
"Embedding Batch Size": "",
|
||||||
"Embedding Model": "Embedding modelis",
|
"Embedding Model": "Embedding modelis",
|
||||||
@@ -360,7 +364,6 @@
|
|||||||
"Manage Models": "Tvarkyti modelius",
|
"Manage Models": "Tvarkyti modelius",
|
||||||
"Manage Ollama Models": "Tvarkyti Ollama modelius",
|
"Manage Ollama Models": "Tvarkyti Ollama modelius",
|
||||||
"Manage Pipelines": "",
|
"Manage Pipelines": "",
|
||||||
"Manage Valves": "",
|
|
||||||
"March": "Kovas",
|
"March": "Kovas",
|
||||||
"Max Tokens (num_predict)": "",
|
"Max Tokens (num_predict)": "",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Daugiausiai trys modeliai gali būti parsisiunčiami vienu metu.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Daugiausiai trys modeliai gali būti parsisiunčiami vienu metu.",
|
||||||
@@ -372,6 +375,7 @@
|
|||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Minimalus rezultatas",
|
"Minimum Score": "Minimalus rezultatas",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
@@ -500,10 +504,12 @@
|
|||||||
"Save": "Išsaugoti",
|
"Save": "Išsaugoti",
|
||||||
"Save & Create": "Išsaugoti ir sukurti",
|
"Save & Create": "Išsaugoti ir sukurti",
|
||||||
"Save & Update": "Išsaugoti ir atnaujinti",
|
"Save & Update": "Išsaugoti ir atnaujinti",
|
||||||
|
"Save Tag": "",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Pokalbių saugojimas naršyklėje nebegalimas.",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Pokalbių saugojimas naršyklėje nebegalimas.",
|
||||||
"Scan": "Skenuoti",
|
"Scan": "Skenuoti",
|
||||||
"Scan complete!": "Skenavimas baigtas!",
|
"Scan complete!": "Skenavimas baigtas!",
|
||||||
"Scan for documents from {{path}}": "Skenuoti dokumentus iš {{path}}",
|
"Scan for documents from {{path}}": "Skenuoti dokumentus iš {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Ieškoti",
|
"Search": "Ieškoti",
|
||||||
"Search a model": "Ieškoti modelio",
|
"Search a model": "Ieškoti modelio",
|
||||||
"Search Chats": "",
|
"Search Chats": "",
|
||||||
@@ -619,6 +625,7 @@
|
|||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||||
"to chat input.": "į pokalbio įvestį",
|
"to chat input.": "į pokalbio įvestį",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||||
"Today": "Šiandien",
|
"Today": "Šiandien",
|
||||||
|
|||||||
@@ -0,0 +1,715 @@
|
|||||||
|
{
|
||||||
|
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' or '-1' untuk tiada tempoh luput.",
|
||||||
|
"(Beta)": "(Beta)",
|
||||||
|
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh `sh webui.sh --api --api-auth username_password`)",
|
||||||
|
"(e.g. `sh webui.sh --api`)": "(contoh `sh webui.sh --api`)",
|
||||||
|
"(latest)": "(terkini)",
|
||||||
|
"{{ models }}": "{{ models }}",
|
||||||
|
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Anda tidak boleh memadamkan model asas",
|
||||||
|
"{{modelName}} is thinking...": "{{modelName}} sedang berfikir...",
|
||||||
|
"{{user}}'s Chats": "Perbualan {{user}}",
|
||||||
|
"{{webUIName}} Backend Required": "{{webUIName}} Backend diperlukan",
|
||||||
|
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Model tugas digunakan semasa melaksanakan tugas seperti menjana tajuk untuk perbualan dan pertanyaan carian web.",
|
||||||
|
"a user": "seorang pengguna",
|
||||||
|
"About": "Mengenai",
|
||||||
|
"Account": "Akaun",
|
||||||
|
"Account Activation Pending": "Pengaktifan Akaun belum selesai",
|
||||||
|
"Accurate information": "Informasi tepat",
|
||||||
|
"Actions": "Tindakan",
|
||||||
|
"Active Users": "Pengguna Aktif",
|
||||||
|
"Add": "Tambah",
|
||||||
|
"Add a model id": "Tambah id model",
|
||||||
|
"Add a short description about what this model does": "Tambah penerangan ringkas tentang apa yang model ini boleh lakukan",
|
||||||
|
"Add a short title for this prompt": "Tambah tajuk pendek untuk arahan ini",
|
||||||
|
"Add a tag": "Tambah tag",
|
||||||
|
"Add custom prompt": "Tambah arahan khusus",
|
||||||
|
"Add Docs": "Tambah Dokumen",
|
||||||
|
"Add Files": "Tambah Fail",
|
||||||
|
"Add Memory": "Tambah Memori",
|
||||||
|
"Add message": "Tambah Mesej",
|
||||||
|
"Add Model": "Tambah Model",
|
||||||
|
"Add Tag": "Tambah Tag",
|
||||||
|
"Add Tags": "Tambah Tag",
|
||||||
|
"Add User": "Tambah Pengguna",
|
||||||
|
"Adjusting these settings will apply changes universally to all users.": "Melaraskan tetapan ini akan menggunakan perubahan secara universal kepada semua pengguna.",
|
||||||
|
"admin": "pentadbir",
|
||||||
|
"Admin": "Pentadbir",
|
||||||
|
"Admin Panel": "Panel Pentadbir",
|
||||||
|
"Admin Settings": "Tetapan Pentadbir",
|
||||||
|
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Pentadbir mempunyai akses kepada semua alat pada setiap masa; pengguna memerlukan alat yang ditetapkan mengikut model dalam ruang kerja.",
|
||||||
|
"Advanced Parameters": "Parameter Lanjutan",
|
||||||
|
"Advanced Params": "Parameter Lanjutan",
|
||||||
|
"all": "semua",
|
||||||
|
"All Documents": "Semua Dokumen",
|
||||||
|
"All Users": "Semua Pengguna",
|
||||||
|
"Allow": "Benarkan",
|
||||||
|
"Allow Chat Deletion": "Benarkan Penghapusan Perbualan",
|
||||||
|
"Allow non-local voices": "Benarkan suara bukan tempatan ",
|
||||||
|
"Allow User Location": "Benarkan Lokasi Pengguna",
|
||||||
|
"Allow Voice Interruption in Call": "Benarkan gangguan suara dalam panggilan",
|
||||||
|
"alphanumeric characters and hyphens": "aksara alfanumerik dan tanda sempang",
|
||||||
|
"Already have an account?": "Telah mempunyai akaun?",
|
||||||
|
"an assistant": "seorang pembantu",
|
||||||
|
"and": "dan",
|
||||||
|
"and create a new shared link.": "dan cipta pautan kongsi baharu",
|
||||||
|
"API Base URL": "URL Asas API",
|
||||||
|
"API Key": "Kunci API",
|
||||||
|
"API Key created.": "Kunci API dicipta",
|
||||||
|
"API keys": "Kekunci API",
|
||||||
|
"April": "April",
|
||||||
|
"Archive": "Arkib",
|
||||||
|
"Archive All Chats": "Arkibkan Semua Perbualan",
|
||||||
|
"Archived Chats": "Perbualan yang diarkibkan",
|
||||||
|
"are allowed - Activate this command by typing": "adalah dibenarkan - Aktifkan arahan in dengan menaip",
|
||||||
|
"Are you sure?": "Adakah anda pasti",
|
||||||
|
"Attach file": "Kepilkan Fail",
|
||||||
|
"Attention to detail": "Perincian",
|
||||||
|
"Audio": "Audio",
|
||||||
|
"Audio settings updated successfully": "Tetapan audio berjaya dikemas kini",
|
||||||
|
"August": "Ogos",
|
||||||
|
"Auto-playback response": "Main semula respons secara automatik",
|
||||||
|
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Auth String",
|
||||||
|
"AUTOMATIC1111 Base URL": "URL Asas AUTOMATIC1111",
|
||||||
|
"AUTOMATIC1111 Base URL is required.": "URL Asas AUTOMATIC1111 diperlukan.",
|
||||||
|
"available!": "tersedia!",
|
||||||
|
"Back": "Kembali",
|
||||||
|
"Bad Response": "Maklumbalas Salah",
|
||||||
|
"Banners": "Sepanduk",
|
||||||
|
"Base Model (From)": "Model Asas (Dari)",
|
||||||
|
"Batch Size (num_batch)": "Saiz Kumpulan (num_batch)",
|
||||||
|
"before": "sebelum,",
|
||||||
|
"Being lazy": "Menjadi Malas",
|
||||||
|
"Brave Search API Key": "Kunci API Carian Brave",
|
||||||
|
"Bypass SSL verification for Websites": "Pintas pengesahan SSL untuk Laman Web",
|
||||||
|
"Call": "Hubungi",
|
||||||
|
"Call feature is not supported when using Web STT engine": "Ciri panggilan tidak disokong apabila menggunakan enjin Web STT",
|
||||||
|
"Camera": "Kamera",
|
||||||
|
"Cancel": "Batal",
|
||||||
|
"Capabilities": "Keupayaan",
|
||||||
|
"Change Password": "Tukar Kata Laluan",
|
||||||
|
"Chat": "Perbualan",
|
||||||
|
"Chat Background Image": "Imej Latar Belakang Perbualan",
|
||||||
|
"Chat Bubble UI": "Antaramuka Buih Perbualan",
|
||||||
|
"Chat Controls": "Kawalan Perbualan",
|
||||||
|
"Chat direction": "Arah Perbualan",
|
||||||
|
"Chat History": "Sejarah Perbualan",
|
||||||
|
"Chat History is off for this browser.": "Sejarah perbualan dimatikan untuk pelayan web ini",
|
||||||
|
"Chats": "Perbualan",
|
||||||
|
"Check Again": "Semak Kembali",
|
||||||
|
"Check for updates": "Semak kemas kini",
|
||||||
|
"Checking for updates...": "Kemas kini sedang disemak",
|
||||||
|
"Choose a model before saving...": "Pilih model sebelum menyimpan",
|
||||||
|
"Chunk Overlap": "Tindihan 'Çhunk'",
|
||||||
|
"Chunk Params": "Parameter 'Çhunk'",
|
||||||
|
"Chunk Size": "Saiz 'Chunk'",
|
||||||
|
"Citation": "Petikan",
|
||||||
|
"Clear memory": "Kosongkan memori",
|
||||||
|
"Click here for help.": "Klik disini untuk mendapatkan bantuan",
|
||||||
|
"Click here to": "Klik disini untuk",
|
||||||
|
"Click here to download user import template file.": "Klik disini untuk memuat turun fail templat import pengguna",
|
||||||
|
"Click here to select": "Klik disini untuk memilih",
|
||||||
|
"Click here to select a csv file.": "Klik disini untuk memilih fail csv",
|
||||||
|
"Click here to select a py file.": "Klik disini untuk memilih fail py",
|
||||||
|
"Click here to select documents.": "Klik disini untuk memilih dokumen",
|
||||||
|
"click here.": "klik disini.",
|
||||||
|
"Click on the user role button to change a user's role.": "Klik pada butang peranan pengguna untuk menukar peranan pengguna",
|
||||||
|
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Kebenaran untuk menulis di papan klip ditolak. Sila semak tetapan pelayan web anda untuk memberikan akses yang diperlukan",
|
||||||
|
"Clone": "Klon",
|
||||||
|
"Close": "Tutup",
|
||||||
|
"Code formatted successfully": "Kod berjaya diformatkan",
|
||||||
|
"Collection": "Koleksi",
|
||||||
|
"ComfyUI": "ComfyUI",
|
||||||
|
"ComfyUI Base URL": "URL asas ComfyUI",
|
||||||
|
"ComfyUI Base URL is required.": "URL asas ComfyUI diperlukan",
|
||||||
|
"Command": "Arahan",
|
||||||
|
"Concurrent Requests": "Permintaan Serentak",
|
||||||
|
"Confirm": "Sahkan",
|
||||||
|
"Confirm Password": "Sahkan kata laluan",
|
||||||
|
"Confirm your action": "Sahkan tindakan anda",
|
||||||
|
"Connections": "Sambungan",
|
||||||
|
"Contact Admin for WebUI Access": "Hubungi admin untuk akses WebUI",
|
||||||
|
"Content": "Kandungan",
|
||||||
|
"Content Extraction": "Pengekstrakan Kandungan",
|
||||||
|
"Context Length": "Panjang Konteks",
|
||||||
|
"Continue Response": "Teruskan Respons",
|
||||||
|
"Continue with {{provider}}": "Teruskan dengan {{provider}}",
|
||||||
|
"Controls": "Kawalan",
|
||||||
|
"Copied shared chat URL to clipboard!": "Menyalin URL sembang kongsi ke papan klip",
|
||||||
|
"Copy": "Salin",
|
||||||
|
"Copy last code block": "Salin Blok Kod Terakhir",
|
||||||
|
"Copy last response": "Salin Respons Terakhir",
|
||||||
|
"Copy Link": "Salin Pautan",
|
||||||
|
"Copying to clipboard was successful!": "Menyalin ke papan klip berjaya!",
|
||||||
|
"Create a model": "Cipta model",
|
||||||
|
"Create Account": "Cipta Akaun",
|
||||||
|
"Create new key": "Cipta kekunci baharu",
|
||||||
|
"Create new secret key": "Cipta kekunci rahsia baharu",
|
||||||
|
"Created at": "Dicipta di",
|
||||||
|
"Created At": "Dicipta Di",
|
||||||
|
"Created by": "Dicipta oleh",
|
||||||
|
"CSV Import": "Import CSV",
|
||||||
|
"Current Model": "Model Semasa",
|
||||||
|
"Current Password": "Kata laluan semasa",
|
||||||
|
"Custom": "Tersuai",
|
||||||
|
"Customize models for a specific purpose": "Sesuaikan model untuk tujuan tertentu",
|
||||||
|
"Dark": "Gelap",
|
||||||
|
"Dashboard": "Papan Pemuka",
|
||||||
|
"Database": "Pangkalan Data",
|
||||||
|
"December": "Disember",
|
||||||
|
"Default": "Lalai",
|
||||||
|
"Default (Automatic1111)": "Lalai (Automatic1111)",
|
||||||
|
"Default (SentenceTransformers)": "Lalai (SentenceTransformers)",
|
||||||
|
"Default Model": "Model Lalai",
|
||||||
|
"Default model updated": "Model lalai dikemas kini",
|
||||||
|
"Default Prompt Suggestions": "Cadangan Gesaan Lalai",
|
||||||
|
"Default User Role": "Peranan Pengguna Lalai",
|
||||||
|
"delete": "padam",
|
||||||
|
"Delete": "Padam",
|
||||||
|
"Delete a model": "Padam Model",
|
||||||
|
"Delete All Chats": "Padam Semua Perbualan",
|
||||||
|
"Delete chat": "Padam perbualan",
|
||||||
|
"Delete Chat": "Padam Perbualan",
|
||||||
|
"Delete chat?": "Padam perbualan?",
|
||||||
|
"Delete Doc": "Padam Dokumen",
|
||||||
|
"Delete function?": "Padam fungsi?",
|
||||||
|
"Delete prompt?": "Padam Gesaan?",
|
||||||
|
"delete this link": "Padam pautan ini?",
|
||||||
|
"Delete tool?": "Padam alat?",
|
||||||
|
"Delete User": "Padam Pengguna",
|
||||||
|
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} dipadam",
|
||||||
|
"Deleted {{name}}": "{{name}} dipadam",
|
||||||
|
"Description": "Penerangan",
|
||||||
|
"Didn't fully follow instructions": "Tidak mengikut arahan sepenuhnya",
|
||||||
|
"Disabled": "Dilumpuhkan",
|
||||||
|
"Discover a function": "Temui fungsi",
|
||||||
|
"Discover a model": "Temui model",
|
||||||
|
"Discover a prompt": "Temui gesaan",
|
||||||
|
"Discover a tool": "Temui alat",
|
||||||
|
"Discover, download, and explore custom functions": "Temui, muat turun dan teroka fungsi tersuai",
|
||||||
|
"Discover, download, and explore custom prompts": "Temui, muat turun dan teroka gesaan tersuai",
|
||||||
|
"Discover, download, and explore custom tools": "Temui, muat turun dan teroka alat tersuai",
|
||||||
|
"Discover, download, and explore model presets": "Temui, muat turun dan teroka model pratetap",
|
||||||
|
"Dismissible": "Diketepikan",
|
||||||
|
"Display Emoji in Call": "Paparkan Emoji dalam Panggilan",
|
||||||
|
"Display the username instead of You in the Chat": "aparkan nama pengguna dan bukannya 'Anda' dalam Sembang",
|
||||||
|
"Do not install functions from sources you do not fully trust.": "Jangan pasang fungsi daripada sumber yang anda tidak percayai sepenuhnya.",
|
||||||
|
"Do not install tools from sources you do not fully trust.": "Jangan pasang alat daripada sumber yang anda tidak percaya sepenuhnya.",
|
||||||
|
"Document": "Dokumen",
|
||||||
|
"Document Settings": "Tetapan Dokumen",
|
||||||
|
"Documentation": "Dokumentasi",
|
||||||
|
"Documents": "Dokumen",
|
||||||
|
"does not make any external connections, and your data stays securely on your locally hosted server.": "tidak membuat sebarang sambungan luaran, dan data anda kekal selamat pada pelayan yang dihoskan ditempat anda",
|
||||||
|
"Don't Allow": "Tidak Dibenarkan",
|
||||||
|
"Don't have an account?": "Anda tidak mempunyai akaun?",
|
||||||
|
"don't install random functions from sources you don't trust.": "jangan pasang mana-mana fungsi daripada sumber yang anda tidak percayai.",
|
||||||
|
"don't install random tools from sources you don't trust.": "jangan pasang mana-mana alat daripada sumber yang anda tidak percayai.",
|
||||||
|
"Don't like the style": "Tidak suka gaya ini",
|
||||||
|
"Done": "Selesai",
|
||||||
|
"Download": "Muat Turun",
|
||||||
|
"Download canceled": "Muat Turun dibatalkan",
|
||||||
|
"Download Database": "Muat turun Pangkalan Data",
|
||||||
|
"Drop any files here to add to the conversation": "Letakkan mana-mana fail di sini untuk ditambahkan pada perbualan",
|
||||||
|
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "cth '30s','10m'. Unit masa yang sah ialah 's', 'm', 'h'.",
|
||||||
|
"Edit": "Edit",
|
||||||
|
"Edit Doc": "Edit Dokumen",
|
||||||
|
"Edit Memory": "Edit Memori",
|
||||||
|
"Edit User": "Edit Penggunal",
|
||||||
|
"ElevenLabs": "ElevenLabs",
|
||||||
|
"Email": "E-mel",
|
||||||
|
"Embedding Batch Size": "Membenamkan Saiz Kelompok",
|
||||||
|
"Embedding Model": "Model Benamkan",
|
||||||
|
"Embedding Model Engine": "Enjin Model Benamkan",
|
||||||
|
"Embedding model set to \"{{embedding_model}}\"": "Model Benamkan ditetapkan kepada \"{{embedding_model}}\"",
|
||||||
|
"Enable Chat History": "Benarkan Sejarah Perbualan",
|
||||||
|
"Enable Community Sharing": "Benarkan Perkongsian Komunity",
|
||||||
|
"Enable New Sign Ups": "Benarkan Pendaftaran Baharu",
|
||||||
|
"Enable Web Search": "Benarkan Carian Web",
|
||||||
|
"Enabled": "Dibenarkan",
|
||||||
|
"Engine": "Enjin",
|
||||||
|
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "astikan fail CSV anda mengandungi 4 lajur dalam susunan ini: Nama, E-mel, Kata Laluan, Peranan.",
|
||||||
|
"Enter {{role}} message here": "Masukkan mesej {{role}} di sini",
|
||||||
|
"Enter a detail about yourself for your LLMs to recall": "Masukkan butiran tentang diri anda untuk diingati oleh LLM anda",
|
||||||
|
"Enter api auth string (e.g. username:password)": "Masukkan kekunci auth api ( cth nama pengguna:kata laluan )",
|
||||||
|
"Enter Brave Search API Key": "Masukkan Kekunci API carian Brave",
|
||||||
|
"Enter Chunk Overlap": "Masukkan Tindihan 'Chunk'",
|
||||||
|
"Enter Chunk Size": "Masukkan Saiz 'Chunk'",
|
||||||
|
"Enter Github Raw URL": "Masukkan URL 'Github Raw'",
|
||||||
|
"Enter Google PSE API Key": "Masukkan kunci API Google PSE",
|
||||||
|
"Enter Google PSE Engine Id": "Masukkan Id Enjin Google PSE",
|
||||||
|
"Enter Image Size (e.g. 512x512)": "Masukkan Saiz Imej (cth 512x512)",
|
||||||
|
"Enter language codes": "Masukkan kod bahasa",
|
||||||
|
"Enter model tag (e.g. {{modelTag}})": "Masukkan tag model (cth {{ modelTag }})",
|
||||||
|
"Enter Number of Steps (e.g. 50)": "Masukkan Bilangan Langkah (cth 50)",
|
||||||
|
"Enter Score": "Masukkan Skor",
|
||||||
|
"Enter Searxng Query URL": "Masukkan URL 'Searxng Query'",
|
||||||
|
"Enter Serper API Key": "Masukkan Kunci API Serper",
|
||||||
|
"Enter Serply API Key": "Masukkan Kunci API Serply",
|
||||||
|
"Enter Serpstack API Key": "Masukkan Kunci API Serpstack",
|
||||||
|
"Enter stop sequence": "Masukkan urutan hentian",
|
||||||
|
"Enter system prompt": "Masukkan gesaan sistem",
|
||||||
|
"Enter Tavily API Key": "Masukkan Kunci API Tavily",
|
||||||
|
"Enter Tika Server URL": "Masukkan URL Pelayan Tika",
|
||||||
|
"Enter Top K": "Masukkan 'Top K'",
|
||||||
|
"Enter URL (e.g. http://127.0.0.1:7860/)": "Masukkan URL (cth http://127.0.0.1:7860/)",
|
||||||
|
"Enter URL (e.g. http://localhost:11434)": "Masukkan URL (cth http://localhost:11434)",
|
||||||
|
"Enter Your Email": "Masukkan E-mel Anda",
|
||||||
|
"Enter Your Full Name": "Masukkan Nama Penuh Anda",
|
||||||
|
"Enter your message": "Masukkan mesej anda",
|
||||||
|
"Enter Your Password": "Masukkan Kata Laluan Anda",
|
||||||
|
"Enter Your Role": "Masukkan Peranan Anda",
|
||||||
|
"Error": "Ralat",
|
||||||
|
"Experimental": "Percubaan",
|
||||||
|
"Export": "Eksport",
|
||||||
|
"Export All Chats (All Users)": "Eksport Semua Perbualan (Semua Pengguna)",
|
||||||
|
"Export chat (.json)": "Eksport perbualan (.json)",
|
||||||
|
"Export Chats": "Eksport Perbualan",
|
||||||
|
"Export Documents Mapping": "Eksport Pemetaan Dokumen",
|
||||||
|
"Export Functions": "Eksport 'Fungsi'",
|
||||||
|
"Export LiteLLM config.yaml": "Eksport LiteLLM config.yaml",
|
||||||
|
"Export Models": "Eksport Model",
|
||||||
|
"Export Prompts": "Eksport Gesaan",
|
||||||
|
"Export Tools": "Eksport Alat",
|
||||||
|
"External Models": "Model Luaran",
|
||||||
|
"Failed to create API Key.": "Gagal mencipta kekunci API",
|
||||||
|
"Failed to read clipboard contents": "Gagal membaca konten papan klip",
|
||||||
|
"Failed to update settings": "Gagal mengemaskini tetapan",
|
||||||
|
"February": "Febuari",
|
||||||
|
"Feel free to add specific details": "Jangan ragu untuk menambah butiran khusus",
|
||||||
|
"File": "Fail",
|
||||||
|
"File Mode": "Mod Fail",
|
||||||
|
"File not found.": "Fail tidak dijumpai",
|
||||||
|
"Files": "Fail-Fail",
|
||||||
|
"Filter is now globally disabled": "Tapisan kini dilumpuhkan secara global",
|
||||||
|
"Filter is now globally enabled": "Tapisan kini dibenarkan secara global",
|
||||||
|
"Filters": "Tapisan",
|
||||||
|
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Peniruan cap jari dikesan, tidak dapat menggunakan nama pendek sebagai avatar. Lalai kepada imej profail asal",
|
||||||
|
"Fluidly stream large external response chunks": "Strim 'chunks' respons luaran yang besar dengan lancar",
|
||||||
|
"Focus chat input": "Fokus kepada input perbualan",
|
||||||
|
"Followed instructions perfectly": "Mengikut arahan dengan sempurna",
|
||||||
|
"Form": "Borang",
|
||||||
|
"Format your variables using square brackets like this:": "Formatkan pembolehubah anda menggunakan kurungan segi empat sama seperti ini:",
|
||||||
|
"Frequency Penalty": "Penalti Kekerapan",
|
||||||
|
"Function created successfully": "Fungsi berjaya dibuat",
|
||||||
|
"Function deleted successfully": "Fungsi berjaya dipadamkan",
|
||||||
|
"Function Description (e.g. A filter to remove profanity from text)": "Perihalan Fungsi (cth. Tapisan untuk membuang kata-kata kotor daripada teks)",
|
||||||
|
"Function ID (e.g. my_filter)": "ID Fungsi (cth. my_filter)",
|
||||||
|
"Function is now globally disabled": "Fungsi kini dilumpuhkan secara global",
|
||||||
|
"Function is now globally enabled": "Fungsi kini dibenarkan secara global",
|
||||||
|
"Function Name (e.g. My Filter)": "Nama Fungsi (cth. 'My Filter')",
|
||||||
|
"Function updated successfully": "Fungsi berjaya dikemaskini",
|
||||||
|
"Functions": "Fungsi",
|
||||||
|
"Functions allow arbitrary code execution": "Fungsi membenarkan pelaksanaan kod sewenang-wenangnya",
|
||||||
|
"Functions allow arbitrary code execution.": "Fungsi membenarkan pelaksanaan kod sewenang-wenangnya.",
|
||||||
|
"Functions imported successfully": "Fungsi berjaya diimport",
|
||||||
|
"General": "Umum",
|
||||||
|
"General Settings": "Tetapan Umum",
|
||||||
|
"Generate Image": "Jana Imej",
|
||||||
|
"Generating search query": "Jana pertanyaan carian",
|
||||||
|
"Generation Info": "Maklumat Penjanaan",
|
||||||
|
"Get up and running with": "Bangun dan berlari dengan",
|
||||||
|
"Global": "Global",
|
||||||
|
"Good Response": "Respons Baik",
|
||||||
|
"Google PSE API Key": "Kunci API Google PSE",
|
||||||
|
"Google PSE Engine Id": "ID Enjin Google PSE",
|
||||||
|
"h:mm a": "h:mm a",
|
||||||
|
"has no conversations.": "tidak mempunyai perbualan.",
|
||||||
|
"Hello, {{name}}": "Hello, {{name}}",
|
||||||
|
"Help": "Bantuan",
|
||||||
|
"Hide": "Sembunyi",
|
||||||
|
"Hide Model": "Sembunyikan Model",
|
||||||
|
"How can I help you today?": "Bagaimana saya boleh membantu anda hari ini?",
|
||||||
|
"Hybrid Search": "Carian Hibrid",
|
||||||
|
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Saya mengakui bahawa saya telah membaca dan saya memahami implikasi tindakan saya. Saya sedar tentang risiko yang berkaitan dengan melaksanakan kod sewenang-wenangnya dan saya telah mengesahkan kebolehpercayaan sumber tersebut.",
|
||||||
|
"Image Generation (Experimental)": "Penjanaan Imej (Percubaan)",
|
||||||
|
"Image Generation Engine": "Enjin Penjanaan Imej",
|
||||||
|
"Image Settings": "Tetapan Imej",
|
||||||
|
"Images": "Imej",
|
||||||
|
"Import Chats": "Import Perbualan",
|
||||||
|
"Import Documents Mapping": "Import Pemetaan Dokumen",
|
||||||
|
"Import Functions": "Import Fungsi",
|
||||||
|
"Import Models": "Import Model",
|
||||||
|
"Import Prompts": "Import Gesaan",
|
||||||
|
"Import Tools": "Import Alat",
|
||||||
|
"Include `--api-auth` flag when running stable-diffusion-webui": "Sertakan bendera `-- api -auth` semasa menjalankan stable-diffusion-webui ",
|
||||||
|
"Include `--api` flag when running stable-diffusion-webui": "Sertakan bendera `-- api ` semasa menjalankan stable-diffusion-webui",
|
||||||
|
"Info": "Maklumat",
|
||||||
|
"Input commands": "Masukkan Arahan",
|
||||||
|
"Install from Github URL": "Pasang daripada URL Github",
|
||||||
|
"Instant Auto-Send After Voice Transcription": "Hantar Secara Automatik Dengan Segera Selepas Transkripsi Suara",
|
||||||
|
"Interface": "Ataramuka",
|
||||||
|
"Invalid Tag": "Tag tidak sah",
|
||||||
|
"January": "Januari",
|
||||||
|
"join our Discord for help.": "sertai Discord kami untuk mendapatkan bantuan.",
|
||||||
|
"JSON": "JSON",
|
||||||
|
"JSON Preview": "Pratonton JSON",
|
||||||
|
"July": "Julai",
|
||||||
|
"June": "Jun",
|
||||||
|
"JWT Expiration": "Tempoh Tamat JWT",
|
||||||
|
"JWT Token": "Token JWT",
|
||||||
|
"Keep Alive": "Kekalkan Hidup",
|
||||||
|
"Keyboard shortcuts": "Pintasan papan kekunci",
|
||||||
|
"Knowledge": "Pengetahuan",
|
||||||
|
"Language": "Bahasa",
|
||||||
|
"large language models, locally.": "model bahasa besar, tempatan.",
|
||||||
|
"Last Active": "Dilihat aktif terakhir pada",
|
||||||
|
"Last Modified": "Kemaskini terakhir pada",
|
||||||
|
"Light": "Cerah",
|
||||||
|
"Listening...": "Mendengar...",
|
||||||
|
"LLMs can make mistakes. Verify important information.": "LLM boleh membuat kesilapan. Sahkan maklumat penting",
|
||||||
|
"Local Models": "Model Tempatan",
|
||||||
|
"LTR": "LTR",
|
||||||
|
"Made by OpenWebUI Community": "Dicipta oleh Komunity OpenWebUI",
|
||||||
|
"Make sure to enclose them with": "Pastikan untuk melampirkannya dengan",
|
||||||
|
"Manage": "Mengurus",
|
||||||
|
"Manage Models": "Urus Model",
|
||||||
|
"Manage Ollama Models": "Urus Model Ollama",
|
||||||
|
"Manage Pipelines": "Urus 'Pipelines'",
|
||||||
|
"March": "Mac",
|
||||||
|
"Max Tokens (num_predict)": "Token Maksimum ( num_predict )",
|
||||||
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimum 3 model boleh dimuat turun serentak. Sila cuba sebentar lagi.",
|
||||||
|
"May": "Mei",
|
||||||
|
"Memories accessible by LLMs will be shown here.": "Memori yang boleh diakses oleh LLM akan ditunjukkan di sini.",
|
||||||
|
"Memory": "Memori",
|
||||||
|
"Memory added successfully": "Memori berjaya ditambah",
|
||||||
|
"Memory cleared successfully": "Memori berjaya dikosongkan",
|
||||||
|
"Memory deleted successfully": "Memori berjaya dihapuskan",
|
||||||
|
"Memory updated successfully": "Memori berjaya dikemaskini",
|
||||||
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mesej yang anda hantar selepas membuat pautan anda tidak akan dikongsi. Pengguna dengan URL akan dapat melihat perbualan yang dikongsi.",
|
||||||
|
"Min P": "P Minimum",
|
||||||
|
"Minimum Score": "Skor Minimum",
|
||||||
|
"Mirostat": "Mirostat",
|
||||||
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
|
"Mirostat Tau": "Mirostat Tau",
|
||||||
|
"MMMM DD, YYYY": "DD MMMM YYYY",
|
||||||
|
"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
|
||||||
|
"MMMM DD, YYYY hh:mm:ss A": "DD MMMM YYYY HH:mm:ss A",
|
||||||
|
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{ modelName }}' telah berjaya dimuat turun.",
|
||||||
|
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{ modelTag }}' sudah dalam baris gilir untuk dimuat turun.",
|
||||||
|
"Model {{modelId}} not found": "Model {{ modelId }} tidak dijumpai",
|
||||||
|
"Model {{modelName}} is not vision capable": "Model {{ modelName }} tidak mempunyai keupayaan penglihatan",
|
||||||
|
"Model {{name}} is now {{status}}": "Model {{name}} kini {{status}}",
|
||||||
|
"Model created successfully!": "Model berjaya dibuat!",
|
||||||
|
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Laluan sistem fail model dikesan. Nama pendek model diperlukan untuk kemas kini, tidak boleh diteruskan.",
|
||||||
|
"Model ID": "ID Model",
|
||||||
|
"Model not selected": "Model tidak dipilih",
|
||||||
|
"Model Params": "Model Params",
|
||||||
|
"Model updated successfully": "Model berjaya dikemas kini",
|
||||||
|
"Model Whitelisting": "Senarai Putih Model",
|
||||||
|
"Model(s) Whitelisted": "Model Disenarai Putih",
|
||||||
|
"Modelfile Content": "Kandungan Modelfail",
|
||||||
|
"Models": "Model",
|
||||||
|
"More": "Lagi",
|
||||||
|
"Name": "Nama",
|
||||||
|
"Name Tag": "Nama Tag",
|
||||||
|
"Name your model": "Namakan Model Anda",
|
||||||
|
"New Chat": "Perbualan Baru",
|
||||||
|
"New Password": "Kata Laluan Baru",
|
||||||
|
"No content to speak": "Tiada kandungan untuk bercakap",
|
||||||
|
"No documents found": "Tiada dokumen ditemui",
|
||||||
|
"No file selected": "Tiada fail dipilih",
|
||||||
|
"No results found": "Tiada keputusan dijumpai",
|
||||||
|
"No search query generated": "Tiada pertanyaan carian dijana",
|
||||||
|
"No source available": "Tiada sumber tersedia",
|
||||||
|
"No valves to update": "Tiada 'valve' untuk dikemas kini",
|
||||||
|
"None": "Tiada",
|
||||||
|
"Not factually correct": "Tidak tepat secara fakta",
|
||||||
|
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Jika anda menetapkan skor minimum, carian hanya akan mengembalikan dokumen dengan skor lebih besar daripada atau sama dengan skor minimum.",
|
||||||
|
"Notifications": "Pemberitahuan",
|
||||||
|
"November": "November",
|
||||||
|
"num_thread (Ollama)": "num_thread (Ollama)",
|
||||||
|
"OAuth ID": "ID OAuth",
|
||||||
|
"October": "Oktober",
|
||||||
|
"Off": "Mati",
|
||||||
|
"Okay, Let's Go!": "Baiklah, Jom!",
|
||||||
|
"OLED Dark": "OLED Gelap",
|
||||||
|
"Ollama": "Ollama",
|
||||||
|
"Ollama API": "API Ollama",
|
||||||
|
"Ollama API disabled": "API Ollama dilumpuhkan",
|
||||||
|
"Ollama API is disabled": "API Ollama telah dilumpuhkan",
|
||||||
|
"Ollama Version": "Versi Ollama",
|
||||||
|
"On": "Hidup",
|
||||||
|
"Only": "Hanya",
|
||||||
|
"Only alphanumeric characters and hyphens are allowed in the command string.": "Hanya aksara alfanumerik dan sempang dibenarkan dalam rentetan arahan.",
|
||||||
|
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Maaf! Harap Bersabar. Fail anda masih dalam ketuhar pemprosesan. Kami sedang memasaknya dengan sempurna. Harap bersabar dan kami akan memberitahu anda sebaik sahaja ia siap.",
|
||||||
|
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Maaf, didapati URL tidak sah. Sila semak semula dan cuba lagi.",
|
||||||
|
"Oops! There was an error in the previous response. Please try again or contact admin.": "Maaf, terdapat ralat dalam respons sebelumnya. Sila cuba lagi atau hubungi pentadbir",
|
||||||
|
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Maaf, Anda menggunakan kaedah yang tidak disokong (bahagian 'frontend' sahaja). Sila sediakan WebUI dari 'backend'.",
|
||||||
|
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||||
|
"Open new chat": "Buka perbualan baru",
|
||||||
|
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) adalah lebih rendah daripada versi yang diperlukan iaitu (v{{REQUIRED_VERSION}})",
|
||||||
|
"OpenAI": "OpenAI",
|
||||||
|
"OpenAI API": "API OpenAI",
|
||||||
|
"OpenAI API Config": "Tetapan API OpenAI",
|
||||||
|
"OpenAI API Key is required.": "Kekunci API OpenAI diperlukan",
|
||||||
|
"OpenAI URL/Key required.": "URL/Kekunci OpenAI diperlukan",
|
||||||
|
"or": "atau",
|
||||||
|
"Other": "Lain-lain",
|
||||||
|
"Password": "Kata Laluan",
|
||||||
|
"PDF document (.pdf)": "Dokumen PDF (.pdf)",
|
||||||
|
"PDF Extract Images (OCR)": "Imej Ekstrak PDF (OCR)",
|
||||||
|
"pending": "tertunda",
|
||||||
|
"Permission denied when accessing media devices": "Tidak mendapat kebenaran apabila cuba mengakses peranti media",
|
||||||
|
"Permission denied when accessing microphone": "Tidak mendapat kebenaran apabila cuba mengakses mikrofon",
|
||||||
|
"Permission denied when accessing microphone: {{error}}": "Tidak mendapat kebenaran apabila cuba mengakses mikrofon: {{error}}",
|
||||||
|
"Personalization": "Personalisasi",
|
||||||
|
"Pin": "Pin",
|
||||||
|
"Pinned": "Disemat",
|
||||||
|
"Pipeline deleted successfully": "'Pipeline' berjaya dipadam",
|
||||||
|
"Pipeline downloaded successfully": "'Pipeline' berjaya dimuat turun",
|
||||||
|
"Pipelines": "'Pipeline'",
|
||||||
|
"Pipelines Not Detected": "'Pipeline' tidak ditemui",
|
||||||
|
"Pipelines Valves": "'Pipeline Valves'",
|
||||||
|
"Plain text (.txt)": "Teks biasa (.txt)",
|
||||||
|
"Playground": "Taman Permainan",
|
||||||
|
"Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:",
|
||||||
|
"Positive attitude": "Sikap positif",
|
||||||
|
"Previous 30 days": "30 hari sebelumnya",
|
||||||
|
"Previous 7 days": "7 hari sebelumnya",
|
||||||
|
"Profile Image": "Imej Profail",
|
||||||
|
"Prompt": "Gesaan",
|
||||||
|
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Gesaan (cth Beritahu saya fakta yang menyeronokkan tentang Kesultanan Melaka)",
|
||||||
|
"Prompt Content": "Kandungan Gesaan",
|
||||||
|
"Prompt suggestions": "Cadangan Gesaan",
|
||||||
|
"Prompts": "Gesaan",
|
||||||
|
"Pull \"{{searchValue}}\" from Ollama.com": "Tarik \"{{ searchValue }}\" daripada Ollama.com",
|
||||||
|
"Pull a model from Ollama.com": "Tarik model dari Ollama.com",
|
||||||
|
"Query Params": "'Query Params'",
|
||||||
|
"RAG Template": "Templat RAG",
|
||||||
|
"Read Aloud": "Baca dengan lantang",
|
||||||
|
"Record voice": "Rakam suara",
|
||||||
|
"Redirecting you to OpenWebUI Community": "Membawa anda ke Komuniti OpenWebUI",
|
||||||
|
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Rujuk diri anda sebagai \"User\" (cth, \"Pengguna sedang belajar bahasa Sepanyol\")",
|
||||||
|
"Refused when it shouldn't have": "Menolak dimana ia tidak sepatutnya",
|
||||||
|
"Regenerate": "Jana semula",
|
||||||
|
"Release Notes": "Nota Keluaran",
|
||||||
|
"Remove": "Hapuskan",
|
||||||
|
"Remove Model": "Hapuskan Model",
|
||||||
|
"Rename": "Namakan Semula",
|
||||||
|
"Repeat Last N": "Ulang N Terakhir",
|
||||||
|
"Request Mode": "Mod Permintaan",
|
||||||
|
"Reranking Model": "Model 'Reranking'",
|
||||||
|
"Reranking model disabled": "Model 'Reranking' dilumpuhkan",
|
||||||
|
"Reranking model set to \"{{reranking_model}}\"": "Model 'Reranking' ditetapkan kepada \"{{reranking_model}}\"",
|
||||||
|
"Reset": "Tetapkan Semula",
|
||||||
|
"Reset Upload Directory": "Tetapkan Semula Direktori Muat Naik",
|
||||||
|
"Reset Vector Storage": "Tetapkan Semula Storan Vektor",
|
||||||
|
"Response AutoCopy to Clipboard": "Salin Response secara Automatik ke Papan Klip",
|
||||||
|
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Pemberitahuan respons tidak boleh diaktifkan kerana kebenaran tapak web tidak diberi. Sila lawati tetapan pelayar web anda untuk memberikan akses yang diperlukan.",
|
||||||
|
"Role": "Peranan",
|
||||||
|
"Rosé Pine": "Rosé Pine",
|
||||||
|
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||||
|
"RTL": "RTL",
|
||||||
|
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "Jalankan Llama 2, Code Llama dan model lain. Sesuaikan dan buat sendiri.",
|
||||||
|
"Running": "Sedang dijalankan",
|
||||||
|
"Save": "Simpan",
|
||||||
|
"Save & Create": "Simpan & Cipta",
|
||||||
|
"Save & Update": "Simpan & Kemas Kini",
|
||||||
|
"Save Tag": "Simpan Tag",
|
||||||
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Penyimpanan log perbualan terus ke storan pelayan web anda tidak lagi disokong. Sila luangkan sedikit masa untuk memuat turun dan memadam log perbualan anda dengan mengklik butang di bawah. Jangan risau, anda boleh mengimport semula log perbualan anda dengan mudah melalui 'backend'",
|
||||||
|
"Scan": "Imbas",
|
||||||
|
"Scan complete!": "Imbasan selesai!",
|
||||||
|
"Scan for documents from {{path}}": "Imbas untuk dokumen dari {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
|
"Search": "Carian",
|
||||||
|
"Search a model": "Cari Model",
|
||||||
|
"Search Chats": "Cari Perbualan",
|
||||||
|
"Search Documents": "Carian Dokumen",
|
||||||
|
"Search Functions": "Carian Fungsi",
|
||||||
|
"Search Models": "Carian Model",
|
||||||
|
"Search Prompts": "Carian Gesaan",
|
||||||
|
"Search Query Generation Prompt": "Carian Penjanaan Pertanyaan Gesaan",
|
||||||
|
"Search Query Generation Prompt Length Threshold": "Had Panjang Gesaan Penjanaan Pertanyaan Carian",
|
||||||
|
"Search Result Count": "Kiraan Hasil Carian",
|
||||||
|
"Search Tools": "Alat Carian",
|
||||||
|
"Searched {{count}} sites_one": "Mencari {{count}} sites_one",
|
||||||
|
"Searched {{count}} sites_other": "Mencari {{count}} tapak_lain",
|
||||||
|
"Searching \"{{searchQuery}}\"": "encari \"{{ searchQuery }}\"",
|
||||||
|
"Searxng Query URL": "URL Pertanyaan Searxng",
|
||||||
|
"See readme.md for instructions": "Lihat readme.md untuk arahan",
|
||||||
|
"See what's new": "Lihat apa yang terbaru",
|
||||||
|
"Seed": "Benih",
|
||||||
|
"Select a base model": "Pilih model asas",
|
||||||
|
"Select a engine": "Pilih enjin",
|
||||||
|
"Select a function": "Pilih fungsi",
|
||||||
|
"Select a mode": "Pilih Mod",
|
||||||
|
"Select a model": "Pilih model",
|
||||||
|
"Select a pipeline": "Pilih 'pipeline'",
|
||||||
|
"Select a pipeline url": "Pilih url 'pipeline'",
|
||||||
|
"Select a tool": "Pilih alat",
|
||||||
|
"Select an Ollama instance": "Pilih Ollama contoh",
|
||||||
|
"Select Documents": "Pilih Dokumen",
|
||||||
|
"Select model": "Pilih model",
|
||||||
|
"Select only one model to call": "Pilih hanya satu model untuk dipanggil",
|
||||||
|
"Selected model(s) do not support image inputs": "Model dipilih tidak menyokong input imej",
|
||||||
|
"Send": "Hantar",
|
||||||
|
"Send a Message": "Hantar Pesanan",
|
||||||
|
"Send message": "Hantar pesanan",
|
||||||
|
"September": "September",
|
||||||
|
"Serper API Key": "Kunci API Serper",
|
||||||
|
"Serply API Key": "Kunci API Serply",
|
||||||
|
"Serpstack API Key": "Kunci API Serpstack",
|
||||||
|
"Server connection verified": "Sambungan pelayan disahkan",
|
||||||
|
"Set as default": "Tetapkan sebagai lalai",
|
||||||
|
"Set Default Model": "Tetapkan Model Lalai",
|
||||||
|
"Set embedding model (e.g. {{model}})": "Tetapkan model benamkan (cth {{model}})",
|
||||||
|
"Set Image Size": "Tetapkan saiz imej",
|
||||||
|
"Set reranking model (e.g. {{model}})": "Tetapkan model 'reranking' (cth {{model}})",
|
||||||
|
"Set Steps": "tapkan Langkah",
|
||||||
|
"Set Task Model": "Tetapkan Model Tugasan",
|
||||||
|
"Set Voice": "Tetapan Suara",
|
||||||
|
"Settings": "Tetapan",
|
||||||
|
"Settings saved successfully!": "Tetapan berjaya disimpan!",
|
||||||
|
"Settings updated successfully": "Tetapan berjaya dikemas kini",
|
||||||
|
"Share": "Kongsi",
|
||||||
|
"Share Chat": "Kongsi Perbualan",
|
||||||
|
"Share to OpenWebUI Community": "Kongsi kepada Komuniti OpenWebUI",
|
||||||
|
"short-summary": "ringkasan",
|
||||||
|
"Show": "Tunjukkan",
|
||||||
|
"Show Admin Details in Account Pending Overlay": "Tunjukkan Butiran Pentadbir dalam Akaun Menunggu Tindanan",
|
||||||
|
"Show Model": "Tunjukkan Model",
|
||||||
|
"Show shortcuts": "Tunjukkan pintasan",
|
||||||
|
"Show your support!": "Tunjukkan sokongan anda!",
|
||||||
|
"Showcased creativity": "eativiti yang dipamerkan",
|
||||||
|
"Sign in": "Daftar masuk",
|
||||||
|
"Sign Out": "Daftar keluar",
|
||||||
|
"Sign up": "Daftar",
|
||||||
|
"Signing in": "Sedang Mendaftar",
|
||||||
|
"Source": "Sumber",
|
||||||
|
"Speech recognition error: {{error}}": "Ralat pengecaman pertuturan: {{error}}",
|
||||||
|
"Speech-to-Text Engine": "Enjin Ucapan-ke-Teks",
|
||||||
|
"Stop Sequence": "Jujukan Henti",
|
||||||
|
"STT Model": "Model STT",
|
||||||
|
"STT Settings": "Tetapan STT",
|
||||||
|
"Submit": "Hantar",
|
||||||
|
"Subtitle (e.g. about the Roman Empire)": "Sari kata (cth tentang Kesultanan Melaka)",
|
||||||
|
"Success": "Berjaya",
|
||||||
|
"Successfully updated.": "Berjaya Dikemaskini",
|
||||||
|
"Suggested": "Cadangan",
|
||||||
|
"Support": "Sokongan",
|
||||||
|
"Support this plugin:": "Sokong plugin ini",
|
||||||
|
"System": "Sistem",
|
||||||
|
"System Prompt": "Gesaan Sistem",
|
||||||
|
"Tags": "Tag",
|
||||||
|
"Tap to interrupt": "Sentuh untuk mengganggu",
|
||||||
|
"Tavily API Key": "Kunci API Tavily",
|
||||||
|
"Tell us more:": "Beritahu kami lebih lanjut",
|
||||||
|
"Temperature": "Suhu",
|
||||||
|
"Template": "Templat",
|
||||||
|
"Text Completion": "Penyiapan Teks",
|
||||||
|
"Text-to-Speech Engine": "Enjin Teks-ke-Ucapan",
|
||||||
|
"Tfs Z": "Tfs Z",
|
||||||
|
"Thanks for your feedback!": "Terima kasih atas maklum balas anda!",
|
||||||
|
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Pembangun di sebalik 'plugin' ini adalah sukarelawan yang bersemangat daripada komuniti. Jika anda mendapati 'plugin' ini membantu, sila pertimbangkan untuk menyumbang kepada pembangunannya.",
|
||||||
|
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Skor hendaklah berada diantara 0.0 (0%) dan 1.0 (100%).",
|
||||||
|
"Theme": "Tema",
|
||||||
|
"Thinking...": "Berfikir...",
|
||||||
|
"This action cannot be undone. Do you wish to continue?": "Tindakan ini tidak boleh diubah semula kepada asal. Adakah anda ingin teruskan",
|
||||||
|
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ini akan memastikan bahawa perbualan berharga anda disimpan dengan selamat ke pangkalan data 'backend' anda. Terima kasih!",
|
||||||
|
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "ni adalah ciri percubaan, ia mungkin tidak berfungsi seperti yang diharapkan dan tertakluk kepada perubahan pada bila-bila masa.",
|
||||||
|
"This setting does not sync across browsers or devices.": "Tetapan ini tidak menyegerak merentas pelayar web atau peranti.",
|
||||||
|
"This will delete": "Ini akan memadam",
|
||||||
|
"Thorough explanation": "Penjelasan menyeluruh",
|
||||||
|
"Tika": "Tika",
|
||||||
|
"Tika Server URL required.": "URL Pelayan Tika diperlukan.",
|
||||||
|
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Petua: Kemas kini berbilang slot pembolehubah secara berturut-turut dengan menekan kekunci tab dalam input perbualan selepas setiap penggantian.",
|
||||||
|
"Title": "Tajuk",
|
||||||
|
"Title (e.g. Tell me a fun fact)": "Tajuk (cth Beritahu saya fakta yang menyeronokkan)",
|
||||||
|
"Title Auto-Generation": "Penjanaan Auto Tajuk",
|
||||||
|
"Title cannot be an empty string.": "Tajuk tidak boleh menjadi rentetan kosong",
|
||||||
|
"Title Generation Prompt": "Gesaan Penjanaan Tajuk",
|
||||||
|
"to": "ke",
|
||||||
|
"To access the available model names for downloading,": "Untuk mengakses nama model yang tersedia untuk dimuat turun,",
|
||||||
|
"To access the GGUF models available for downloading,": "Untuk mengakses model GGUF yang tersedia untuk dimuat turun,",
|
||||||
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Untuk mengakses WebUI , sila hubungi pentadbir. Pentadbir boleh menguruskan status pengguna daripada Panel Pentadbiran",
|
||||||
|
"To add documents here, upload them to the \"Documents\" workspace first.": "Untuk menambah dokumen di sini, muat naiknya ke ruang kerja \"Documents\" dahulu.",
|
||||||
|
"to chat input.": "untuk input perbualan.",
|
||||||
|
"To select actions here, add them to the \"Functions\" workspace first.": "Untuk memilih tindakan di sini, tambahkannya pada ruang kerja \"Functions\" dahulu.",
|
||||||
|
"To select filters here, add them to the \"Functions\" workspace first.": "Untuk memilih tapisan di sini, tambahkannya pada ruang kerja \"Functions\" dahulu.",
|
||||||
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "Untuk memilih kit alatan di sini, tambahkannya pada ruang kerja \"Tools\" dahulu.",
|
||||||
|
"Today": "Hari Ini",
|
||||||
|
"Toggle settings": "Suis Tetapan ",
|
||||||
|
"Toggle sidebar": "Suis Bar Sisi",
|
||||||
|
"Tokens To Keep On Context Refresh (num_keep)": "Token Untuk Teruskan Dalam Muat Semula Konteks ( num_keep )",
|
||||||
|
"Tool created successfully": "Alat berjaya dibuat",
|
||||||
|
"Tool deleted successfully": "Alat berjaya dipadamkan",
|
||||||
|
"Tool imported successfully": "Alat berjaya diimport",
|
||||||
|
"Tool updated successfully": "Alat berjaya dikemas kini",
|
||||||
|
"Toolkit Description (e.g. A toolkit for performing various operations)": "Perihalan Kit Alatan (cth. Kit alatan untuk melaksanakan pelbagai operasi)",
|
||||||
|
"Toolkit ID (e.g. my_toolkit)": "ID Kit Alatan (cth my_toolkit)",
|
||||||
|
"Toolkit Name (e.g. My ToolKit)": "Nama Kit Alatan (cth My ToolKit)",
|
||||||
|
"Tools": "Alatan",
|
||||||
|
"Tools are a function calling system with arbitrary code execution": "Alatan ialah sistem panggilan fungsi dengan pelaksanaan kod sewenang-wenangnya",
|
||||||
|
"Tools have a function calling system that allows arbitrary code execution": "Alatan mempunyai sistem panggilan fungsi yang membolehkan pelaksanaan kod sewenang-wenangnya",
|
||||||
|
"Tools have a function calling system that allows arbitrary code execution.": "Alatan mempunyai sistem panggilan fungsi yang membolehkan pelaksanaan kod sewenang-wenangnya.",
|
||||||
|
"Top K": "'Top K'",
|
||||||
|
"Top P": "'Top P'",
|
||||||
|
"Trouble accessing Ollama?": "Masalah mengakses Ollama?",
|
||||||
|
"TTS Model": "Model TTS",
|
||||||
|
"TTS Settings": "Tetapan TTS",
|
||||||
|
"TTS Voice": "Suara TTS",
|
||||||
|
"Type": "jenis",
|
||||||
|
"Type Hugging Face Resolve (Download) URL": "Taip URL 'Hugging Face Resolve (Download)'",
|
||||||
|
"Uh-oh! There was an issue connecting to {{provider}}.": "Maaf! Terdapat masalah menyambung ke {{provider}}.",
|
||||||
|
"UI": "UI",
|
||||||
|
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "Jenis fail tidak diketahui '{{ file_type }}'. Teruskan dengan muat naik fail juga.",
|
||||||
|
"Unpin": "Nyahsematkan",
|
||||||
|
"Update": "Kemaskini",
|
||||||
|
"Update and Copy Link": "Kemaskini dan salin pautan",
|
||||||
|
"Update password": "Kemaskini Kata Laluan",
|
||||||
|
"Updated at": "Dikemaskini pada",
|
||||||
|
"Upload": "Muatnaik",
|
||||||
|
"Upload a GGUF model": "Muatnaik model GGUF",
|
||||||
|
"Upload Files": "Muatnaik fail",
|
||||||
|
"Upload Pipeline": "Muatnaik 'Pipeline'",
|
||||||
|
"Upload Progress": "Kemajuan Muatnaik",
|
||||||
|
"URL Mode": "Mod URL",
|
||||||
|
"Use '#' in the prompt input to load and select your documents.": "Gunakan '#' dalam input gesaan untuk memuatkan dan memilih dokumen anda",
|
||||||
|
"Use Gravatar": "Gunakan Gravatar",
|
||||||
|
"Use Initials": "Gunakan nama pendek",
|
||||||
|
"use_mlock (Ollama)": "use_mlock (Ollama)",
|
||||||
|
"use_mmap (Ollama)": "se_mmap (Ollama)",
|
||||||
|
"user": "pengguna",
|
||||||
|
"User location successfully retrieved.": "Lokasi pengguna berjaya diambil.",
|
||||||
|
"User Permissions": "Kebenaran Pengguna",
|
||||||
|
"Users": "Pengguna",
|
||||||
|
"Utilize": "Gunakan",
|
||||||
|
"Valid time units:": "Unit masa yang sah:",
|
||||||
|
"Valves": "'Valves'",
|
||||||
|
"Valves updated": "'Valves' dikemaskini",
|
||||||
|
"Valves updated successfully": "'Valves' berjaya dikemaskini",
|
||||||
|
"variable": "pembolehubah",
|
||||||
|
"variable to have them replaced with clipboard content.": "pembolehubah untuk ia digantikan dengan kandungan papan klip.",
|
||||||
|
"Version": "Versi",
|
||||||
|
"Voice": "Suara",
|
||||||
|
"Warning": "Amaran",
|
||||||
|
"Warning:": "Amaran:",
|
||||||
|
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Amaran: Jika anda mengemas kini atau menukar model benam anda, anda perlu mengimport semula semua dokumen.",
|
||||||
|
"Web": "Web",
|
||||||
|
"Web API": "API Web",
|
||||||
|
"Web Loader Settings": "Tetapan Pemuat Web",
|
||||||
|
"Web Params": "Parameter Web",
|
||||||
|
"Web Search": "Carian Web",
|
||||||
|
"Web Search Engine": "Enjin Carian Web",
|
||||||
|
"Webhook URL": "URL 'Webhook'",
|
||||||
|
"WebUI Settings": "Tetapan WebUI",
|
||||||
|
"WebUI will make requests to": "WebUI akan membuat permintaan kepada",
|
||||||
|
"What’s New in": "Apakah yang terbaru dalam",
|
||||||
|
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Apabila sejarah dimatikan, perbualan baharu pada pelayan web ini tidak akan muncul dalam sejarah pada mana-mana peranti anda.",
|
||||||
|
"Whisper (Local)": "Whisper (Local)",
|
||||||
|
"Widescreen Mode": "Mod Skrin Lebar",
|
||||||
|
"Workspace": "Ruang Kerja",
|
||||||
|
"Write a prompt suggestion (e.g. Who are you?)": "Tulis cadangan gesaan (cth Siapakah anda?)",
|
||||||
|
"Write a summary in 50 words that summarizes [topic or keyword].": "Tulis ringkasan dalam 50 patah perkataan yang meringkaskan [topik atau kata kunci].",
|
||||||
|
"Yesterday": "Semalam",
|
||||||
|
"You": "Anda",
|
||||||
|
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Anda boleh memperibadikan interaksi anda dengan LLM dengan menambahkan memori melalui butang 'Urus' di bawah, menjadikannya lebih membantu dan disesuaikan dengan anda.",
|
||||||
|
"You cannot clone a base model": "Anda tidak boleh mengklon model asas",
|
||||||
|
"You have no archived conversations.": "Anda tidak mempunyai perbualan yang diarkibkan",
|
||||||
|
"You have shared this chat": "Anda telah berkongsi perbualan ini",
|
||||||
|
"You're a helpful assistant.": "Anda seorang pembantu yang bagus",
|
||||||
|
"You're now logged in.": "Anda kini telah log masuk.",
|
||||||
|
"Your account status is currently pending activation.": "Status akaun anda ialah sedang menunggu pengaktifan.",
|
||||||
|
"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.": "Seluruh sumbangan anda akan dihantar terus kepada pembangun 'plugin'; Open WebUI tidak mengambil sebarang peratusan keuntungan daripadanya. Walau bagaimanapun, platform pembiayaan yang dipilih mungkin mempunyai caj tersendiri.",
|
||||||
|
"Youtube": "Youtube",
|
||||||
|
"Youtube Loader Settings": "Tetapan Pemuat Youtube"
|
||||||
|
}
|
||||||
@@ -1,21 +1,22 @@
|
|||||||
{
|
{
|
||||||
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 't', 'd', 'u' eller '-1' for ingen utløp.",
|
"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 't', 'd', 'u' eller '-1' for ingen utløp.",
|
||||||
"(Beta)": "(Beta)",
|
"(Beta)": "(Beta)",
|
||||||
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
|
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(f.eks. `sh webui.sh --api --api-auth brukernavn_passord`)",
|
||||||
"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
|
"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
|
||||||
"(latest)": "(siste)",
|
"(latest)": "(siste)",
|
||||||
"{{ models }}": "{{ modeller }}",
|
"{{ models }}": "{{ modeller }}",
|
||||||
"{{ owner }}: You cannot delete a base model": "{{ eier }}: Du kan ikke slette en grunnmodell",
|
"{{ owner }}: You cannot delete a base model": "{{ eier }}: Du kan ikke slette en grunnmodell",
|
||||||
"{{modelName}} is thinking...": "{{modelName}} tenker...",
|
"{{modelName}} is thinking...": "{{modelName}} tenker...",
|
||||||
"{{user}}'s Chats": "{{user}}'s chatter",
|
"{{user}}'s Chats": "{{user}}s samtaler",
|
||||||
"{{webUIName}} Backend Required": "{{webUIName}} Backend kreves",
|
"{{webUIName}} Backend Required": "{{webUIName}} Backend kreves",
|
||||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "En oppgavemodell brukes når du utfører oppgaver som å generere titler for chatter og websøkeforespørsler",
|
"A task model is used when performing tasks such as generating titles for chats and web search queries": "En oppgavemodell brukes når du utfører oppgaver som å generere titler for samtaler og websøkeforespørsler",
|
||||||
"a user": "en bruker",
|
"a user": "en bruker",
|
||||||
"About": "Om",
|
"About": "Om",
|
||||||
"Account": "Konto",
|
"Account": "Konto",
|
||||||
"Account Activation Pending": "",
|
"Account Activation Pending": "Venter på kontoaktivering",
|
||||||
"Accurate information": "Nøyaktig informasjon",
|
"Accurate information": "Nøyaktig informasjon",
|
||||||
"Active Users": "",
|
"Actions": "Handlinger",
|
||||||
|
"Active Users": "Aktive brukere",
|
||||||
"Add": "Legg til",
|
"Add": "Legg til",
|
||||||
"Add a model id": "Legg til en modell-ID",
|
"Add a model id": "Legg til en modell-ID",
|
||||||
"Add a short description about what this model does": "Legg til en kort beskrivelse av hva denne modellen gjør",
|
"Add a short description about what this model does": "Legg til en kort beskrivelse av hva denne modellen gjør",
|
||||||
@@ -27,14 +28,15 @@
|
|||||||
"Add Memory": "Legg til minne",
|
"Add Memory": "Legg til minne",
|
||||||
"Add message": "Legg til melding",
|
"Add message": "Legg til melding",
|
||||||
"Add Model": "Legg til modell",
|
"Add Model": "Legg til modell",
|
||||||
|
"Add Tag": "Legg til tag",
|
||||||
"Add Tags": "Legg til tagger",
|
"Add Tags": "Legg til tagger",
|
||||||
"Add User": "Legg til bruker",
|
"Add User": "Legg til bruker",
|
||||||
"Adjusting these settings will apply changes universally to all users.": "Justering av disse innstillingene vil gjelde universelt for alle brukere.",
|
"Adjusting these settings will apply changes universally to all users.": "Endringer i disse innstillingene vil gjelde for alle brukere uten unntak.",
|
||||||
"admin": "administrator",
|
"admin": "administrator",
|
||||||
"Admin": "",
|
"Admin": "Administrator",
|
||||||
"Admin Panel": "Administrasjonspanel",
|
"Admin Panel": "Administrasjonspanel",
|
||||||
"Admin Settings": "Administrasjonsinnstillinger",
|
"Admin Settings": "Administrasjonsinnstillinger",
|
||||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratorer har alltid tilgang til alle verktøy, mens brukere må få tildelt verktøy for hver enkelt modell i arbeidsområdet.",
|
||||||
"Advanced Parameters": "Avanserte parametere",
|
"Advanced Parameters": "Avanserte parametere",
|
||||||
"Advanced Params": "Avanserte parametere",
|
"Advanced Params": "Avanserte parametere",
|
||||||
"all": "alle",
|
"all": "alle",
|
||||||
@@ -43,8 +45,8 @@
|
|||||||
"Allow": "Tillat",
|
"Allow": "Tillat",
|
||||||
"Allow Chat Deletion": "Tillat sletting av chatter",
|
"Allow Chat Deletion": "Tillat sletting av chatter",
|
||||||
"Allow non-local voices": "Tillat ikke-lokale stemmer",
|
"Allow non-local voices": "Tillat ikke-lokale stemmer",
|
||||||
"Allow User Location": "",
|
"Allow User Location": "Aktiver stedstjenester",
|
||||||
"Allow Voice Interruption in Call": "",
|
"Allow Voice Interruption in Call": "Muliggjør stemmeavbrytelse i samtale",
|
||||||
"alphanumeric characters and hyphens": "alfanumeriske tegn og bindestreker",
|
"alphanumeric characters and hyphens": "alfanumeriske tegn og bindestreker",
|
||||||
"Already have an account?": "Har du allerede en konto?",
|
"Already have an account?": "Har du allerede en konto?",
|
||||||
"an assistant": "en assistent",
|
"an assistant": "en assistent",
|
||||||
@@ -54,19 +56,19 @@
|
|||||||
"API Key": "API-nøkkel",
|
"API Key": "API-nøkkel",
|
||||||
"API Key created.": "API-nøkkel opprettet.",
|
"API Key created.": "API-nøkkel opprettet.",
|
||||||
"API keys": "API-nøkler",
|
"API keys": "API-nøkler",
|
||||||
"April": "April",
|
"April": "april",
|
||||||
"Archive": "Arkiv",
|
"Archive": "Arkiv",
|
||||||
"Archive All Chats": "Arkiver alle chatter",
|
"Archive All Chats": "Arkiver alle chatter",
|
||||||
"Archived Chats": "Arkiverte chatter",
|
"Archived Chats": "Arkiverte chatter",
|
||||||
"are allowed - Activate this command by typing": "er tillatt - Aktiver denne kommandoen ved å skrive",
|
"are allowed - Activate this command by typing": "er tillatt - Aktiver denne kommandoen ved å skrive",
|
||||||
"Are you sure?": "Er du sikker?",
|
"Are you sure?": "Er du sikker?",
|
||||||
"Attach file": "Legg ved fil",
|
"Attach file": "Legg ved fil",
|
||||||
"Attention to detail": "Oppmerksomhet på detaljer",
|
"Attention to detail": "Sans for detaljer",
|
||||||
"Audio": "Lyd",
|
"Audio": "Lyd",
|
||||||
"Audio settings updated successfully": "",
|
"Audio settings updated successfully": "Lydinnstillingene ble oppdatert",
|
||||||
"August": "August",
|
"August": "august",
|
||||||
"Auto-playback response": "Automatisk avspilling av svar",
|
"Auto-playback response": "Automatisk avspilling av svar",
|
||||||
"AUTOMATIC1111 Api Auth String": "",
|
"AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api Autentiseringsstreng",
|
||||||
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Grunn-URL",
|
"AUTOMATIC1111 Base URL": "AUTOMATIC1111 Grunn-URL",
|
||||||
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Grunn-URL kreves.",
|
"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 Grunn-URL kreves.",
|
||||||
"available!": "tilgjengelig!",
|
"available!": "tilgjengelig!",
|
||||||
@@ -74,21 +76,21 @@
|
|||||||
"Bad Response": "Dårlig svar",
|
"Bad Response": "Dårlig svar",
|
||||||
"Banners": "Bannere",
|
"Banners": "Bannere",
|
||||||
"Base Model (From)": "Grunnmodell (Fra)",
|
"Base Model (From)": "Grunnmodell (Fra)",
|
||||||
"Batch Size (num_batch)": "",
|
"Batch Size (num_batch)": "Batchstørrelse (num_batch)",
|
||||||
"before": "før",
|
"before": "før",
|
||||||
"Being lazy": "Er lat",
|
"Being lazy": "Er lat",
|
||||||
"Brave Search API Key": "Brave Search API-nøkkel",
|
"Brave Search API Key": "Brave Search API-nøkkel",
|
||||||
"Bypass SSL verification for Websites": "Omgå SSL-verifisering for nettsteder",
|
"Bypass SSL verification for Websites": "Omgå SSL-verifisering for nettsteder",
|
||||||
"Call": "",
|
"Call": "Ring",
|
||||||
"Call feature is not supported when using Web STT engine": "",
|
"Call feature is not supported when using Web STT engine": "Ringefunksjonen støttes ikke når du bruker Web STT-motoren",
|
||||||
"Camera": "",
|
"Camera": "Kamera",
|
||||||
"Cancel": "Avbryt",
|
"Cancel": "Avbryt",
|
||||||
"Capabilities": "Muligheter",
|
"Capabilities": "Muligheter",
|
||||||
"Change Password": "Endre passord",
|
"Change Password": "Endre passord",
|
||||||
"Chat": "Chat",
|
"Chat": "Chat",
|
||||||
"Chat Background Image": "",
|
"Chat Background Image": "Bakgrunnsbilde for chat",
|
||||||
"Chat Bubble UI": "Chat-boble UI",
|
"Chat Bubble UI": "Chat-boble UI",
|
||||||
"Chat Controls": "",
|
"Chat Controls": "Chat-kontroller",
|
||||||
"Chat direction": "Chat-retning",
|
"Chat direction": "Chat-retning",
|
||||||
"Chat History": "Chat-historikk",
|
"Chat History": "Chat-historikk",
|
||||||
"Chat History is off for this browser.": "Chat-historikk er av for denne nettleseren.",
|
"Chat History is off for this browser.": "Chat-historikk er av for denne nettleseren.",
|
||||||
@@ -101,37 +103,37 @@
|
|||||||
"Chunk Params": "Chunk-parametere",
|
"Chunk Params": "Chunk-parametere",
|
||||||
"Chunk Size": "Chunk-størrelse",
|
"Chunk Size": "Chunk-størrelse",
|
||||||
"Citation": "Sitering",
|
"Citation": "Sitering",
|
||||||
"Clear memory": "",
|
"Clear memory": "Tøm minnet",
|
||||||
"Click here for help.": "Klikk her for hjelp.",
|
"Click here for help.": "Klikk her for hjelp.",
|
||||||
"Click here to": "Klikk her for å",
|
"Click here to": "Klikk her for å",
|
||||||
"Click here to download user import template file.": "",
|
"Click here to download user import template file.": "Klikk her for å hente ned importmal for brukere.",
|
||||||
"Click here to select": "Klikk her for å velge",
|
"Click here to select": "Klikk her for å velge",
|
||||||
"Click here to select a csv file.": "Klikk her for å velge en csv-fil.",
|
"Click here to select a csv file.": "Klikk her for å velge en csv-fil.",
|
||||||
"Click here to select a py file.": "",
|
"Click here to select a py file.": "Klikk her for å velge en py-fil.",
|
||||||
"Click here to select documents.": "Klikk her for å velge dokumenter.",
|
"Click here to select documents.": "Klikk her for å velge dokumenter.",
|
||||||
"click here.": "klikk her.",
|
"click here.": "klikk her.",
|
||||||
"Click on the user role button to change a user's role.": "Klikk på brukerrolle-knappen for å endre en brukers rolle.",
|
"Click on the user role button to change a user's role.": "Klikk på brukerrolle-knappen for å endre en brukers rolle.",
|
||||||
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
|
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skrivetilgang til utklippstavlen ble avslått. Kontroller nettleserinnstillingene for å gi nødvendig tillatelse.",
|
||||||
"Clone": "Klon",
|
"Clone": "Klon",
|
||||||
"Close": "Lukk",
|
"Close": "Lukk",
|
||||||
"Code formatted successfully": "",
|
"Code formatted successfully": "Koden ble formatert",
|
||||||
"Collection": "Samling",
|
"Collection": "Samling",
|
||||||
"ComfyUI": "ComfyUI",
|
"ComfyUI": "ComfyUI",
|
||||||
"ComfyUI Base URL": "ComfyUI Grunn-URL",
|
"ComfyUI Base URL": "ComfyUI Grunn-URL",
|
||||||
"ComfyUI Base URL is required.": "ComfyUI Grunn-URL kreves.",
|
"ComfyUI Base URL is required.": "ComfyUI Grunn-URL kreves.",
|
||||||
"Command": "Kommando",
|
"Command": "Kommando",
|
||||||
"Concurrent Requests": "Samtidige forespørsler",
|
"Concurrent Requests": "Samtidige forespørsler",
|
||||||
"Confirm": "",
|
"Confirm": "Bekreft",
|
||||||
"Confirm Password": "Bekreft passord",
|
"Confirm Password": "Bekreft passord",
|
||||||
"Confirm your action": "",
|
"Confirm your action": "Bekreft din handling",
|
||||||
"Connections": "Tilkoblinger",
|
"Connections": "Tilkoblinger",
|
||||||
"Contact Admin for WebUI Access": "",
|
"Contact Admin for WebUI Access": "Kontakt administrator for WebUI-tilgang",
|
||||||
"Content": "Innhold",
|
"Content": "Innhold",
|
||||||
"Content Extraction": "",
|
"Content Extraction": "Uthenting av innhold",
|
||||||
"Context Length": "Kontekstlengde",
|
"Context Length": "Kontekstlengde",
|
||||||
"Continue Response": "Fortsett svar",
|
"Continue Response": "Fortsett svar",
|
||||||
"Continue with {{provider}}": "",
|
"Continue with {{provider}}": "Fortsett med {{provider}}",
|
||||||
"Controls": "",
|
"Controls": "Kontroller",
|
||||||
"Copied shared chat URL to clipboard!": "Kopiert delt chat-URL til utklippstavlen!",
|
"Copied shared chat URL to clipboard!": "Kopiert delt chat-URL til utklippstavlen!",
|
||||||
"Copy": "Kopier",
|
"Copy": "Kopier",
|
||||||
"Copy last code block": "Kopier siste kodeblokk",
|
"Copy last code block": "Kopier siste kodeblokk",
|
||||||
@@ -144,16 +146,16 @@
|
|||||||
"Create new secret key": "Lag ny hemmelig nøkkel",
|
"Create new secret key": "Lag ny hemmelig nøkkel",
|
||||||
"Created at": "Opprettet",
|
"Created at": "Opprettet",
|
||||||
"Created At": "Opprettet",
|
"Created At": "Opprettet",
|
||||||
"Created by": "",
|
"Created by": "Opprettet av",
|
||||||
"CSV Import": "",
|
"CSV Import": "CSV-import",
|
||||||
"Current Model": "Nåværende modell",
|
"Current Model": "Nåværende modell",
|
||||||
"Current Password": "Nåværende passord",
|
"Current Password": "Nåværende passord",
|
||||||
"Custom": "Tilpasset",
|
"Custom": "Tilpasset",
|
||||||
"Customize models for a specific purpose": "Tilpass modeller for et spesifikt formål",
|
"Customize models for a specific purpose": "Tilpass modeller for et spesifikt formål",
|
||||||
"Dark": "Mørk",
|
"Dark": "Mørk",
|
||||||
"Dashboard": "",
|
"Dashboard": "Instrumentbord",
|
||||||
"Database": "Database",
|
"Database": "Database",
|
||||||
"December": "Desember",
|
"December": "desember",
|
||||||
"Default": "Standard",
|
"Default": "Standard",
|
||||||
"Default (Automatic1111)": "Standard (Automatic1111)",
|
"Default (Automatic1111)": "Standard (Automatic1111)",
|
||||||
"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
|
"Default (SentenceTransformers)": "Standard (SentenceTransformers)",
|
||||||
@@ -167,41 +169,42 @@
|
|||||||
"Delete All Chats": "Slett alle chatter",
|
"Delete All Chats": "Slett alle chatter",
|
||||||
"Delete chat": "Slett chat",
|
"Delete chat": "Slett chat",
|
||||||
"Delete Chat": "Slett chat",
|
"Delete Chat": "Slett chat",
|
||||||
"Delete chat?": "",
|
"Delete chat?": "Slett chat?",
|
||||||
"Delete function?": "",
|
"Delete Doc": "Slett dokument",
|
||||||
"Delete prompt?": "",
|
"Delete function?": "Slett funksjon?",
|
||||||
|
"Delete prompt?": "Slett prompt?",
|
||||||
"delete this link": "slett denne lenken",
|
"delete this link": "slett denne lenken",
|
||||||
"Delete tool?": "",
|
"Delete tool?": "Slett verktøy?",
|
||||||
"Delete User": "Slett bruker",
|
"Delete User": "Slett bruker",
|
||||||
"Deleted {{deleteModelTag}}": "Slettet {{deleteModelTag}}",
|
"Deleted {{deleteModelTag}}": "Slettet {{deleteModelTag}}",
|
||||||
"Deleted {{name}}": "Slettet {{name}}",
|
"Deleted {{name}}": "Slettet {{name}}",
|
||||||
"Description": "Beskrivelse",
|
"Description": "Beskrivelse",
|
||||||
"Didn't fully follow instructions": "Fulgte ikke instruksjonene fullt ut",
|
"Didn't fully follow instructions": "Fulgte ikke instruksjonene fullt ut",
|
||||||
"Disabled": "",
|
"Disabled": "Deaktivert",
|
||||||
"Discover a function": "",
|
"Discover a function": "Oppdag en funksjon",
|
||||||
"Discover a model": "Oppdag en modell",
|
"Discover a model": "Oppdag en modell",
|
||||||
"Discover a prompt": "Oppdag en prompt",
|
"Discover a prompt": "Oppdag en prompt",
|
||||||
"Discover a tool": "",
|
"Discover a tool": "Oppdag et verktøy",
|
||||||
"Discover, download, and explore custom functions": "",
|
"Discover, download, and explore custom functions": "Oppdag, last ned og utforsk egendefinerte funksjoner",
|
||||||
"Discover, download, and explore custom prompts": "Oppdag, last ned og utforsk egendefinerte prompts",
|
"Discover, download, and explore custom prompts": "Oppdag, last ned og utforsk egendefinerte prompts",
|
||||||
"Discover, download, and explore custom tools": "",
|
"Discover, download, and explore custom tools": "Oppdag, last ned og utforsk egendefinerte verktøy",
|
||||||
"Discover, download, and explore model presets": "Oppdag, last ned og utforsk modellforhåndsinnstillinger",
|
"Discover, download, and explore model presets": "Oppdag, last ned og utforsk modellforhåndsinnstillinger",
|
||||||
"Dismissible": "",
|
"Dismissible": "Kan lukkes",
|
||||||
"Display Emoji in Call": "",
|
"Display Emoji in Call": "Vis emoji i samtale",
|
||||||
"Display the username instead of You in the Chat": "Vis brukernavnet i stedet for Du i chatten",
|
"Display the username instead of You in the Chat": "Vis brukernavnet i stedet for Du i chatten",
|
||||||
"Do not install functions from sources you do not fully trust.": "",
|
"Do not install functions from sources you do not fully trust.": "Ikke installer funksjoner fra kilder du ikke fullt ut stoler på.",
|
||||||
"Do not install tools from sources you do not fully trust.": "",
|
"Do not install tools from sources you do not fully trust.": "Ikke installer verktøy fra kilder du ikke fullt ut stoler på.",
|
||||||
"Document": "Dokument",
|
"Document": "Dokument",
|
||||||
"Document Settings": "Dokumentinnstillinger",
|
"Document Settings": "Dokumentinnstillinger",
|
||||||
"Documentation": "Dokumentasjon",
|
"Documentation": "Dokumentasjon",
|
||||||
"Documents": "Dokumenter",
|
"Documents": "Dokumenter",
|
||||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "lager ingen eksterne tilkoblinger, og dataene dine forblir trygt på din lokalt hostede server.",
|
"does not make any external connections, and your data stays securely on your locally hosted server.": "har ingen tilkobling til eksterne tjenester, og dataene dine blir værende sikkert på din lokale tjener.",
|
||||||
"Don't Allow": "Ikke tillat",
|
"Don't Allow": "Ikke tillat",
|
||||||
"Don't have an account?": "Har du ikke en konto?",
|
"Don't have an account?": "Har du ikke en konto?",
|
||||||
"don't install random functions from sources you don't trust.": "",
|
"don't install random functions from sources you don't trust.": "ikke installer tilfeldige funksjoner fra kilder du ikke stoler på.",
|
||||||
"don't install random tools from sources you don't trust.": "",
|
"don't install random tools from sources you don't trust.": "ikke installer tilfeldige verktøy fra kilder du ikke stoler på.",
|
||||||
"Don't like the style": "Liker ikke stilen",
|
"Don't like the style": "Liker ikke stilen",
|
||||||
"Done": "",
|
"Done": "Ferdig",
|
||||||
"Download": "Last ned",
|
"Download": "Last ned",
|
||||||
"Download canceled": "Nedlasting avbrutt",
|
"Download canceled": "Nedlasting avbrutt",
|
||||||
"Download Database": "Last ned database",
|
"Download Database": "Last ned database",
|
||||||
@@ -209,8 +212,9 @@
|
|||||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "f.eks. '30s','10m'. Gyldige tidsenheter er 's', 'm', 't'.",
|
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "f.eks. '30s','10m'. Gyldige tidsenheter er 's', 'm', 't'.",
|
||||||
"Edit": "Rediger",
|
"Edit": "Rediger",
|
||||||
"Edit Doc": "Rediger dokument",
|
"Edit Doc": "Rediger dokument",
|
||||||
"Edit Memory": "",
|
"Edit Memory": "Rediger minne",
|
||||||
"Edit User": "Rediger bruker",
|
"Edit User": "Rediger bruker",
|
||||||
|
"ElevenLabs": "ElevenLabs",
|
||||||
"Email": "E-post",
|
"Email": "E-post",
|
||||||
"Embedding Batch Size": "Batch-størrelse for embedding",
|
"Embedding Batch Size": "Batch-størrelse for embedding",
|
||||||
"Embedding Model": "Embedding-modell",
|
"Embedding Model": "Embedding-modell",
|
||||||
@@ -220,12 +224,12 @@
|
|||||||
"Enable Community Sharing": "Aktiver deling i fellesskap",
|
"Enable Community Sharing": "Aktiver deling i fellesskap",
|
||||||
"Enable New Sign Ups": "Aktiver nye registreringer",
|
"Enable New Sign Ups": "Aktiver nye registreringer",
|
||||||
"Enable Web Search": "Aktiver websøk",
|
"Enable Web Search": "Aktiver websøk",
|
||||||
"Enabled": "",
|
"Enabled": "Aktivert",
|
||||||
"Engine": "",
|
"Engine": "Motor",
|
||||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at CSV-filen din inkluderer 4 kolonner i denne rekkefølgen: Navn, E-post, Passord, Rolle.",
|
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at CSV-filen din inkluderer 4 kolonner i denne rekkefølgen: Navn, E-post, Passord, Rolle.",
|
||||||
"Enter {{role}} message here": "Skriv inn {{role}} melding her",
|
"Enter {{role}} message here": "Skriv inn {{role}} melding her",
|
||||||
"Enter a detail about yourself for your LLMs to recall": "Skriv inn en detalj om deg selv som LLM-ene dine kan huske",
|
"Enter a detail about yourself for your LLMs to recall": "Skriv inn en detalj om deg selv som språkmodellene dine kan huske",
|
||||||
"Enter api auth string (e.g. username:password)": "",
|
"Enter api auth string (e.g. username:password)": "Skriv inn api-autentiseringsstreng (f.eks. brukernavn:passord)",
|
||||||
"Enter Brave Search API Key": "Skriv inn Brave Search API-nøkkel",
|
"Enter Brave Search API Key": "Skriv inn Brave Search API-nøkkel",
|
||||||
"Enter Chunk Overlap": "Skriv inn Chunk Overlap",
|
"Enter Chunk Overlap": "Skriv inn Chunk Overlap",
|
||||||
"Enter Chunk Size": "Skriv inn Chunk-størrelse",
|
"Enter Chunk Size": "Skriv inn Chunk-størrelse",
|
||||||
@@ -239,18 +243,18 @@
|
|||||||
"Enter Score": "Skriv inn poengsum",
|
"Enter Score": "Skriv inn poengsum",
|
||||||
"Enter Searxng Query URL": "Skriv inn Searxng forespørsels-URL",
|
"Enter Searxng Query URL": "Skriv inn Searxng forespørsels-URL",
|
||||||
"Enter Serper API Key": "Skriv inn Serper API-nøkkel",
|
"Enter Serper API Key": "Skriv inn Serper API-nøkkel",
|
||||||
"Enter Serply API Key": "",
|
"Enter Serply API Key": "Skriv inn Serply API-nøkkel",
|
||||||
"Enter Serpstack API Key": "Skriv inn Serpstack API-nøkkel",
|
"Enter Serpstack API Key": "Skriv inn Serpstack API-nøkkel",
|
||||||
"Enter stop sequence": "Skriv inn stoppsekvens",
|
"Enter stop sequence": "Skriv inn stoppsekvens",
|
||||||
"Enter system prompt": "",
|
"Enter system prompt": "Skriv inn systemprompt",
|
||||||
"Enter Tavily API Key": "",
|
"Enter Tavily API Key": "Skriv inn Tavily API-nøkkel",
|
||||||
"Enter Tika Server URL": "",
|
"Enter Tika Server URL": "Skriv inn Tika Server-URL",
|
||||||
"Enter Top K": "Skriv inn Top K",
|
"Enter Top K": "Skriv inn Top K",
|
||||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Skriv inn URL (f.eks. http://127.0.0.1:7860/)",
|
"Enter URL (e.g. http://127.0.0.1:7860/)": "Skriv inn URL (f.eks. http://127.0.0.1:7860/)",
|
||||||
"Enter URL (e.g. http://localhost:11434)": "Skriv inn URL (f.eks. http://localhost:11434)",
|
"Enter URL (e.g. http://localhost:11434)": "Skriv inn URL (f.eks. http://localhost:11434)",
|
||||||
"Enter Your Email": "Skriv inn din e-post",
|
"Enter Your Email": "Skriv inn din e-post",
|
||||||
"Enter Your Full Name": "Skriv inn ditt fulle navn",
|
"Enter Your Full Name": "Skriv inn ditt fulle navn",
|
||||||
"Enter your message": "",
|
"Enter your message": "Skriv inn meldingen din",
|
||||||
"Enter Your Password": "Skriv inn ditt passord",
|
"Enter Your Password": "Skriv inn ditt passord",
|
||||||
"Enter Your Role": "Skriv inn din rolle",
|
"Enter Your Role": "Skriv inn din rolle",
|
||||||
"Error": "Feil",
|
"Error": "Feil",
|
||||||
@@ -260,50 +264,50 @@
|
|||||||
"Export chat (.json)": "Eksporter chat (.json)",
|
"Export chat (.json)": "Eksporter chat (.json)",
|
||||||
"Export Chats": "Eksporter chatter",
|
"Export Chats": "Eksporter chatter",
|
||||||
"Export Documents Mapping": "Eksporter dokumentkartlegging",
|
"Export Documents Mapping": "Eksporter dokumentkartlegging",
|
||||||
"Export Functions": "",
|
"Export Functions": "Eksporter funksjoner",
|
||||||
"Export LiteLLM config.yaml": "",
|
"Export LiteLLM config.yaml": "Eksporter LiteLLM config.yaml",
|
||||||
"Export Models": "Eksporter modeller",
|
"Export Models": "Eksporter modeller",
|
||||||
"Export Prompts": "Eksporter prompts",
|
"Export Prompts": "Eksporter prompts",
|
||||||
"Export Tools": "",
|
"Export Tools": "Eksporter verktøy",
|
||||||
"External Models": "",
|
"External Models": "Eksterne modeller",
|
||||||
"Failed to create API Key.": "Kunne ikke opprette API-nøkkel.",
|
"Failed to create API Key.": "Kunne ikke opprette API-nøkkel.",
|
||||||
"Failed to read clipboard contents": "Kunne ikke lese utklippstavleinnhold",
|
"Failed to read clipboard contents": "Kunne ikke lese utklippstavleinnhold",
|
||||||
"Failed to update settings": "Kunne ikke oppdatere innstillinger",
|
"Failed to update settings": "Kunne ikke oppdatere innstillinger",
|
||||||
"February": "Februar",
|
"February": "februar",
|
||||||
"Feel free to add specific details": "Føl deg fri til å legge til spesifikke detaljer",
|
"Feel free to add specific details": "Legg gjerne til spesifikke detaljer",
|
||||||
"File": "",
|
"File": "Fil",
|
||||||
"File Mode": "Filmodus",
|
"File Mode": "Filmodus",
|
||||||
"File not found.": "Fil ikke funnet.",
|
"File not found.": "Fil ikke funnet.",
|
||||||
"Files": "",
|
"Files": "Filer",
|
||||||
"Filter is now globally disabled": "",
|
"Filter is now globally disabled": "Filteret er nå deaktivert på systemnivå",
|
||||||
"Filter is now globally enabled": "",
|
"Filter is now globally enabled": "Filteret er nå aktivert på systemnivå",
|
||||||
"Filters": "",
|
"Filters": "Filtere",
|
||||||
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingeravtrykk-spoofing oppdaget: Kan ikke bruke initialer som avatar. Bruker standard profilbilde.",
|
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingeravtrykk-spoofing oppdaget: Kan ikke bruke initialer som avatar. Bruker standard profilbilde.",
|
||||||
"Fluidly stream large external response chunks": "Strøm store eksterne svarchunks flytende",
|
"Fluidly stream large external response chunks": "Flytende strømming av store eksterne responsbiter",
|
||||||
"Focus chat input": "Fokuser chatinput",
|
"Focus chat input": "Fokuser chatinput",
|
||||||
"Followed instructions perfectly": "Fulgte instruksjonene perfekt",
|
"Followed instructions perfectly": "Fulgte instruksjonene perfekt",
|
||||||
"Form": "",
|
"Form": "Form",
|
||||||
"Format your variables using square brackets like this:": "Formatér variablene dine med hakeparenteser som dette:",
|
"Format your variables using square brackets like this:": "Formatér variablene dine med hakeparenteser som dette:",
|
||||||
"Frequency Penalty": "Frekvensstraff",
|
"Frequency Penalty": "Frekvensstraff",
|
||||||
"Function created successfully": "",
|
"Function created successfully": "Funksjonen ble opprettet",
|
||||||
"Function deleted successfully": "",
|
"Function deleted successfully": "Funksjonen ble slettet",
|
||||||
"Function Description (e.g. A filter to remove profanity from text)": "",
|
"Function Description (e.g. A filter to remove profanity from text)": "Funksjonsbeskrivelse (f.eks. Et filter for å fjerne banning fra tekst)",
|
||||||
"Function ID (e.g. my_filter)": "",
|
"Function ID (e.g. my_filter)": "Funksjons-id (f.eks. my_filter)",
|
||||||
"Function is now globally disabled": "",
|
"Function is now globally disabled": "Funksjonen er nå deaktivert på systemnivå",
|
||||||
"Function is now globally enabled": "",
|
"Function is now globally enabled": "Funksjonen er nå aktivert på systemnivå",
|
||||||
"Function Name (e.g. My Filter)": "",
|
"Function Name (e.g. My Filter)": "Funksjonsnavn (f.eks. Mitt Filter)",
|
||||||
"Function updated successfully": "",
|
"Function updated successfully": "Funksjonen ble oppdatert",
|
||||||
"Functions": "",
|
"Functions": "Funksjoner",
|
||||||
"Functions allow arbitrary code execution": "",
|
"Functions allow arbitrary code execution": "Funksjoner tillater vilkårlig kodeeksekvering",
|
||||||
"Functions allow arbitrary code execution.": "",
|
"Functions allow arbitrary code execution.": "Funksjoner tillater vilkårlig kodeeksekvering.",
|
||||||
"Functions imported successfully": "",
|
"Functions imported successfully": "Funksjoner importert",
|
||||||
"General": "Generelt",
|
"General": "Generelt",
|
||||||
"General Settings": "Generelle innstillinger",
|
"General Settings": "Generelle innstillinger",
|
||||||
"Generate Image": "",
|
"Generate Image": "Generer bilde",
|
||||||
"Generating search query": "Genererer søkeforespørsel",
|
"Generating search query": "Genererer søkeforespørsel",
|
||||||
"Generation Info": "Generasjonsinfo",
|
"Generation Info": "Generasjonsinfo",
|
||||||
"Get up and running with": "",
|
"Get up and running with": "Kom i gang med",
|
||||||
"Global": "",
|
"Global": "Systemnivå",
|
||||||
"Good Response": "Godt svar",
|
"Good Response": "Godt svar",
|
||||||
"Google PSE API Key": "Google PSE API-nøkkel",
|
"Google PSE API Key": "Google PSE API-nøkkel",
|
||||||
"Google PSE Engine Id": "Google PSE Motor-ID",
|
"Google PSE Engine Id": "Google PSE Motor-ID",
|
||||||
@@ -312,84 +316,84 @@
|
|||||||
"Hello, {{name}}": "Hei, {{name}}",
|
"Hello, {{name}}": "Hei, {{name}}",
|
||||||
"Help": "Hjelp",
|
"Help": "Hjelp",
|
||||||
"Hide": "Skjul",
|
"Hide": "Skjul",
|
||||||
"Hide Model": "",
|
"Hide Model": "Skjul modell",
|
||||||
"How can I help you today?": "Hvordan kan jeg hjelpe deg i dag?",
|
"How can I help you today?": "Hvordan kan jeg hjelpe deg i dag?",
|
||||||
"Hybrid Search": "Hybrid-søk",
|
"Hybrid Search": "Hybrid-søk",
|
||||||
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
|
"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Jeg bekrefter at jeg har lest og forstår konsekvensene av min handling. Jeg er klar over risikoen forbundet med å kjøre vilkårlig kode, og jeg har verifisert kildens pålitelighet.",
|
||||||
"Image Generation (Experimental)": "Bildegenerering (Eksperimentell)",
|
"Image Generation (Experimental)": "Bildegenerering (Eksperimentell)",
|
||||||
"Image Generation Engine": "Bildegenereringsmotor",
|
"Image Generation Engine": "Bildegenereringsmotor",
|
||||||
"Image Settings": "Bildeinnstillinger",
|
"Image Settings": "Bildeinnstillinger",
|
||||||
"Images": "Bilder",
|
"Images": "Bilder",
|
||||||
"Import Chats": "Importer chatter",
|
"Import Chats": "Importer chatter",
|
||||||
"Import Documents Mapping": "Importer dokumentkartlegging",
|
"Import Documents Mapping": "Importer dokumentkartlegging",
|
||||||
"Import Functions": "",
|
"Import Functions": "Funksjoner",
|
||||||
"Import Models": "Importer modeller",
|
"Import Models": "Importer modeller",
|
||||||
"Import Prompts": "Importer prompts",
|
"Import Prompts": "Importer prompts",
|
||||||
"Import Tools": "",
|
"Import Tools": "Importer verktøy",
|
||||||
"Include `--api-auth` flag when running stable-diffusion-webui": "",
|
"Include `--api-auth` flag when running stable-diffusion-webui": "Inkluder `--api-auth`-flagget når du kjører stable-diffusion-webui",
|
||||||
"Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api`-flagget når du kjører stable-diffusion-webui",
|
"Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api`-flagget når du kjører stable-diffusion-webui",
|
||||||
"Info": "Info",
|
"Info": "Info",
|
||||||
"Input commands": "Inntast kommandoer",
|
"Input commands": "Inntast kommandoer",
|
||||||
"Install from Github URL": "Installer fra Github-URL",
|
"Install from Github URL": "Installer fra Github-URL",
|
||||||
"Instant Auto-Send After Voice Transcription": "",
|
"Instant Auto-Send After Voice Transcription": "Direkte autosending etter stemmegjenkjenning",
|
||||||
"Interface": "Grensesnitt",
|
"Interface": "Grensesnitt",
|
||||||
"Invalid Tag": "Ugyldig tag",
|
"Invalid Tag": "Ugyldig tag",
|
||||||
"January": "Januar",
|
"January": "januar",
|
||||||
"join our Discord for help.": "bli med i vår Discord for hjelp.",
|
"join our Discord for help.": "bli med i vår Discord for hjelp.",
|
||||||
"JSON": "JSON",
|
"JSON": "JSON",
|
||||||
"JSON Preview": "JSON-forhåndsvisning",
|
"JSON Preview": "JSON-forhåndsvisning",
|
||||||
"July": "Juli",
|
"July": "juli",
|
||||||
"June": "Juni",
|
"June": "juni",
|
||||||
"JWT Expiration": "JWT-utløp",
|
"JWT Expiration": "JWT-utløp",
|
||||||
"JWT Token": "JWT-token",
|
"JWT Token": "JWT-token",
|
||||||
"Keep Alive": "Hold i live",
|
"Keep Alive": "Hold i live",
|
||||||
"Keyboard shortcuts": "Hurtigtaster",
|
"Keyboard shortcuts": "Hurtigtaster",
|
||||||
"Knowledge": "",
|
"Knowledge": "Kunnskap",
|
||||||
"Language": "Språk",
|
"Language": "Språk",
|
||||||
"large language models, locally.": "",
|
"large language models, locally.": "Store språkmodeller, lokalt.",
|
||||||
"Last Active": "Sist aktiv",
|
"Last Active": "Sist aktiv",
|
||||||
"Last Modified": "",
|
"Last Modified": "Sist endret",
|
||||||
"Light": "Lys",
|
"Light": "Lys",
|
||||||
"Listening...": "",
|
"Listening...": "Lytter ...",
|
||||||
"LLMs can make mistakes. Verify important information.": "LLM-er kan gjøre feil. Verifiser viktig informasjon.",
|
"LLMs can make mistakes. Verify important information.": "Språkmodeller kan gjøre feil. Verifiser viktige opplysninger.",
|
||||||
"Local Models": "",
|
"Local Models": "Lokale modeller",
|
||||||
"LTR": "LTR",
|
"LTR": "LTR",
|
||||||
"Made by OpenWebUI Community": "Laget av OpenWebUI-fellesskapet",
|
"Made by OpenWebUI Community": "Laget av OpenWebUI-fellesskapet",
|
||||||
"Make sure to enclose them with": "Sørg for å omslutte dem med",
|
"Make sure to enclose them with": "Sørg for å omslutte dem med",
|
||||||
"Manage": "",
|
"Manage": "Administrer",
|
||||||
"Manage Models": "Administrer modeller",
|
"Manage Models": "Administrer modeller",
|
||||||
"Manage Ollama Models": "Administrer Ollama-modeller",
|
"Manage Ollama Models": "Administrer Ollama-modeller",
|
||||||
"Manage Pipelines": "Administrer pipelines",
|
"Manage Pipelines": "Administrer pipelines",
|
||||||
"Manage Valves": "",
|
"March": "mars",
|
||||||
"March": "Mars",
|
|
||||||
"Max Tokens (num_predict)": "Maks antall tokens (num_predict)",
|
"Max Tokens (num_predict)": "Maks antall tokens (num_predict)",
|
||||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalt 3 modeller kan lastes ned samtidig. Vennligst prøv igjen senere.",
|
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalt 3 modeller kan lastes ned samtidig. Vennligst prøv igjen senere.",
|
||||||
"May": "Mai",
|
"May": "mai",
|
||||||
"Memories accessible by LLMs will be shown here.": "Minner tilgjengelige for LLM-er vil vises her.",
|
"Memories accessible by LLMs will be shown here.": "Minner tilgjengelige for språkmodeller vil vises her.",
|
||||||
"Memory": "Minne",
|
"Memory": "Minne",
|
||||||
"Memory added successfully": "",
|
"Memory added successfully": "Minne lagt til",
|
||||||
"Memory cleared successfully": "",
|
"Memory cleared successfully": "Minne tømt",
|
||||||
"Memory deleted successfully": "",
|
"Memory deleted successfully": "Minne slettet",
|
||||||
"Memory updated successfully": "",
|
"Memory updated successfully": "Minne oppdatert",
|
||||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Meldinger du sender etter at du har opprettet lenken din vil ikke bli delt. Brukere med URL-en vil kunne se den delte chatten.",
|
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Meldinger du sender etter at du har opprettet lenken din vil ikke bli delt. Brukere med URL-en vil kunne se den delte chatten.",
|
||||||
|
"Min P": "",
|
||||||
"Minimum Score": "Minimum poengsum",
|
"Minimum Score": "Minimum poengsum",
|
||||||
"Mirostat": "Mirostat",
|
"Mirostat": "Mirostat",
|
||||||
"Mirostat Eta": "Mirostat Eta",
|
"Mirostat Eta": "Mirostat Eta",
|
||||||
"Mirostat Tau": "Mirostat Tau",
|
"Mirostat Tau": "Mirostat Tau",
|
||||||
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
"MMMM DD, YYYY": "MMMM DD, YYYY",
|
||||||
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
|
||||||
"MMMM DD, YYYY hh:mm:ss A": "",
|
"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
|
||||||
"Model '{{modelName}}' has been successfully downloaded.": "Modellen '{{modelName}}' er lastet ned.",
|
"Model '{{modelName}}' has been successfully downloaded.": "Modellen '{{modelName}}' er lastet ned.",
|
||||||
"Model '{{modelTag}}' is already in queue for downloading.": "Modellen '{{modelTag}}' er allerede i nedlastingskøen.",
|
"Model '{{modelTag}}' is already in queue for downloading.": "Modellen '{{modelTag}}' er allerede i nedlastingskøen.",
|
||||||
"Model {{modelId}} not found": "Modellen {{modelId}} ble ikke funnet",
|
"Model {{modelId}} not found": "Modellen {{modelId}} ble ikke funnet",
|
||||||
"Model {{modelName}} is not vision capable": "Modellen {{modelName}} er ikke visjonsdyktig",
|
"Model {{modelName}} is not vision capable": "Modellen {{modelName}} er ikke visjonsdyktig",
|
||||||
"Model {{name}} is now {{status}}": "Modellen {{name}} er nå {{status}}",
|
"Model {{name}} is now {{status}}": "Modellen {{name}} er nå {{status}}",
|
||||||
"Model created successfully!": "",
|
"Model created successfully!": "Modellen ble opprettet!",
|
||||||
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modellens filsystemsti oppdaget. Modellens kortnavn er påkrevd for oppdatering, kan ikke fortsette.",
|
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modellens filsystemsti oppdaget. Modellens kortnavn er påkrevd for oppdatering, kan ikke fortsette.",
|
||||||
"Model ID": "Modell-ID",
|
"Model ID": "Modell-ID",
|
||||||
"Model not selected": "Modell ikke valgt",
|
"Model not selected": "Modell ikke valgt",
|
||||||
"Model Params": "Modellparametere",
|
"Model Params": "Modellparametere",
|
||||||
"Model updated successfully": "",
|
"Model updated successfully": "Modell oppdatert",
|
||||||
"Model Whitelisting": "Modell hvitlisting",
|
"Model Whitelisting": "Modell hvitlisting",
|
||||||
"Model(s) Whitelisted": "Modell(er) hvitlistet",
|
"Model(s) Whitelisted": "Modell(er) hvitlistet",
|
||||||
"Modelfile Content": "Modellfilinnhold",
|
"Modelfile Content": "Modellfilinnhold",
|
||||||
@@ -400,39 +404,39 @@
|
|||||||
"Name your model": "Gi modellen din et navn",
|
"Name your model": "Gi modellen din et navn",
|
||||||
"New Chat": "Ny chat",
|
"New Chat": "Ny chat",
|
||||||
"New Password": "Nytt passord",
|
"New Password": "Nytt passord",
|
||||||
"No content to speak": "",
|
"No content to speak": "Mangler innhold for tale",
|
||||||
"No documents found": "",
|
"No documents found": "Ingen dokumenter funnet",
|
||||||
"No file selected": "",
|
"No file selected": "Ingen fil valgt",
|
||||||
"No results found": "Ingen resultater funnet",
|
"No results found": "Ingen resultater funnet",
|
||||||
"No search query generated": "Ingen søkeforespørsel generert",
|
"No search query generated": "Ingen søkeforespørsel generert",
|
||||||
"No source available": "Ingen kilde tilgjengelig",
|
"No source available": "Ingen kilde tilgjengelig",
|
||||||
"No valves to update": "",
|
"No valves to update": "Ingen ventiler å oppdatere",
|
||||||
"None": "Ingen",
|
"None": "Ingen",
|
||||||
"Not factually correct": "Ikke faktuelt korrekt",
|
"Not factually correct": "Uriktig informasjon",
|
||||||
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du setter en minimums poengsum, vil søket kun returnere dokumenter med en poengsum som er større enn eller lik minimums poengsummen.",
|
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du setter en minimums poengsum, vil søket kun returnere dokumenter med en poengsum som er større enn eller lik minimums poengsummen.",
|
||||||
"Notifications": "Varsler",
|
"Notifications": "Varsler",
|
||||||
"November": "November",
|
"November": "november",
|
||||||
"num_thread (Ollama)": "num_thread (Ollama)",
|
"num_thread (Ollama)": "num_thread (Ollama)",
|
||||||
"OAuth ID": "",
|
"OAuth ID": "OAuth-ID",
|
||||||
"October": "Oktober",
|
"October": "oktober",
|
||||||
"Off": "Av",
|
"Off": "Av",
|
||||||
"Okay, Let's Go!": "Ok, la oss gå!",
|
"Okay, Let's Go!": "Ok, la oss gå!",
|
||||||
"OLED Dark": "OLED mørk",
|
"OLED Dark": "OLED mørk",
|
||||||
"Ollama": "Ollama",
|
"Ollama": "Ollama",
|
||||||
"Ollama API": "Ollama API",
|
"Ollama API": "Ollama API",
|
||||||
"Ollama API disabled": "Ollama API deaktivert",
|
"Ollama API disabled": "Ollama API deaktivert",
|
||||||
"Ollama API is disabled": "",
|
"Ollama API is disabled": "Ollama API er deaktivert",
|
||||||
"Ollama Version": "Ollama versjon",
|
"Ollama Version": "Ollama versjon",
|
||||||
"On": "På",
|
"On": "På",
|
||||||
"Only": "Kun",
|
"Only": "Kun",
|
||||||
"Only alphanumeric characters and hyphens are allowed in the command string.": "Kun alfanumeriske tegn og bindestreker er tillatt i kommandostrengen.",
|
"Only alphanumeric characters and hyphens are allowed in the command string.": "Kun alfanumeriske tegn og bindestreker er tillatt i kommandostrengen.",
|
||||||
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oops! Hold deg fast! Filene dine er fortsatt i prosesseringsovnen. Vi tilbereder dem til perfeksjon. Vennligst vær tålmodig, vi gir beskjed når de er klare.",
|
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Oops! Hold deg fast! Filene dine er fortsatt i prosesseringsovnen. Vi tilbereder dem til perfeksjon. Vennligst vær tålmodig, vi gir beskjed når de er klare.",
|
||||||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Ser ut som URL-en er ugyldig. Vennligst dobbeltsjekk og prøv igjen.",
|
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! Ser ut som URL-en er ugyldig. Vennligst dobbeltsjekk og prøv igjen.",
|
||||||
"Oops! There was an error in the previous response. Please try again or contact admin.": "",
|
"Oops! There was an error in the previous response. Please try again or contact admin.": "Oops! Det oppstod en feil i forrige svar. Prøv igjen eller kontakt administrator",
|
||||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Du bruker en ikke-støttet metode (kun frontend). Vennligst server WebUI fra backend.",
|
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! Du bruker en ikke-støttet metode (kun frontend). Vennligst server WebUI fra backend.",
|
||||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||||
"Open new chat": "Åpne ny chat",
|
"Open new chat": "Åpne ny chat",
|
||||||
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "",
|
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI-versjon (v{{OPEN_WEBUI_VERSION}}) er lavere enn nødvendig versjon (v{{REQUIRED_VERSION}})",
|
||||||
"OpenAI": "OpenAI",
|
"OpenAI": "OpenAI",
|
||||||
"OpenAI API": "OpenAI API",
|
"OpenAI API": "OpenAI API",
|
||||||
"OpenAI API Config": "OpenAI API-konfigurasjon",
|
"OpenAI API Config": "OpenAI API-konfigurasjon",
|
||||||
@@ -444,20 +448,20 @@
|
|||||||
"PDF document (.pdf)": "PDF-dokument (.pdf)",
|
"PDF document (.pdf)": "PDF-dokument (.pdf)",
|
||||||
"PDF Extract Images (OCR)": "PDF-ekstraktbilder (OCR)",
|
"PDF Extract Images (OCR)": "PDF-ekstraktbilder (OCR)",
|
||||||
"pending": "avventer",
|
"pending": "avventer",
|
||||||
"Permission denied when accessing media devices": "",
|
"Permission denied when accessing media devices": "Tillatelse nektet ved tilgang til medieenheter",
|
||||||
"Permission denied when accessing microphone": "",
|
"Permission denied when accessing microphone": "Tillatelse nektet ved tilgang til mikrofon",
|
||||||
"Permission denied when accessing microphone: {{error}}": "Tillatelse nektet ved tilgang til mikrofon: {{error}}",
|
"Permission denied when accessing microphone: {{error}}": "Tillatelse nektet ved tilgang til mikrofon: {{error}}",
|
||||||
"Personalization": "Personalisering",
|
"Personalization": "Personalisering",
|
||||||
"Pin": "",
|
"Pin": "Fest",
|
||||||
"Pinned": "",
|
"Pinned": "Festet",
|
||||||
"Pipeline deleted successfully": "",
|
"Pipeline deleted successfully": "Pipeline slettet",
|
||||||
"Pipeline downloaded successfully": "",
|
"Pipeline downloaded successfully": "Pipeline lastet ned",
|
||||||
"Pipelines": "Pipelines",
|
"Pipelines": "Pipelines",
|
||||||
"Pipelines Not Detected": "",
|
"Pipelines Not Detected": "Pipelines ikke oppdaget",
|
||||||
"Pipelines Valves": "Pipeline-ventiler",
|
"Pipelines Valves": "Pipeline-ventiler",
|
||||||
"Plain text (.txt)": "Ren tekst (.txt)",
|
"Plain text (.txt)": "Ren tekst (.txt)",
|
||||||
"Playground": "Lekeplass",
|
"Playground": "Lekeplass",
|
||||||
"Please carefully review the following warnings:": "",
|
"Please carefully review the following warnings:": "Vær vennlig å lese gjennom følgende advarsler grundig:",
|
||||||
"Positive attitude": "Positiv holdning",
|
"Positive attitude": "Positiv holdning",
|
||||||
"Previous 30 days": "Forrige 30 dager",
|
"Previous 30 days": "Forrige 30 dager",
|
||||||
"Previous 7 days": "Forrige 7 dager",
|
"Previous 7 days": "Forrige 7 dager",
|
||||||
@@ -474,7 +478,7 @@
|
|||||||
"Read Aloud": "Les høyt",
|
"Read Aloud": "Les høyt",
|
||||||
"Record voice": "Ta opp stemme",
|
"Record voice": "Ta opp stemme",
|
||||||
"Redirecting you to OpenWebUI Community": "Omdirigerer deg til OpenWebUI-fellesskapet",
|
"Redirecting you to OpenWebUI Community": "Omdirigerer deg til OpenWebUI-fellesskapet",
|
||||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Omtal deg selv som \"Bruker\" (f.eks. \"Bruker lærer spansk\")",
|
||||||
"Refused when it shouldn't have": "Avvist når det ikke skulle ha vært det",
|
"Refused when it shouldn't have": "Avvist når det ikke skulle ha vært det",
|
||||||
"Regenerate": "Regenerer",
|
"Regenerate": "Regenerer",
|
||||||
"Release Notes": "Utgivelsesnotater",
|
"Release Notes": "Utgivelsesnotater",
|
||||||
@@ -486,61 +490,63 @@
|
|||||||
"Reranking Model": "Reranking-modell",
|
"Reranking Model": "Reranking-modell",
|
||||||
"Reranking model disabled": "Reranking-modell deaktivert",
|
"Reranking model disabled": "Reranking-modell deaktivert",
|
||||||
"Reranking model set to \"{{reranking_model}}\"": "Reranking-modell satt til \"{{reranking_model}}\"",
|
"Reranking model set to \"{{reranking_model}}\"": "Reranking-modell satt til \"{{reranking_model}}\"",
|
||||||
"Reset": "",
|
"Reset": "Tilbakestill",
|
||||||
"Reset Upload Directory": "",
|
"Reset Upload Directory": "Tilbakestill opplastingskatalog",
|
||||||
"Reset Vector Storage": "Tilbakestill vektorlagring",
|
"Reset Vector Storage": "Tilbakestill vektorlagring",
|
||||||
"Response AutoCopy to Clipboard": "Respons auto-kopi til utklippstavle",
|
"Response AutoCopy to Clipboard": "Respons auto-kopi til utklippstavle",
|
||||||
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
|
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Respons-varsler kan ikke aktiveres da nettstedsrettighetene er nektet. Vennligst se nettleserinnstillingene dine for å gi nødvendig tilgang.",
|
||||||
"Role": "Rolle",
|
"Role": "Rolle",
|
||||||
"Rosé Pine": "Rosé Pine",
|
"Rosé Pine": "Rosé Pine",
|
||||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||||
"RTL": "RTL",
|
"RTL": "RTL",
|
||||||
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
|
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "Kjør Llama 2, Code Llama og andre modeller. Tilpass og lag egne versjoner.",
|
||||||
"Running": "",
|
"Running": "Kjører",
|
||||||
"Save": "Lagre",
|
"Save": "Lagre",
|
||||||
"Save & Create": "Lagre og opprett",
|
"Save & Create": "Lagre og opprett",
|
||||||
"Save & Update": "Lagre og oppdater",
|
"Save & Update": "Lagre og oppdater",
|
||||||
|
"Save Tag": "Lagre tag",
|
||||||
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Lagring av chatlogger direkte til nettleserens lagring støttes ikke lenger. Vennligst ta et øyeblikk for å laste ned og slette chatloggene dine ved å klikke på knappen nedenfor. Ikke bekymre deg, du kan enkelt re-importere chatloggene dine til backend via",
|
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Lagring av chatlogger direkte til nettleserens lagring støttes ikke lenger. Vennligst ta et øyeblikk for å laste ned og slette chatloggene dine ved å klikke på knappen nedenfor. Ikke bekymre deg, du kan enkelt re-importere chatloggene dine til backend via",
|
||||||
"Scan": "Skann",
|
"Scan": "Skann",
|
||||||
"Scan complete!": "Skanning fullført!",
|
"Scan complete!": "Skanning fullført!",
|
||||||
"Scan for documents from {{path}}": "Skann etter dokumenter fra {{path}}",
|
"Scan for documents from {{path}}": "Skann etter dokumenter fra {{path}}",
|
||||||
|
"Scroll to bottom when switching between branches": "",
|
||||||
"Search": "Søk",
|
"Search": "Søk",
|
||||||
"Search a model": "Søk en modell",
|
"Search a model": "Søk en modell",
|
||||||
"Search Chats": "Søk chatter",
|
"Search Chats": "Søk chatter",
|
||||||
"Search Documents": "Søk dokumenter",
|
"Search Documents": "Søk dokumenter",
|
||||||
"Search Functions": "",
|
"Search Functions": "Søk funksjoner",
|
||||||
"Search Models": "Søk modeller",
|
"Search Models": "Søk modeller",
|
||||||
"Search Prompts": "Søk prompter",
|
"Search Prompts": "Søk prompter",
|
||||||
"Search Query Generation Prompt": "",
|
"Search Query Generation Prompt": "Instruksjon for å lage søkeord",
|
||||||
"Search Query Generation Prompt Length Threshold": "",
|
"Search Query Generation Prompt Length Threshold": "Lengdegrense for prompt til generering av søkeforespørsel",
|
||||||
"Search Result Count": "Antall søkeresultater",
|
"Search Result Count": "Antall søkeresultater",
|
||||||
"Search Tools": "",
|
"Search Tools": "Søkeverktøy",
|
||||||
"Searched {{count}} sites_one": "Søkte på {{count}} side",
|
"Searched {{count}} sites_one": "Søkte på {{count}} side",
|
||||||
"Searched {{count}} sites_other": "Søkte på {{count}} sider",
|
"Searched {{count}} sites_other": "Søkte på {{count}} sider",
|
||||||
"Searching \"{{searchQuery}}\"": "",
|
"Searching \"{{searchQuery}}\"": "Søker etter \"{{searchQuery}}\"",
|
||||||
"Searxng Query URL": "Searxng forespørsels-URL",
|
"Searxng Query URL": "Searxng forespørsels-URL",
|
||||||
"See readme.md for instructions": "Se readme.md for instruksjoner",
|
"See readme.md for instructions": "Se readme.md for instruksjoner",
|
||||||
"See what's new": "Se hva som er nytt",
|
"See what's new": "Se hva som er nytt",
|
||||||
"Seed": "Seed",
|
"Seed": "Seed",
|
||||||
"Select a base model": "Velg en grunnmodell",
|
"Select a base model": "Velg en grunnmodell",
|
||||||
"Select a engine": "",
|
"Select a engine": "Velg en motor",
|
||||||
"Select a function": "",
|
"Select a function": "Velg en funksjon",
|
||||||
"Select a mode": "Velg en modus",
|
"Select a mode": "Velg en modus",
|
||||||
"Select a model": "Velg en modell",
|
"Select a model": "Velg en modell",
|
||||||
"Select a pipeline": "Velg en pipeline",
|
"Select a pipeline": "Velg en pipeline",
|
||||||
"Select a pipeline url": "Velg en pipeline-URL",
|
"Select a pipeline url": "Velg en pipeline-URL",
|
||||||
"Select a tool": "",
|
"Select a tool": "Velg et verktøy",
|
||||||
"Select an Ollama instance": "Velg en Ollama-instans",
|
"Select an Ollama instance": "Velg en Ollama-instans",
|
||||||
"Select Documents": "",
|
"Select Documents": "Velg dokumenter",
|
||||||
"Select model": "Velg modell",
|
"Select model": "Velg modell",
|
||||||
"Select only one model to call": "",
|
"Select only one model to call": "Velg kun én modell å kalle",
|
||||||
"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
|
"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
|
||||||
"Send": "Send",
|
"Send": "Send",
|
||||||
"Send a Message": "Send en melding",
|
"Send a Message": "Send en melding",
|
||||||
"Send message": "Send melding",
|
"Send message": "Send melding",
|
||||||
"September": "September",
|
"September": "september",
|
||||||
"Serper API Key": "Serper API-nøkkel",
|
"Serper API Key": "Serper API-nøkkel",
|
||||||
"Serply API Key": "",
|
"Serply API Key": "Serply API-nøkkel",
|
||||||
"Serpstack API Key": "Serpstack API-nøkkel",
|
"Serpstack API Key": "Serpstack API-nøkkel",
|
||||||
"Server connection verified": "Servertilkobling bekreftet",
|
"Server connection verified": "Servertilkobling bekreftet",
|
||||||
"Set as default": "Sett som standard",
|
"Set as default": "Sett som standard",
|
||||||
@@ -560,9 +566,9 @@
|
|||||||
"short-summary": "kort sammendrag",
|
"short-summary": "kort sammendrag",
|
||||||
"Show": "Vis",
|
"Show": "Vis",
|
||||||
"Show Admin Details in Account Pending Overlay": "Vis administratordetaljer i ventende kontooverlay",
|
"Show Admin Details in Account Pending Overlay": "Vis administratordetaljer i ventende kontooverlay",
|
||||||
"Show Model": "",
|
"Show Model": "Vis modell",
|
||||||
"Show shortcuts": "Vis snarveier",
|
"Show shortcuts": "Vis snarveier",
|
||||||
"Show your support!": "",
|
"Show your support!": "Vis din støtte!",
|
||||||
"Showcased creativity": "Vist frem kreativitet",
|
"Showcased creativity": "Vist frem kreativitet",
|
||||||
"Sign in": "Logg inn",
|
"Sign in": "Logg inn",
|
||||||
"Sign Out": "Logg ut",
|
"Sign Out": "Logg ut",
|
||||||
@@ -572,20 +578,20 @@
|
|||||||
"Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}",
|
"Speech recognition error: {{error}}": "Feil ved talegjenkjenning: {{error}}",
|
||||||
"Speech-to-Text Engine": "Tale-til-tekst-motor",
|
"Speech-to-Text Engine": "Tale-til-tekst-motor",
|
||||||
"Stop Sequence": "Stoppsekvens",
|
"Stop Sequence": "Stoppsekvens",
|
||||||
"STT Model": "",
|
"STT Model": "STT-modell",
|
||||||
"STT Settings": "STT-innstillinger",
|
"STT Settings": "STT-innstillinger",
|
||||||
"Submit": "Send inn",
|
"Submit": "Send inn",
|
||||||
"Subtitle (e.g. about the Roman Empire)": "Undertittel (f.eks. om Romerriket)",
|
"Subtitle (e.g. about the Roman Empire)": "Undertittel (f.eks. om Romerriket)",
|
||||||
"Success": "Suksess",
|
"Success": "Suksess",
|
||||||
"Successfully updated.": "Oppdatert.",
|
"Successfully updated.": "Oppdatert.",
|
||||||
"Suggested": "Foreslått",
|
"Suggested": "Foreslått",
|
||||||
"Support": "",
|
"Support": "Bidra",
|
||||||
"Support this plugin:": "",
|
"Support this plugin:": "Bidra til denne utvidelsen:",
|
||||||
"System": "System",
|
"System": "System",
|
||||||
"System Prompt": "Systemprompt",
|
"System Prompt": "Systemprompt",
|
||||||
"Tags": "Tagger",
|
"Tags": "Tagger",
|
||||||
"Tap to interrupt": "",
|
"Tap to interrupt": "Berør for å avbryte",
|
||||||
"Tavily API Key": "",
|
"Tavily API Key": "Tavily API-nøkkel",
|
||||||
"Tell us more:": "Fortell oss mer:",
|
"Tell us more:": "Fortell oss mer:",
|
||||||
"Temperature": "Temperatur",
|
"Temperature": "Temperatur",
|
||||||
"Template": "Mal",
|
"Template": "Mal",
|
||||||
@@ -593,67 +599,68 @@
|
|||||||
"Text-to-Speech Engine": "Tekst-til-tale-motor",
|
"Text-to-Speech Engine": "Tekst-til-tale-motor",
|
||||||
"Tfs Z": "Tfs Z",
|
"Tfs Z": "Tfs Z",
|
||||||
"Thanks for your feedback!": "Takk for tilbakemeldingen!",
|
"Thanks for your feedback!": "Takk for tilbakemeldingen!",
|
||||||
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
|
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Utviklerne bak denne utvidelsen er lidenskapelige frivillige fra fellesskapet. Hvis du finner denne utvidelsen nyttig, vennligst vurder å bidra til utviklingen.",
|
||||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Poengsummen skal være en verdi mellom 0,0 (0%) og 1,0 (100%).",
|
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Poengsummen skal være en verdi mellom 0,0 (0%) og 1,0 (100%).",
|
||||||
"Theme": "Tema",
|
"Theme": "Tema",
|
||||||
"Thinking...": "",
|
"Thinking...": "Tenker ...",
|
||||||
"This action cannot be undone. Do you wish to continue?": "",
|
"This action cannot be undone. Do you wish to continue?": "Denne handlingen kan ikke angres. Ønsker du å fortsette?",
|
||||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dette sikrer at dine verdifulle samtaler er trygt lagret i backend-databasen din. Takk!",
|
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dette sikrer at dine verdifulle samtaler er trygt lagret i backend-databasen din. Takk!",
|
||||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dette er en eksperimentell funksjon, det er mulig den ikke fungerer som forventet og kan endres når som helst.",
|
||||||
"This setting does not sync across browsers or devices.": "Denne innstillingen synkroniseres ikke mellom nettlesere eller enheter.",
|
"This setting does not sync across browsers or devices.": "Denne innstillingen synkroniseres ikke mellom nettlesere eller enheter.",
|
||||||
"This will delete": "",
|
"This will delete": "Dette vil slette",
|
||||||
"Thorough explanation": "Grundig forklaring",
|
"Thorough explanation": "Grundig forklaring",
|
||||||
"Tika": "",
|
"Tika": "Tika",
|
||||||
"Tika Server URL required.": "",
|
"Tika Server URL required.": "Tika Server-URL kreves.",
|
||||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tips: Oppdater flere variabelplasser etter hverandre ved å trykke på tab-tasten i chatinputen etter hver erstatning.",
|
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tips: Oppdater flere variabelplasser etter hverandre ved å trykke på tab-tasten i chatinputen etter hver erstatning.",
|
||||||
"Title": "Tittel",
|
"Title": "Tittel",
|
||||||
"Title (e.g. Tell me a fun fact)": "Tittel (f.eks. Fortell meg en morsom fakta)",
|
"Title (e.g. Tell me a fun fact)": "Tittel (f.eks. Fortell meg et morsomt faktum)",
|
||||||
"Title Auto-Generation": "Automatisk tittelgenerering",
|
"Title Auto-Generation": "Automatisk tittelgenerering",
|
||||||
"Title cannot be an empty string.": "Tittelen kan ikke være en tom streng.",
|
"Title cannot be an empty string.": "Tittelen kan ikke være en tom streng.",
|
||||||
"Title Generation Prompt": "Tittelgenereringsprompt",
|
"Title Generation Prompt": "Tittelgenereringsprompt",
|
||||||
"to": "til",
|
"to": "til",
|
||||||
"To access the available model names for downloading,": "For å få tilgang til tilgjengelige modelnavn for nedlasting,",
|
"To access the available model names for downloading,": "For å få tilgang til tilgjengelige modelnavn for nedlasting,",
|
||||||
"To access the GGUF models available for downloading,": "For å få tilgang til GGUF-modellene som er tilgjengelige for nedlasting,",
|
"To access the GGUF models available for downloading,": "For å få tilgang til GGUF-modellene som er tilgjengelige for nedlasting,",
|
||||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "For å få tilgang til WebUI, vennligst kontakt administratoren. Administratorer kan administrere brukerstatus fra Admin-panelet.",
|
||||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
"To add documents here, upload them to the \"Documents\" workspace first.": "For å legge til dokumenter her, last dem opp til \"Dokumenter\"-arbeidsområdet først.",
|
||||||
"to chat input.": "til chatinput.",
|
"to chat input.": "til chatinput.",
|
||||||
"To select filters here, add them to the \"Functions\" workspace first.": "",
|
"To select actions here, add them to the \"Functions\" workspace first.": "For å velge handlinger her, legg dem til i \"Funksjoner\"-arbeidsområdet først.",
|
||||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
"To select filters here, add them to the \"Functions\" workspace first.": "For å velge filtre her, legg dem til i \"Funksjoner\"-arbeidsområdet først.",
|
||||||
|
"To select toolkits here, add them to the \"Tools\" workspace first.": "For å velge verktøysett her, legg dem til i \"Verktøy\"-arbeidsområdet først.",
|
||||||
"Today": "I dag",
|
"Today": "I dag",
|
||||||
"Toggle settings": "Veksle innstillinger",
|
"Toggle settings": "Veksle innstillinger",
|
||||||
"Toggle sidebar": "Veksle sidefelt",
|
"Toggle sidebar": "Veksle sidefelt",
|
||||||
"Tokens To Keep On Context Refresh (num_keep)": "",
|
"Tokens To Keep On Context Refresh (num_keep)": "Tokens å beholde ved kontekstoppdatering (num_keep)",
|
||||||
"Tool created successfully": "",
|
"Tool created successfully": "Verktøy opprettet",
|
||||||
"Tool deleted successfully": "",
|
"Tool deleted successfully": "Verktøy slettet",
|
||||||
"Tool imported successfully": "",
|
"Tool imported successfully": "Verktøy importert",
|
||||||
"Tool updated successfully": "",
|
"Tool updated successfully": "Verktøy oppdatert",
|
||||||
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
|
"Toolkit Description (e.g. A toolkit for performing various operations)": "Verktøysettbeskrivelse (f.eks. Et verktøysett for å utføre ulike operasjoner)",
|
||||||
"Toolkit ID (e.g. my_toolkit)": "",
|
"Toolkit ID (e.g. my_toolkit)": "Verktøysett-ID (f.eks. my_toolkit)",
|
||||||
"Toolkit Name (e.g. My ToolKit)": "",
|
"Toolkit Name (e.g. My ToolKit)": "Verktøysett-navn (f.eks. Mitt verktøysett)",
|
||||||
"Tools": "",
|
"Tools": "Verktøy",
|
||||||
"Tools are a function calling system with arbitrary code execution": "",
|
"Tools are a function calling system with arbitrary code execution": "Vertkøy er et funksjonskallssystem med vilkårlig kodeeksekvering",
|
||||||
"Tools have a function calling system that allows arbitrary code execution": "",
|
"Tools have a function calling system that allows arbitrary code execution": "Verktøy har et funksjonskallssystem som tillater vilkårlig kodeeksekvering",
|
||||||
"Tools have a function calling system that allows arbitrary code execution.": "",
|
"Tools have a function calling system that allows arbitrary code execution.": "Verktøy har et funksjonskallssystem som tillater vilkårlig kodeeksekvering.",
|
||||||
"Top K": "Top K",
|
"Top K": "Top K",
|
||||||
"Top P": "Top P",
|
"Top P": "Top P",
|
||||||
"Trouble accessing Ollama?": "Problemer med tilgang til Ollama?",
|
"Trouble accessing Ollama?": "Problemer med tilgang til Ollama?",
|
||||||
"TTS Model": "",
|
"TTS Model": "TTS-modell",
|
||||||
"TTS Settings": "TTS-innstillinger",
|
"TTS Settings": "TTS-innstillinger",
|
||||||
"TTS Voice": "",
|
"TTS Voice": "TTS-stemme",
|
||||||
"Type": "Type",
|
"Type": "Type",
|
||||||
"Type Hugging Face Resolve (Download) URL": "Skriv inn Hugging Face Resolve (nedlasting) URL",
|
"Type Hugging Face Resolve (Download) URL": "Skriv inn Hugging Face Resolve (nedlasting) URL",
|
||||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Oops! Det oppsto et problem med tilkoblingen til {{provider}}.",
|
"Uh-oh! There was an issue connecting to {{provider}}.": "Oops! Det oppsto et problem med tilkoblingen til {{provider}}.",
|
||||||
"UI": "",
|
"UI": "UI",
|
||||||
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "",
|
"Unknown file type '{{file_type}}'. Proceeding with the file upload anyway.": "Ukjent filtype '{{file_type}}'. Fortsetter likevel med filopplastingen.",
|
||||||
"Unpin": "",
|
"Unpin": "Løsne",
|
||||||
"Update": "",
|
"Update": "Oppdater",
|
||||||
"Update and Copy Link": "Oppdater og kopier lenke",
|
"Update and Copy Link": "Oppdater og kopier lenke",
|
||||||
"Update password": "Oppdater passord",
|
"Update password": "Oppdater passord",
|
||||||
"Updated at": "",
|
"Updated at": "Oppdatert",
|
||||||
"Upload": "",
|
"Upload": "Last opp",
|
||||||
"Upload a GGUF model": "Last opp en GGUF-modell",
|
"Upload a GGUF model": "Last opp en GGUF-modell",
|
||||||
"Upload Files": "Last opp filer",
|
"Upload Files": "Last opp filer",
|
||||||
"Upload Pipeline": "",
|
"Upload Pipeline": "Last opp pipeline",
|
||||||
"Upload Progress": "Opplastingsfremdrift",
|
"Upload Progress": "Opplastingsfremdrift",
|
||||||
"URL Mode": "URL-modus",
|
"URL Mode": "URL-modus",
|
||||||
"Use '#' in the prompt input to load and select your documents.": "Bruk '#' i prompt-input for å laste og velge dokumentene dine.",
|
"Use '#' in the prompt input to load and select your documents.": "Bruk '#' i prompt-input for å laste og velge dokumentene dine.",
|
||||||
@@ -662,23 +669,23 @@
|
|||||||
"use_mlock (Ollama)": "use_mlock (Ollama)",
|
"use_mlock (Ollama)": "use_mlock (Ollama)",
|
||||||
"use_mmap (Ollama)": "use_mmap (Ollama)",
|
"use_mmap (Ollama)": "use_mmap (Ollama)",
|
||||||
"user": "bruker",
|
"user": "bruker",
|
||||||
"User location successfully retrieved.": "",
|
"User location successfully retrieved.": "Brukerlokasjon hentet",
|
||||||
"User Permissions": "Brukertillatelser",
|
"User Permissions": "Brukertillatelser",
|
||||||
"Users": "Brukere",
|
"Users": "Brukere",
|
||||||
"Utilize": "Utnytt",
|
"Utilize": "Utnytt",
|
||||||
"Valid time units:": "Gyldige tidsenheter:",
|
"Valid time units:": "Gyldige tidsenheter:",
|
||||||
"Valves": "",
|
"Valves": "Ventiler",
|
||||||
"Valves updated": "",
|
"Valves updated": "Ventiler oppdatert",
|
||||||
"Valves updated successfully": "",
|
"Valves updated successfully": "Ventiler oppdatert",
|
||||||
"variable": "variabel",
|
"variable": "variabel",
|
||||||
"variable to have them replaced with clipboard content.": "variabel for å få dem erstattet med utklippstavleinnhold.",
|
"variable to have them replaced with clipboard content.": "variabel for å få dem erstattet med utklippstavleinnhold.",
|
||||||
"Version": "Versjon",
|
"Version": "Versjon",
|
||||||
"Voice": "",
|
"Voice": "Stemme",
|
||||||
"Warning": "Advarsel",
|
"Warning": "Advarsel",
|
||||||
"Warning:": "",
|
"Warning:": "Advarsel:",
|
||||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advarsel: Hvis du oppdaterer eller endrer embedding-modellen din, må du re-importere alle dokumenter.",
|
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advarsel: Hvis du oppdaterer eller endrer embedding-modellen din, må du re-importere alle dokumenter.",
|
||||||
"Web": "Web",
|
"Web": "Web",
|
||||||
"Web API": "",
|
"Web API": "Web-API",
|
||||||
"Web Loader Settings": "Web-lasterinnstillinger",
|
"Web Loader Settings": "Web-lasterinnstillinger",
|
||||||
"Web Params": "Web-parametere",
|
"Web Params": "Web-parametere",
|
||||||
"Web Search": "Websøk",
|
"Web Search": "Websøk",
|
||||||
@@ -688,21 +695,21 @@
|
|||||||
"WebUI will make requests to": "WebUI vil gjøre forespørsler til",
|
"WebUI will make requests to": "WebUI vil gjøre forespørsler til",
|
||||||
"What’s New in": "Hva er nytt i",
|
"What’s New in": "Hva er nytt i",
|
||||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Når historikken er slått av, vil nye chatter på denne nettleseren ikke vises i historikken din på noen av enhetene dine.",
|
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Når historikken er slått av, vil nye chatter på denne nettleseren ikke vises i historikken din på noen av enhetene dine.",
|
||||||
"Whisper (Local)": "",
|
"Whisper (Local)": "Whisper (Lokal)",
|
||||||
"Widescreen Mode": "",
|
"Widescreen Mode": "Bredskjermmodus",
|
||||||
"Workspace": "Arbeidsområde",
|
"Workspace": "Arbeidsområde",
|
||||||
"Write a prompt suggestion (e.g. Who are you?)": "Skriv et promptforslag (f.eks. Hvem er du?)",
|
"Write a prompt suggestion (e.g. Who are you?)": "Skriv et promptforslag (f.eks. Hvem er du?)",
|
||||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Skriv et sammendrag på 50 ord som oppsummerer [emne eller nøkkelord].",
|
"Write a summary in 50 words that summarizes [topic or keyword].": "Skriv et sammendrag på 50 ord som oppsummerer [emne eller nøkkelord].",
|
||||||
"Yesterday": "I går",
|
"Yesterday": "I går",
|
||||||
"You": "Du",
|
"You": "Du",
|
||||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
"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 tilpasse interaksjonene dine med språkmodeller ved å legge til minner gjennom 'Administrer'-knappen nedenfor, slik at de blir mer hjelpsomme og tilpasset deg.",
|
||||||
"You cannot clone a base model": "Du kan ikke klone en grunnmodell",
|
"You cannot clone a base model": "Du kan ikke klone en grunnmodell",
|
||||||
"You have no archived conversations.": "Du har ingen arkiverte samtaler.",
|
"You have no archived conversations.": "Du har ingen arkiverte samtaler.",
|
||||||
"You have shared this chat": "Du har delt denne chatten",
|
"You have shared this chat": "Du har delt denne chatten",
|
||||||
"You're a helpful assistant.": "Du er en hjelpsom assistent.",
|
"You're a helpful assistant.": "Du er en hjelpsom assistent.",
|
||||||
"You're now logged in.": "Du er nå logget inn.",
|
"You're now logged in.": "Du er nå logget inn.",
|
||||||
"Your account status is currently pending activation.": "",
|
"Your account status is currently pending activation.": "Din konto venter for øyeblikket på aktivering.",
|
||||||
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
|
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Hele beløpet du gir går uavkortet til utvikleren av tillegget; Open WebUI tar ikke noe av dette. Den valgte finansieringsplattformen kan derimot ha egne gebyrer.",
|
||||||
"Youtube": "Youtube",
|
"Youtube": "Youtube",
|
||||||
"Youtube Loader Settings": "Youtube-lasterinnstillinger"
|
"Youtube Loader Settings": "Innstillinger for YouTube-laster"
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user