Compare commits

...
294 Commits
Author SHA1 Message Date
Timothy Jaeryang Baek a58dfccb7d Merge pull request #4273 from open-webui/dev
0.3.11
2024-08-03 00:03:15 +02:00
Timothy J. Baek b35293228e refac 2024-08-03 00:01:54 +02:00
Timothy J. Baek 963e250654 refac 2024-08-02 23:54:18 +02:00
Timothy J. Baek ca8b766c09 refac 2024-08-02 23:48:49 +02:00
Timothy J. Baek 21eca7f1c1 doc: changelog 2024-08-02 23:47:00 +02:00
Timothy J. Baek 8062866973 chore: format 2024-08-02 22:35:02 +02:00
Timothy Jaeryang Baek 99530358fd Merge pull request #4300 from JohnTheNerd/flux-image-gen
feat: added support for the new Flux image gen model using ComfyUI
2024-08-02 22:32:22 +02:00
Timothy J. Baek 621393ca62 chore: format 2024-08-02 22:31:37 +02:00
Timothy J. Baek 0c6284be02 fix: user voice should update when global voice updates 2024-08-02 22:28:39 +02:00
Timothy Jaeryang Baek 9d5e3e2a91 Merge pull request #4299 from open-webui/dev-elevenlabs
feat: Fetch ElevenLabs voice ID by name
2024-08-02 19:29:24 +02:00
Timothy J. Baek 7f260938db refac 2024-08-02 19:29:03 +02:00
Timothy J. Baek c416444e24 fix 2024-08-02 19:26:34 +02:00
Timothy J. Baek b559bc84a7 refac 2024-08-02 19:24:47 +02:00
Timothy Jaeryang Baek 3f53abb233 Merge pull request #4018 from justinh-rahb/elevenlabs-voice-names
feat: Fetch ElevenLabs voice ID by name
2024-08-02 18:44:48 +02:00
Timothy J. Baek 67efd0dd39 enh: enable tools with url search param 2024-08-02 18:32:51 +02:00
Timothy J. Baek dcd32faa83 fix: styling 2024-08-02 18:12:54 +02:00
Timothy J. Baek 8fcb5cee66 enh: min_p 2024-08-02 18:11:20 +02:00
Timothy J. Baek 13b757d847 enh: min_p added to params 2024-08-02 18:10:12 +02:00
Timothy J. Baek c6d7f24542 fix: block users from /workspace and /admin 2024-08-02 18:08:23 +02:00
Timothy Jaeryang Baek 4c1a9380e6 Merge pull request #3998 from ScribblerCoder/patch-1
fix: Dockerfile Healthcheck unexpected exit code
2024-08-02 17:56:27 +02:00
John Karabudak ad6e8edcd3 added support for the new Flux image gen model using ComfyUI
this commit adds three environment variables:

- COMFYUI_FLUX: determines whether Flux is used, the workflow is completely different so this is necessary.
- COMFYUI_FLUX_WEIGHT_DTYPE: sets the weight precision for Flux. you will probably want to set this to "fp8_e4m3fn" as the fp16 weights take up about 24GB of VRAM. optional, defaults to "default".
- COMFYUI_FLUX_FP8_CLIP: Flux requires two CLIP models downloaded, one of which is available in fp8 and fp16. set to true if you are using the fp8 CLIP weights.
2024-08-02 13:23:20 -02:30
Timothy J. Baek 95c742ba9b chore: format 2024-08-02 17:47:43 +02:00
Timothy J. Baek 546d442626 refac 2024-08-02 17:45:30 +02:00
Timothy J. Baek ed8c0b23a0 refac 2024-08-02 17:41:15 +02:00
Timothy J. Baek c8f44b73f1 refac: user valves save handler 2024-08-02 17:36:16 +02:00
Timothy J. Baek bf6b149b8b refac: user valves 2024-08-02 17:19:52 +02:00
Timothy Jaeryang Baek f334c834e5 Merge pull request #4274 from Yanyutin753/display_size
💄Feat show the size of file and prepare for subsequent upload restrictions
2024-08-02 14:27:42 +02:00
Timothy Jaeryang Baek 7c850bb78a Merge pull request #4289 from OriginalSimon/dev
i18n: Update of the Ukrainian translation
2024-08-02 14:27:11 +02:00
Simon a280fed4be Merge branch 'open-webui:dev' into dev 2024-08-02 14:07:04 +02:00
Timothy Jaeryang Baek cf9b5241ae Merge pull request #4282 from laurentiu-miu/dev
i18n: Added Romanian translation
2024-08-02 13:31:33 +02:00
laurentium dfa25af271 i18n: Romanian translation fix pull request deleted extra space 2024-08-02 13:14:50 +03:00
laurentium b538c5a206 i18n: Romanian translation fix one-to-one equivalent with the en-US file 2024-08-02 12:58:11 +03:00
laurentium 4fa3fcbb3b i18n: Romanian translation 2024-08-02 12:03:00 +03:00
Clivia b049ae269b 💄Feat show the size of file and prepare for subsequent upload restrictions 2024-08-02 09:46:16 +08:00
Timothy J. Baek e5bf27e716 enh: include desc in fuzzy search 2024-08-02 01:53:53 +02:00
Timothy Jaeryang Baek a9a6ed8b71 Merge pull request #4237 from michaelpoluektov/refactor-webui-main
refactor: Simplify functions
2024-08-02 01:47:06 +02:00
Timothy J. Baek e6c64282fc refac 2024-08-02 01:45:50 +02:00
Timothy J. Baek 64b41655bb chore: format 2024-08-01 22:50:59 +02:00
Timothy J. BaekandAryan Kothari 6ac40552b4 feat: model selector fuzzy search
Co-Authored-By: Aryan Kothari <87589047+thearyadev@users.noreply.github.com>
2024-08-01 22:47:53 +02:00
Timothy Jaeryang Baek 039c5c540b Merge pull request #4225 from Yanyutin753/pref_file_upload
⚡Initialize fileItem first to speed up file display
2024-08-01 22:09:59 +02:00
Timothy J. Baek c9ed934d0b refac: file should not have 'uploaded' status 2024-08-01 22:09:29 +02:00
Timothy Jaeryang Baek ef36b21684 Merge pull request #4253 from erickgamer787/fix-SensitiveInput-for-admin-pages
fix: Fix the SensitiveInput  the browser thought it was a password field
2024-08-01 21:43:42 +02:00
Timothy J. Baek c44e51ae58 refac 2024-08-01 21:43:13 +02:00
Timothy Jaeryang Baek 6ecb7c80f1 Merge pull request #4262 from michaelpoluektov/fix-redirect-uri
fix: Fix custom redirect URI for OAuth behind reverse proxy
2024-08-01 20:57:27 +02:00
Timothy Jaeryang Baek 380cb93e46 Merge pull request #4257 from thearyadev/fix/pdf-gen-static-path
fix: pdf gen static path resolution
2024-08-01 20:57:00 +02:00
Timothy Jaeryang Baek 36e7662706 Merge pull request #4263 from mr-raw/dev
i18n: Translated missing keys. Minor changes to existing translations.
2024-08-01 20:41:00 +02:00
Simon aa8d26496c Merge branch 'open-webui:dev' into dev 2024-08-01 15:52:58 +02:00
Michael Poluektov 4619e32b6a undo changelog changes 2024-08-01 12:59:39 +01:00
Michael Poluektov 0352e956b6 fix: redirect uri 2024-08-01 12:54:06 +01:00
Michael Poluektov f999956997 Merge remote-tracking branch 'oauth/main' into dev 2024-08-01 12:53:36 +01:00
Erik Raae bfd268c5e6 Translated missing keys. Minor changes to existing translations. 2024-08-01 13:46:25 +02:00
Aryan Kothari b7ad47017d fix: static dir path resolution
when running in different environments, the static_path is different.
This path is now 'determined' at runtime
2024-07-31 23:56:47 -04:00
Michael Poluektov 502b722902 Merge branch 'dev' of https://github.com/open-webui/open-webui into refactor-webui-main 2024-07-31 22:09:36 +01:00
Michael Poluektov c89b34fd75 flatten job() 2024-07-31 22:05:37 +01:00
Michael Poluektov b9b1fdd1a1 refac: rename message_template 2024-07-31 22:01:22 +01:00
Michael Poluektov 2e0fa1c6a0 refac: rename stream_message_template 2024-07-31 22:00:00 +01:00
Michael Poluektov f8726719ef refac: rename whole_message_template, silence lsp 2024-07-31 21:58:40 +01:00
Erick Joseph 3569fe9c73 the fix for the issue where chrome thought the SensitiveInput input was a password field 2024-07-31 16:15:00 -03:00
Timothy Jaeryang Baek 4ffcabfb3f Merge pull request #4250 from erickgamer787/i18n-correction-to-pt-br
i18n: redone and updated the entire pt br translation
2024-07-31 21:01:42 +02:00
Erick Joseph a7ed74744f correct and update all pt br translation 2024-07-31 15:53:02 -03:00
Michael Poluektov ae0bb8f1eb Merge branch 'dev' of https://github.com/open-webui/open-webui into refactor-webui-main 2024-07-31 17:42:16 +01:00
Michael Poluektov 034411e47e fix: type not manifold 2024-07-31 17:24:00 +01:00
Michael Poluektov baf58ef396 refac: use add_or_update_system_message 2024-07-31 17:16:07 +01:00
Michael Poluektov 006fc3495e fix: stream_message_template 2024-07-31 16:45:47 +01:00
Michael Poluektov 29a3b82336 refac: reuse stream_message_template 2024-07-31 15:26:26 +01:00
Michael Poluektov 22a5e196c9 simplify main.py 2024-07-31 14:01:40 +01:00
Michael Poluektov deec41d29a fix: function early returns 2024-07-31 13:51:25 +01:00
Michael Poluektov 3978efd710 refac: Refactor functions 2024-07-31 13:35:02 +01:00
Timothy J. Baek 7a80e732df refac: styling 2024-07-31 12:37:49 +01:00
Clivia 6681df29d2 ⚡Initialize fileItem first to speed up file display 2024-07-31 07:25:53 +08:00
Timothy J. Baek 9d58bb1c66 fix: styling 2024-07-30 12:34:30 +01:00
Timothy J. Baek acbdb05bd0 fix: styling 2024-07-30 11:44:32 +01:00
Simon 25f5259e84 Update translation.json 2024-07-29 14:16:13 +02:00
Timothy J. Baek 0ced153f86 refac 2024-07-28 23:17:49 +01:00
Timothy J. Baek faca8c8b53 feat: multiple action support 2024-07-28 22:02:23 +01:00
Timothy Jaeryang Baek 4ad8181088 Merge pull request #4166 from que-nguyen/dev
Update Vietnamese translations
2024-07-28 21:08:39 +02:00
Que Nguyen 4f3ff4a69d Update Vietnamese translations 2024-07-28 21:44:25 +07:00
Timothy J. Baek fc0f2f2b3a chore: format 2024-07-28 13:13:33 +01:00
Timothy J. Baek b4cd084117 feat: action selector 2024-07-28 13:06:47 +01:00
Timothy J. Baek c1fd55bb04 fix/refac: actions 2024-07-28 13:00:58 +01:00
Timothy J. Baek 77b2d2dbee refac: styling 2024-07-27 23:34:29 +01:00
Timothy J. Baek f92aed1b91 fix 2024-07-27 23:07:58 +01:00
Timothy Jaeryang Baek 90a6be8001 Merge pull request #4138 from ther0bster/fix-socket-io-url
fix: socket.io client url
2024-07-27 16:17:36 +02:00
Timothy Jaeryang Baek 2e4de209fe Merge pull request #4149 from arsaboo/openrouter
chore: Add HTTP-Referer and X-Title headers for OpenRouter
2024-07-27 16:06:17 +02:00
Alok Saboo 287147687e Add HTTP-Referer and X-Title headers for OpenRouter 2024-07-27 09:43:03 -04:00
ther0bster a53f5d01aa fix: don't break dev tests 2024-07-26 19:01:36 +02:00
Timothy J. Baek 1aaa2e8219 fix: ollama rag issue workaround 2024-07-26 12:22:13 +01:00
ther0bster 02b104f56b fix: socket.io client url
* fixes backend crash with IPv6 and some IPv4 setups
* instead of passing empty url, let socket.io set default url
  (defaults to window.location.host)
2024-07-25 21:23:28 +02:00
Timothy J. Baek e691839771 refac: styling 2024-07-25 12:16:19 +01:00
Timothy J. Baek 4c22d130d9 refac: styling 2024-07-25 12:08:47 +01:00
Timothy Jaeryang Baek 065d23d0b1 Merge pull request #4068 from Louden7/main
feat: Added environment variable to hide email and password sign in elements
2024-07-25 11:21:49 +02:00
Timothy Jaeryang Baek 4b0a232ae1 Merge pull request #4059 from thearyadev/feat/model-selection-with-arrow-keys
feat: select model with arrow keys
2024-07-25 11:13:08 +02:00
Timothy Jaeryang Baek 81130c205c Merge pull request #4096 from open-webui/dependabot/pip/pip-b4bdd6eb86
chore(deps): bump the pip group across 2 directories with 2 updates
2024-07-25 11:12:47 +02:00
Dillon 36b94ca5f5 updated environment variable to suggested ENABLE_LOGIN_FORM 2024-07-24 21:44:40 -04:00
Aryan Kothari 9e4326a582 fix: unintentional import from previous commit 2024-07-24 19:03:31 -04:00
dependabot[bot] 8193c2f847 chore(deps): bump the pip group across 2 directories with 2 updates
Bumps the pip group with 2 updates in the / directory: [pymysql](https://github.com/PyMySQL/PyMySQL) and [langchain-community](https://github.com/langchain-ai/langchain).
Bumps the pip group with 1 update in the /backend directory: [langchain-community](https://github.com/langchain-ai/langchain).


Updates `pymysql` from 1.1.0 to 1.1.1
- [Release notes](https://github.com/PyMySQL/PyMySQL/releases)
- [Changelog](https://github.com/PyMySQL/PyMySQL/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyMySQL/PyMySQL/compare/v1.1.0...v1.1.1)

Updates `langchain-community` from 0.2.0 to 0.2.9
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/langchain-community==0.2.0...langchain-community==0.2.9)

Updates `langchain-community` from 0.2.6 to 0.2.9
- [Release notes](https://github.com/langchain-ai/langchain/releases)
- [Commits](https://github.com/langchain-ai/langchain/compare/langchain-community==0.2.0...langchain-community==0.2.9)

---
updated-dependencies:
- dependency-name: pymysql
  dependency-type: direct:production
  dependency-group: pip
- dependency-name: langchain-community
  dependency-type: direct:production
  dependency-group: pip
- dependency-name: langchain-community
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-24 17:41:24 +00:00
Aryan Kothari fbef731a04 fix: check filteredItems length before unsafe index access 2024-07-24 09:06:21 -04:00
Aryan Kothari dbf88a2eca refactor: rename pseudoSelectedIndex to selectedModelIdx 2024-07-24 09:04:56 -04:00
Timothy J. Baek 413a9031eb chore: format 2024-07-24 11:36:41 +01:00
Timothy J. Baek 23e69bcdb4 enh: AsyncGenerator support 2024-07-24 11:29:57 +01:00
Timothy J. Baek edff071cd2 refac 2024-07-24 11:25:07 +01:00
Timothy Jaeryang Baek 3b487cfae9 Merge pull request #4046 from thearyadev/chat-list-optimization
perf: optimize query for chat list
2024-07-24 12:21:04 +02:00
Timothy J. Baek a8d2072e9f refac 2024-07-24 11:19:42 +01:00
Timothy Jaeryang Baek 260e42a691 Merge pull request #4036 from open-webui/dependabot/pip/backend/dev/google-generativeai-0.7.2
chore(deps): bump google-generativeai from 0.5.4 to 0.7.2 in /backend
2024-07-24 12:17:31 +02:00
Timothy Jaeryang Baek 596a9c60d7 Merge pull request #4039 from open-webui/dependabot/pip/backend/dev/rapidocr-onnxruntime-1.3.24
chore(deps): bump rapidocr-onnxruntime from 1.3.22 to 1.3.24 in /backend
2024-07-24 12:17:24 +02:00
Timothy Jaeryang Baek a47e4a1148 Merge pull request #4047 from Peter-De-Ath/confirmDialog-add-inputValue
feat: add eventConfirmationInputValue handling in Chat.svelte
2024-07-24 12:16:45 +02:00
Timothy Jaeryang Baek 312c8b9e7a Merge pull request #4042 from Yanyutin753/model_image
💄 Add a model image to the model selector
2024-07-24 12:15:33 +02:00
Timothy Jaeryang Baek 1d99508943 Merge pull request #4055 from que-nguyen/dev
Update Vietnamese translations
2024-07-24 12:11:46 +02:00
Timothy Jaeryang Baek b42fda0971 Merge pull request #4040 from open-webui/dependabot/pip/backend/dev/duckduckgo-search-approx-eq-6.2.1
chore(deps): update duckduckgo-search requirement from ~=6.1.12 to ~=6.2.1 in /backend
2024-07-24 12:11:10 +02:00
Timothy Jaeryang Baek cf377d2e1c Merge pull request #4038 from open-webui/dependabot/pip/backend/dev/unstructured-0.15.0
chore(deps): bump unstructured from 0.14.10 to 0.15.0 in /backend
2024-07-24 12:07:50 +02:00
Timothy Jaeryang Baek ec9d0b8a6d Merge pull request #4037 from open-webui/dependabot/pip/backend/dev/langfuse-2.39.2
chore(deps): bump langfuse from 2.38.0 to 2.39.2 in /backend
2024-07-24 12:07:41 +02:00
Timothy Jaeryang Baek 14cac8ed22 Merge pull request #4030 from songritk/main
i18n: Thai translation
2024-07-24 12:02:43 +02:00
Dillon 4ecf9dd62d Created if blocks to show or hide username, password, signin and or sections depending on new enable_username_password_login variable 2024-07-23 22:25:29 -04:00
Dillon b56dcf155c Added enable_username_password_login to the Config object 2024-07-23 22:23:37 -04:00
Dillon 63ffdb38aa Added and set enable_username_password_login to the get_app_config function 2024-07-23 22:22:09 -04:00
Dillon f9289d3079 Created new PersistentConfig for new environment variable ENABLE_USERNAME_PASSWORD_LOGIN 2024-07-23 22:20:45 -04:00
Dillon 709b56bc40 imported and added new ENABLE_USERNAME_PASSWORD_LOGIN environment variable 2024-07-23 22:19:41 -04:00
Aryan Kothari eb38d382ba fix: pseudoSelectedIndex is reset when modal is closed. 2024-07-23 11:31:17 -04:00
Aryan Kothari 5beaa5d892 feat: select model with arrow keys (+enter) 2024-07-23 11:05:11 -04:00
Que Nguyen 01b24f6282 Update Vietnamese translations 2024-07-23 17:33:22 +07:00
Peter De-Ath cbe3694b81 refac: add eventConfirmationInputValue handling in Chat.svelte 2024-07-22 20:43:31 +01:00
Aryan Kothari f531a51e91 chore: formatting 2024-07-22 14:45:47 -04:00
Aryan Kothari a0667dfd1b change /chats/ and /chats/list to utilize new function 2024-07-22 14:09:22 -04:00
Aryan Kothari 2b78e613a4 add func to get chat list with more specific sql query 2024-07-22 14:08:15 -04:00
Clivia b34ab10b5e 💄 Add a model image to the model selector 2024-07-22 20:30:27 +08:00
dependabot[bot] f07cc37939 chore(deps): update duckduckgo-search requirement in /backend
Updates the requirements on [duckduckgo-search](https://github.com/deedy5/duckduckgo_search) to permit the latest version.
- [Release notes](https://github.com/deedy5/duckduckgo_search/releases)
- [Commits](https://github.com/deedy5/duckduckgo_search/compare/v6.1.12...v6.2.1)

---
updated-dependencies:
- dependency-name: duckduckgo-search
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-22 02:44:43 +00:00
dependabot[bot] 957b0ecd15 chore(deps): bump rapidocr-onnxruntime from 1.3.22 to 1.3.24 in /backend
Bumps [rapidocr-onnxruntime](https://github.com/RapidAI/RapidOCR) from 1.3.22 to 1.3.24.
- [Release notes](https://github.com/RapidAI/RapidOCR/releases)
- [Commits](https://github.com/RapidAI/RapidOCR/compare/v1.3.22...v1.3.24)

---
updated-dependencies:
- dependency-name: rapidocr-onnxruntime
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-22 02:44:40 +00:00
dependabot[bot] 659bc246c9 chore(deps): bump unstructured from 0.14.10 to 0.15.0 in /backend
Bumps [unstructured](https://github.com/Unstructured-IO/unstructured) from 0.14.10 to 0.15.0.
- [Release notes](https://github.com/Unstructured-IO/unstructured/releases)
- [Changelog](https://github.com/Unstructured-IO/unstructured/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Unstructured-IO/unstructured/compare/0.14.10...0.15.0)

---
updated-dependencies:
- dependency-name: unstructured
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-22 02:44:37 +00:00
dependabot[bot] 1502af7e94 chore(deps): bump langfuse from 2.38.0 to 2.39.2 in /backend
Bumps [langfuse](https://github.com/langfuse/langfuse) from 2.38.0 to 2.39.2.
- [Release notes](https://github.com/langfuse/langfuse/releases)
- [Commits](https://github.com/langfuse/langfuse/commits)

---
updated-dependencies:
- dependency-name: langfuse
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-22 02:44:33 +00:00
dependabot[bot] 26c5a533ec chore(deps): bump google-generativeai from 0.5.4 to 0.7.2 in /backend
Bumps [google-generativeai](https://github.com/google/generative-ai-python) from 0.5.4 to 0.7.2.
- [Release notes](https://github.com/google/generative-ai-python/releases)
- [Changelog](https://github.com/google-gemini/generative-ai-python/blob/main/RELEASE.md)
- [Commits](https://github.com/google/generative-ai-python/compare/v0.5.4...v0.7.2)

---
updated-dependencies:
- dependency-name: google-generativeai
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-22 02:44:27 +00:00
Songrit Kitisriworapan 4274016491 i18n: Thai translation 2024-07-21 21:06:49 +07:00
Justin Hayes c6c298b412 Fetch didn't happen 2024-07-20 11:02:59 -04:00
Timothy Jaeryang Baek 63eda0fe42 Merge pull request #4024 from Seth-Rothschild/fix-seed-0
fix: seed and temperature can be 0 in models
2024-07-20 14:01:34 +02:00
Seth Rothschild c3693c91b3 fix: allow temperature and seed to be 0 2024-07-20 06:53:52 -04:00
Timothy J. BaekandClivia e426067e46 fix: latex
Co-Authored-By: Clivia <132346501+Yanyutin753@users.noreply.github.com>
2024-07-20 11:33:27 +02:00
Timothy J. Baek 2e482eca6d refac 2024-07-20 11:29:44 +02:00
Timothy J. Baek fdea1afc7f refac: latex should not use \\begin and \\end as delimiters 2024-07-20 11:24:57 +02:00
Timothy J. Baek 41fecb800d enh: latex 2024-07-20 11:17:24 +02:00
Timothy Jaeryang Baek 52cf06b36c Merge pull request #4021 from KarlLee830/translate
i18n: Update Chinese Translation
2024-07-20 11:05:27 +02:00
Timothy J. Baek ebce006974 refac: latex handling 2024-07-20 10:58:29 +02:00
Karl Lee ff60695a0f i18n: Update Chinese translation 2024-07-20 16:45:13 +08:00
Karl Lee 3aa9685f5a i18n: Update Chinese translation 2024-07-20 16:41:33 +08:00
Justin Hayes 6cecb964a9 name 2024-07-20 03:07:50 -04:00
Justin Hayes 0216ee101c enh: ElevenLabs voice name -> ID 2024-07-20 02:56:00 -04:00
Timothy J. Baek d3c6bfb764 enh: latex 2024-07-19 16:54:28 +02:00
Timothy J. Baek ea6a5121b3 chore: format 2024-07-19 13:58:56 +02:00
Timothy J. Baek d6a4fe00b3 refac: styling 2024-07-19 13:57:35 +02:00
Timothy Jaeryang Baek 36318e8a1b Merge pull request #3992 from thearyadev/feat/enter-to-select-model-indicator
feat: add indicator for enter-triggered model selection
2024-07-19 13:41:43 +02:00
Timothy J. Baek 79562a2531 fix: elevenlabs tts 2024-07-19 13:30:36 +02:00
Timothy Jaeryang Baek d2664ab2a6 Merge pull request #3999 from ricky-davis/importDocumentMappingTags
fix: importing document mapping now adds tags
2024-07-19 12:43:53 +02:00
Timothy J. Baek e664a429a1 feat: elevenlabs tts support 2024-07-19 10:35:05 +02:00
Timothy J. Baek b09bd1ed34 refac: styling 2024-07-19 10:17:59 +02:00
Lukas f83c80aaec add changelog 2024-07-19 09:08:46 +02:00
Lukas bbc8adca94 support custom redirect url in OAuth
closes #3727 #3945
2024-07-19 09:03:41 +02:00
rdavis 20c71d127b Added content field to Document mapping import to ensure tags get re-mapped 2024-07-18 20:53:06 -05:00
Aryan Kothari e35df904a0 feat: add indicator for enter-triggered model selection 2024-07-18 20:48:14 -04:00
Timothy Jaeryang Baek 62682a8c4c Merge pull request #3990 from josx/josx/ext
chore RAG: adding languages known extensions for erlang, elixir, haskell and jsx/tsx
2024-07-19 02:10:15 +02:00
Timothy Jaeryang Baek 253c02cc3c Merge pull request #3982 from jonathan-rohde/fix/missing-tags-add-doc-modal
test: Add tests to verify basic document list features
2024-07-19 02:10:01 +02:00
ScribblerCoder 175d1cc8f2 patch Healtcheck
- Add optional PORT
- added `-n` to jq to return expected exit code when input is empty/null
2024-07-19 03:06:15 +03:00
José Luis Di Biase 23c9122458 chore RAG: adding languages known extension for erlang, elixir, haskell and jsx/tsx
Signed-off-by: José Luis Di Biase <josx@interorganic.com.ar>
2024-07-18 17:48:39 -03:00
Jonathan Rohde b42d2886a2 enh: add missing file 2024-07-18 15:19:30 +02:00
Jonathan Rohde c3f90ba347 enh: add translation keys 2024-07-18 15:09:02 +02:00
Jonathan Rohde c6eba8c0a1 enh: add e2e tests for document list 2024-07-18 15:09:02 +02:00
Timothy Jaeryang Baek 51bdb4cbea Merge pull request #3962 from thearyadev/feat/enter-to-select-model
feat: enter selects first model in list
2024-07-18 13:16:35 +02:00
Timothy Jaeryang Baek 376b2d0297 Merge pull request #3972 from jonathan-rohde/fix/missing-tags-add-doc-modal
fix: missing tags add doc modal
2024-07-18 13:15:22 +02:00
Jonathan Rohde 7e03624408 fix: send tags to upload doc handler in modal dialog 2024-07-18 12:38:23 +02:00
Aryan Kothari 133f223df6 feat: enter selects first model in list 2024-07-17 17:47:17 -04:00
Timothy J. Baek 8dc73fdbdb enh: remove /health logging 2024-07-17 22:24:34 +02:00
Timothy J. Baek 8ec3ed1830 refac: file handling 2024-07-17 22:01:39 +02:00
Timothy J. Baek 8b71ce23bb refac: styling 2024-07-17 22:01:32 +02:00
Timothy Jaeryang Baek 82079e644a Merge pull request #3952 from open-webui/dev
fix
2024-07-17 19:04:40 +02:00
Timothy J. Baek 1e7a364c68 fix 2024-07-17 19:04:18 +02:00
Timothy Jaeryang Baek c74e7df6a0 Merge pull request #3948 from open-webui/dev
0.3.10
2024-07-17 17:51:35 +02:00
Timothy J. Baek 29d8f8d91b refac: wording 2024-07-17 17:30:05 +02:00
Timothy J. Baek 0d1553562d chore: bump 2024-07-17 17:28:53 +02:00
Timothy J. Baek 8e3312c032 doc: changelog 2024-07-17 17:28:22 +02:00
Timothy Jaeryang Baek 878d12da24 Merge pull request #3946 from open-webui/dev
fix
2024-07-17 17:21:03 +02:00
Timothy J. Baek c1dfafcc9e fix 2024-07-17 17:18:57 +02:00
Timothy Jaeryang Baek 6668d79519 Merge pull request #3944 from open-webui/dev
refac
2024-07-17 17:11:57 +02:00
Timothy J. Baek 775a3dc359 refac 2024-07-17 17:11:50 +02:00
Timothy J. Baek 98f935b8f7 fix 2024-07-17 17:00:43 +02:00
Timothy J. Baek 86359ef374 refac 2024-07-17 16:56:11 +02:00
Timothy Jaeryang Baek ef8fbaae28 Merge pull request #3943 from open-webui/dev
fix: web search
2024-07-17 15:40:11 +02:00
Timothy J. Baek 9e48aeca45 fix: web search 2024-07-17 15:39:50 +02:00
Timothy Jaeryang Baek 9518111ed3 Merge pull request #3940 from open-webui/dev
fix: file upload status
2024-07-17 14:22:14 +02:00
Timothy J. Baek 4fea55bac3 fix: file upload status 2024-07-17 14:21:58 +02:00
Timothy Jaeryang Baek 027dd848eb Merge pull request #3933 from open-webui/dev
fix
2024-07-17 13:16:19 +02:00
Timothy J. Baek 98928fc5f0 fix 2024-07-17 13:15:57 +02:00
Timothy Jaeryang Baek 6e843ab563 Merge pull request #3882 from open-webui/dev
0.3.9
2024-07-17 12:18:37 +02:00
Timothy J. Baek b3a0d47a67 doc: changelog 2024-07-17 12:17:15 +02:00
Timothy J. Baek d492d29153 fix: files overlay 2024-07-17 12:02:54 +02:00
Timothy J. Baek ed21f9f906 refac: styling 2024-07-17 11:53:49 +02:00
Timothy J. Baek bdadfc958c chore: format 2024-07-17 11:48:52 +02:00
Timothy J. Baek 3bbd238d7d refac: styling 2024-07-17 11:43:11 +02:00
Timothy J. Baek 4eecdbadd3 enh: files chat control 2024-07-17 11:39:37 +02:00
Timothy J. Baek a33b0abbe0 refac: styling 2024-07-17 10:19:33 +02:00
Timothy J. Baek 3d0f457306 refac 2024-07-17 10:16:27 +02:00
Timothy Jaeryang Baek ca5f1c1efb Merge pull request #3906 from luisbrandao/dev
i18n: pt_br
2024-07-17 09:43:38 +02:00
Luis Alexandre Deschamps Brandao e72592eac3 i18n: pt_br 2024-07-16 11:37:09 -03:00
Timothy J. Baek 72e9cecb17 fix: allow boolean values in params 2024-07-16 15:15:06 +02:00
Timothy J. Baek 27e7494853 refac: title gen should only run once 2024-07-16 14:00:09 +02:00
Timothy J. Baek f0a8aca0e3 fix: automatic1111 auth key should not be required 2024-07-16 10:33:05 +02:00
Timothy Jaeryang Baek 4514595811 Merge pull request #3893 from luisbrandao/dev
translation pt_br
2024-07-16 00:59:26 -07:00
Luis Alexandre Deschamps Brandao e0bcbf0b79 translation pt_br 2024-07-16 01:44:05 -03:00
Timothy Jaeryang Baek 285725eaab Merge pull request #3888 from aleixdorca/dev
i18n: Update Catalan Translations
2024-07-15 11:25:35 -07:00
aleix 9a4770eb17 i18n: Update Catalan Translations 2024-07-15 20:01:07 +02:00
Timothy Jaeryang Baek 8a11985fce Merge pull request #3887 from OriginalSimon/dev
Added i18n keys and update of Ukrainian translation
2024-07-15 10:06:45 -07:00
SimonOriginal 731b3654d8 add i18n keys 2024-07-15 16:45:29 +02:00
SimonOriginal da4e976d5c add Ukrainian translation for new keys 2024-07-15 16:33:38 +02:00
SimonOriginal b74739f91b refac 9 2024-07-15 16:31:23 +02:00
SimonOriginal 6b5c452a3c refac 8 2024-07-15 16:27:06 +02:00
Timothy J. Baek 40075f69f9 refac 2024-07-15 16:25:00 +02:00
SimonOriginal 7702803e5c refac 7 2024-07-15 16:24:47 +02:00
SimonOriginal 3731f1950a refac 6 2024-07-15 16:22:10 +02:00
SimonOriginal 9ab47cf628 refac 5 2024-07-15 16:20:18 +02:00
SimonOriginal 676688aabf refac 4 2024-07-15 16:14:56 +02:00
SimonOriginal 5958d8775c refac 3 2024-07-15 16:12:55 +02:00
SimonOriginal dfd5de9381 add i18n keys 2024-07-15 15:41:07 +02:00
SimonOriginal ac0164c4cc add Ukrainian translation for new keys 2024-07-15 15:35:49 +02:00
SimonOriginal 9e258ea466 add i18n keys 2024-07-15 15:34:21 +02:00
SimonOriginal 0aacb95700 add Ukrainian translation for new keys 2024-07-15 15:28:33 +02:00
SimonOriginal 3668179dfe refac 2 2024-07-15 15:16:49 +02:00
SimonOriginal fa26b8d7cf refac 2024-07-15 15:14:43 +02:00
SimonOriginal 07283ca0cf Merge branch 'dev' of https://github.com/OriginalSimon/open-webui into dev 2024-07-15 15:02:01 +02:00
SimonOriginal 917dde7edf Fix i18n string syntax 2024-07-15 15:01:34 +02:00
SimonOriginal 8102347296 Fix i18n string syntax 2024-07-15 15:01:02 +02:00
Simon 736d8586f1 Merge branch 'open-webui:dev' into dev 2024-07-15 14:54:51 +02:00
SimonOriginal c97d4bbb50 add i18n keys 2024-07-15 14:54:20 +02:00
Timothy J. Baek 553dcd208c refac 2024-07-15 14:16:28 +02:00
SimonOriginal e19c327279 update Ukrainian translation 2024-07-15 14:15:10 +02:00
Timothy J. Baek 6d0e4852cc chore: bump 2024-07-15 13:57:47 +02:00
Timothy J. Baek d258523a3c refac 2024-07-15 13:09:15 +02:00
Timothy J. Baek dbc352f01b refac: documents file handling 2024-07-15 13:05:38 +02:00
Timothy J. Baek 5e8a74ef74 refac 2024-07-15 12:20:09 +02:00
Timothy J. Baek 3cc3671e74 enh: custom icon support for actions 2024-07-15 12:15:00 +02:00
Timothy J. Baek d4d7c3d8b6 enh: citations link 2024-07-15 11:54:56 +02:00
Timothy J. Baek 69083b6485 revert 2024-07-15 11:09:05 +02:00
Timothy Jaeryang Baek feba1f2e3c Merge pull request #3875 from open-webui/dependabot/pip/backend/dev/pydantic-2.8.2
chore(deps): bump pydantic from 2.7.1 to 2.8.2 in /backend
2024-07-15 02:03:29 -07:00
Timothy Jaeryang Baek bb20251b43 Merge pull request #3878 from open-webui/dependabot/pip/backend/dev/unstructured-0.14.10
chore(deps): bump unstructured from 0.14.9 to 0.14.10 in /backend
2024-07-15 02:03:21 -07:00
Timothy J. Baek 1ec2e74b07 chore: format 2024-07-15 10:58:40 +02:00
Timothy Jaeryang Baek db6f6e62b9 Merge pull request #3876 from open-webui/dependabot/pip/backend/dev/sqlalchemy-2.0.31
chore(deps): bump sqlalchemy from 2.0.30 to 2.0.31 in /backend
2024-07-14 19:39:26 -07:00
Timothy Jaeryang Baek a99743c1c8 Merge pull request #3877 from open-webui/dependabot/pip/backend/dev/duckduckgo-search-approx-eq-6.1.12
chore(deps): update duckduckgo-search requirement from ~=6.1.7 to ~=6.1.12 in /backend
2024-07-14 19:39:00 -07:00
Timothy Jaeryang Baek 04dd0f2b72 Merge pull request #3879 from open-webui/dependabot/pip/backend/dev/chromadb-0.5.4
chore(deps): bump chromadb from 0.5.3 to 0.5.4 in /backend
2024-07-14 19:38:40 -07:00
dependabot[bot] b4eb630fc2 chore(deps): bump chromadb from 0.5.3 to 0.5.4 in /backend
Bumps [chromadb](https://github.com/chroma-core/chroma) from 0.5.3 to 0.5.4.
- [Release notes](https://github.com/chroma-core/chroma/releases)
- [Changelog](https://github.com/chroma-core/chroma/blob/main/RELEASE_PROCESS.md)
- [Commits](https://github.com/chroma-core/chroma/compare/0.5.3...0.5.4)

---
updated-dependencies:
- dependency-name: chromadb
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 02:34:49 +00:00
dependabot[bot] 8494b97e05 chore(deps): bump unstructured from 0.14.9 to 0.14.10 in /backend
Bumps [unstructured](https://github.com/Unstructured-IO/unstructured) from 0.14.9 to 0.14.10.
- [Release notes](https://github.com/Unstructured-IO/unstructured/releases)
- [Changelog](https://github.com/Unstructured-IO/unstructured/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Unstructured-IO/unstructured/compare/0.14.9...0.14.10)

---
updated-dependencies:
- dependency-name: unstructured
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 02:34:45 +00:00
dependabot[bot] a98ff3c151 chore(deps): update duckduckgo-search requirement in /backend
Updates the requirements on [duckduckgo-search](https://github.com/deedy5/duckduckgo_search) to permit the latest version.
- [Release notes](https://github.com/deedy5/duckduckgo_search/releases)
- [Commits](https://github.com/deedy5/duckduckgo_search/compare/v6.1.7...v6.1.12)

---
updated-dependencies:
- dependency-name: duckduckgo-search
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 02:34:40 +00:00
dependabot[bot] b16967a29f chore(deps): bump sqlalchemy from 2.0.30 to 2.0.31 in /backend
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 2.0.30 to 2.0.31.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)

---
updated-dependencies:
- dependency-name: sqlalchemy
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 02:34:36 +00:00
dependabot[bot] 73afa73286 chore(deps): bump pydantic from 2.7.1 to 2.8.2 in /backend
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.7.1 to 2.8.2.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.7.1...v2.8.2)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 02:34:23 +00:00
Timothy Jaeryang Baek 63ab526bfb Merge pull request #3815 from JerryKwan/issue3813
fix the checking logic in get_model_path
2024-07-14 13:53:44 -07:00
Timothy Jaeryang Baek cf92909d9a Merge pull request #3859 from aleixdorca/dev
i18n: Update Catalan Translation
2024-07-14 13:52:45 -07:00
aleix ca6a71749c i18n: Update Catalan Translation 2024-07-14 09:16:44 +02:00
Timothy Jaeryang Baek 79778fa221 Merge pull request #3850 from KarlLee830/translate
i18n: Add some missing i18n keys and update Chinese translation
2024-07-13 10:24:21 -07:00
Timothy Jaeryang Baek 6806b01327 Merge pull request #3839 from Peter-De-Ath/fix-logging
fix: logging - after db migration
2024-07-13 10:23:44 -07:00
Karl Lee 6f06577f18 i18n: Update Chinese translation 2024-07-13 21:26:44 +08:00
Karl Lee bc4bb0b4e5 chore: format 2024-07-13 21:22:38 +08:00
Karl Lee f40aee9d2e i18n: added some missing i18n keys 2024-07-13 21:22:16 +08:00
Karl Lee 26bf1ef621 i18n: Update Chinese translation 2024-07-13 21:14:45 +08:00
Peter De-Ath 03618fd2e0 fix: update logging configuration in env.py 2024-07-12 21:12:30 +01:00
Timothy Jaeryang Baek fa3721bcde Merge pull request #3824 from vquie/fix_translation
i18n: fix german translation for OAUTH_PROVIDER_NAME
2024-07-12 10:16:20 -07:00
Timothy Jaeryang Baek a049b38ab5 Merge pull request #3825 from michaelpoluektov/replace-message-event
feat: Replace message event
2024-07-12 10:15:43 -07:00
Michael Poluektov 540a669dae feat: replace message event 2024-07-12 10:41:03 +01:00
Vitali Quiering e266504463 Fix translation placeholder in German locale
- Corrected placeholder from {{Anbieter}} to {{provider}}
2024-07-12 11:40:10 +02:00
Jerry f07172bfe6 fix the checking logic in get_model_path
fix the checking logic in function get_model_path()
2024-07-12 14:21:37 +08:00
Timothy J. Baek 856845e5f2 refac 2024-07-11 19:05:59 -07:00
Timothy J. Baek 14c0efe300 feat: chat action integration 2024-07-11 18:47:38 -07:00
Timothy J. Baek eb10001eb7 feat: action function 2024-07-11 18:41:00 -07:00
Timothy J. Baek 90c3d68f00 enh: input type event call 2024-07-11 17:30:24 -07:00
Timothy J. Baek 97098edfeb feat: chat valves 2024-07-11 17:18:18 -07:00
Timothy J. Baek 9f9122b6d7 enh: ChatValves 2024-07-11 16:24:59 -07:00
Timothy J. Baek 8dcb3d78dc refac 2024-07-11 15:20:56 -07:00
Timothy J. Baek 4dd77b785a fix 2024-07-11 14:12:44 -07:00
Timothy J. Baek 7d7a29cfb9 fix 2024-07-11 13:53:47 -07:00
Timothy J. Baek f462744fc8 refac 2024-07-11 13:43:44 -07:00
Timothy J. Baek 9ab97b834a revert: reset vector db 2024-07-11 13:22:24 -07:00
Timothy J. Baek 7ba7b959a8 feat: message event 2024-07-11 11:00:42 -07:00
Timothy J. Baek b094153af2 fix 2024-07-11 10:41:13 -07:00
Timothy J. Baek 0ef27bfc5e refac 2024-07-11 10:40:10 -07:00
Timothy Jaeryang Baek a62b0924df Update config.json 2024-07-11 00:02:59 -05:00
Timothy Jaeryang Baek eff736acd2 Merge pull request #3774 from open-webui/dev
fix
2024-07-10 14:45:28 -07:00
Timothy J. Baek 38cc0da990 chore; format 2024-07-10 14:43:59 -07:00
Timothy J. Baek 37ff651723 refac 2024-07-10 14:43:00 -07:00
Timothy J. Baek fae7db89e6 chore: dockerfile 2024-07-10 14:29:39 -07:00
Timothy J. Baek ef21397f0d chore: dockerfile 2024-07-10 14:20:02 -07:00
Timothy Jaeryang Baek 2011cbd210 Merge pull request #3773 from open-webui/dev
fix: db
2024-07-10 13:36:15 -07:00
Timothy J. Baek ebcc5be1bf fix: db 2024-07-10 13:35:52 -07:00
Timothy Jaeryang Baek 3661dd16b8 Merge pull request #3769 from open-webui/dev
chore: requirements
2024-07-10 13:12:47 -07:00
Timothy J. Baek 2aa5d26735 chore: requirements 2024-07-10 13:10:36 -07:00
Timothy Jaeryang Baek d50639971a Merge pull request #3768 from open-webui/dev
dev
2024-07-10 13:07:52 -07:00
Timothy J. Baek fede1e9e3b chore: changelog 2024-07-10 13:06:27 -07:00
Timothy Jaeryang Baek f7777f489e Merge pull request #3753 from jonathan-rohde/fix/store-default-model
fix: preselect default model from config if no setting stored
2024-07-10 12:51:17 -07:00
Timothy Jaeryang Baek 93ae6084d6 Merge pull request #3755 from simonaszilinskas/patch-4
Update translation.json
2024-07-10 12:50:40 -07:00
Simonas 3b39334bae Update translation.json
Word not necessary in Lithuanian so modified it to be an arrow which would look good design wise and would not be weird gramatically
2024-07-10 04:35:16 -05:00
Jonathan Rohde da8ee43481 fix: use default model from config if available 2024-07-10 08:43:28 +02:00
Timothy J. Baek a843e81aaf chore: requirements 2024-07-09 18:23:52 -07:00
125 changed files with 6695 additions and 2273 deletions
+69
View File
@@ -5,6 +5,74 @@ 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.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
### Fixed
- **🔄 Improved File Upload**: Addressed the issue where file uploads lacked animation.
- **💬 Chat Continuity**: Fixed a problem where existing chats were not functioning properly in some instances.
- **🗂️ Chat File Reset**: Resolved the issue of chat files not resetting for new conversations, now ensuring a clean slate for each chat session.
- **📁 Document Workspace Uploads**: Corrected the handling of document uploads in the workspace using the Files API.
## [0.3.9] - 2024-07-17
### Added
- **📁 Files Chat Controls**: We've reverted to the old file handling behavior where uploaded files are always included. You can now manage files directly within the chat controls section, giving you the ability to remove files as needed.
- **🔧 "Action" Function Support**: Introducing a new "Action" function to write custom buttons to the message toolbar. This feature enables more interactive messaging, with documentation coming soon.
- **📜 Citations Handling**: For newly uploaded files in documents workspace, citations will now display the actual filename. Additionally, you can click on these filenames to open the file in a new tab for easier access.
- **🛠️ Event Emitter and Call Updates**: Enhanced 'event_emitter' to allow message replacement and 'event_call' to support text input for Tools and Functions. Detailed documentation will be provided shortly.
- **🎨 Styling Refactor**: Various styling updates for a cleaner and more cohesive user interface.
- **🌐 Enhanced Translations**: Improved translations for Catalan, Ukrainian, and Brazilian Portuguese.
### Fixed
- **🔧 Chat Controls Priority**: Resolved an issue where Chat Controls values were being overridden by model information parameters. The priority is now Chat Controls, followed by Global Settings, then Model Settings.
- **🪲 Debug Logs**: Fixed an issue where debug logs were not being logged properly.
- **🔑 Automatic1111 Auth Key**: The auth key for Automatic1111 is no longer required.
- **📝 Title Generation**: Ensured that the title generation runs only once, even when multiple models are in a chat.
- **✅ Boolean Values in Params**: Added support for boolean values in parameters.
- **🖼️ Files Overlay Styling**: Fixed the styling issue with the files overlay.
### Changed
- **⬆️ Dependency Updates**
- Upgraded 'pydantic' from version 2.7.1 to 2.8.2.
- Upgraded 'sqlalchemy' from version 2.0.30 to 2.0.31.
- Upgraded 'unstructured' from version 0.14.9 to 0.14.10.
- Upgraded 'chromadb' from version 0.5.3 to 0.5.4.
## [0.3.8] - 2024-07-09 ## [0.3.8] - 2024-07-09
### Added ### Added
@@ -27,6 +95,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- **🗃️ Database Backend**: Switched from Peewee to SQLAlchemy for improved concurrency support, enhancing database performance. - **🗃️ Database Backend**: Switched from Peewee to SQLAlchemy for improved concurrency support, enhancing database performance.
- **⬆️ ChromaDB Update**: Upgraded to version 0.5.3. Ensure your remote ChromaDB instance matches this version.
- **🔤 Primary Font Styling**: Updated primary font to Archivo for better visual consistency. - **🔤 Primary Font Styling**: Updated primary font to Archivo for better visual consistency.
- **🔄 Font Change for Windows**: Replaced Arimo with Inter font for Windows users, improving readability. - **🔄 Font Change for Windows**: Replaced Arimo with Inter font for Windows users, improving readability.
- **🚀 Lazy Loading**: Implemented lazy loading for 'faster_whisper' and 'sentence_transformers' to reduce startup memory usage. - **🚀 Lazy Loading**: Implemented lazy loading for 'faster_whisper' and 'sentence_transformers' to reduce startup memory usage.
+5 -3
View File
@@ -97,6 +97,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
apt-get update && \ apt-get update && \
# Install pandoc and netcat # Install pandoc and netcat
apt-get install -y --no-install-recommends pandoc netcat-openbsd curl && \ apt-get install -y --no-install-recommends pandoc netcat-openbsd curl && \
apt-get install -y --no-install-recommends gcc python3-dev && \
# for RAG OCR # for RAG OCR
apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \ apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \
# install helper tools # install helper tools
@@ -107,8 +108,9 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
rm -rf /var/lib/apt/lists/*; \ rm -rf /var/lib/apt/lists/*; \
else \ else \
apt-get update && \ apt-get update && \
# Install pandoc and netcat # Install pandoc, netcat and gcc
apt-get install -y --no-install-recommends pandoc netcat-openbsd curl jq && \ apt-get install -y --no-install-recommends pandoc gcc netcat-openbsd curl jq && \
apt-get install -y --no-install-recommends gcc python3-dev && \
# for RAG OCR # for RAG OCR
apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \ apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \
# cleanup # cleanup
@@ -149,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
View File
@@ -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()}
+16 -1
View File
@@ -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():
@@ -421,7 +427,7 @@ def save_url_image(url):
@app.post("/generations") @app.post("/generations")
def generate_image( async def image_generations(
form_data: GenerateImageForm, form_data: GenerateImageForm,
user=Depends(get_verified_user), user=Depends(get_verified_user),
): ):
@@ -497,6 +503,15 @@ def generate_image(
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(
+165 -8
View File
@@ -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()
+86 -26
View File
@@ -728,8 +728,10 @@ async def generate_chat_completion(
) )
payload = { payload = {
**form_data.model_dump(exclude_none=True), **form_data.model_dump(exclude_none=True, exclude=["metadata"]),
} }
if "metadata" in payload:
del payload["metadata"]
model_id = form_data.model model_id = form_data.model
model_info = Models.get_model_by_id(model_id) model_info = Models.get_model_by_id(model_id)
@@ -741,52 +743,85 @@ async def generate_chat_completion(
model_info.params = model_info.params.model_dump() model_info.params = model_info.params.model_dump()
if model_info.params: if model_info.params:
payload["options"] = {} if payload.get("options") is None:
payload["options"] = {}
if model_info.params.get("mirostat", None): if (
model_info.params.get("mirostat", None)
and payload["options"].get("mirostat") is None
):
payload["options"]["mirostat"] = model_info.params.get("mirostat", None) payload["options"]["mirostat"] = model_info.params.get("mirostat", None)
if model_info.params.get("mirostat_eta", None): if (
model_info.params.get("mirostat_eta", None)
and payload["options"].get("mirostat_eta") is None
):
payload["options"]["mirostat_eta"] = model_info.params.get( payload["options"]["mirostat_eta"] = model_info.params.get(
"mirostat_eta", None "mirostat_eta", None
) )
if model_info.params.get("mirostat_tau", None): if (
model_info.params.get("mirostat_tau", None)
and payload["options"].get("mirostat_tau") is None
):
payload["options"]["mirostat_tau"] = model_info.params.get( payload["options"]["mirostat_tau"] = model_info.params.get(
"mirostat_tau", None "mirostat_tau", None
) )
if model_info.params.get("num_ctx", None): if (
model_info.params.get("num_ctx", None)
and payload["options"].get("num_ctx") is None
):
payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None) payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
if model_info.params.get("num_batch", None): if (
model_info.params.get("num_batch", None)
and payload["options"].get("num_batch") is None
):
payload["options"]["num_batch"] = model_info.params.get( payload["options"]["num_batch"] = model_info.params.get(
"num_batch", None "num_batch", None
) )
if model_info.params.get("num_keep", None): if (
model_info.params.get("num_keep", None)
and payload["options"].get("num_keep") is None
):
payload["options"]["num_keep"] = model_info.params.get("num_keep", None) payload["options"]["num_keep"] = model_info.params.get("num_keep", None)
if model_info.params.get("repeat_last_n", None): if (
model_info.params.get("repeat_last_n", None)
and payload["options"].get("repeat_last_n") is None
):
payload["options"]["repeat_last_n"] = model_info.params.get( payload["options"]["repeat_last_n"] = model_info.params.get(
"repeat_last_n", None "repeat_last_n", None
) )
if model_info.params.get("frequency_penalty", None): if (
model_info.params.get("frequency_penalty", None)
and payload["options"].get("frequency_penalty") is None
):
payload["options"]["repeat_penalty"] = model_info.params.get( payload["options"]["repeat_penalty"] = model_info.params.get(
"frequency_penalty", None "frequency_penalty", None
) )
if model_info.params.get("temperature", None) is not None: if (
model_info.params.get("temperature", None) is not None
and payload["options"].get("temperature") is None
):
payload["options"]["temperature"] = model_info.params.get( payload["options"]["temperature"] = model_info.params.get(
"temperature", None "temperature", None
) )
if model_info.params.get("seed", None): if (
model_info.params.get("seed", None) is not 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)
if model_info.params.get("stop", None): if (
model_info.params.get("stop", None)
and payload["options"].get("stop") is None
):
payload["options"]["stop"] = ( payload["options"]["stop"] = (
[ [
bytes(stop, "utf-8").decode("unicode_escape") bytes(stop, "utf-8").decode("unicode_escape")
@@ -796,37 +831,62 @@ async def generate_chat_completion(
else None else None
) )
if model_info.params.get("tfs_z", None): if (
model_info.params.get("tfs_z", None)
and payload["options"].get("tfs_z") is None
):
payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None) payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None)
if model_info.params.get("max_tokens", None): if (
model_info.params.get("max_tokens", None)
and payload["options"].get("max_tokens") is None
):
payload["options"]["num_predict"] = model_info.params.get( payload["options"]["num_predict"] = model_info.params.get(
"max_tokens", None "max_tokens", None
) )
if model_info.params.get("top_k", None): if (
model_info.params.get("top_k", None)
and payload["options"].get("top_k") is None
):
payload["options"]["top_k"] = model_info.params.get("top_k", None) payload["options"]["top_k"] = model_info.params.get("top_k", None)
if model_info.params.get("top_p", None): if (
model_info.params.get("top_p", None)
and payload["options"].get("top_p") is None
):
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("use_mmap", 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 (
model_info.params.get("use_mmap", None)
and payload["options"].get("use_mmap") is None
):
payload["options"]["use_mmap"] = model_info.params.get("use_mmap", None) payload["options"]["use_mmap"] = model_info.params.get("use_mmap", None)
if model_info.params.get("use_mlock", None): if (
model_info.params.get("use_mlock", None)
and payload["options"].get("use_mlock") is None
):
payload["options"]["use_mlock"] = model_info.params.get( payload["options"]["use_mlock"] = model_info.params.get(
"use_mlock", None "use_mlock", None
) )
if model_info.params.get("num_thread", None): if (
model_info.params.get("num_thread", None)
and payload["options"].get("num_thread") is None
):
payload["options"]["num_thread"] = model_info.params.get( payload["options"]["num_thread"] = model_info.params.get(
"num_thread", None "num_thread", None
) )
system = model_info.params.get("system", None) system = model_info.params.get("system", None)
if system: if system:
# Check if the payload already has a system message
# If not, add a system message to the payload
system = prompt_template( system = prompt_template(
system, system,
**( **(
@@ -893,10 +953,10 @@ async def generate_openai_chat_completion(
user=Depends(get_verified_user), user=Depends(get_verified_user),
): ):
form_data = OpenAIChatCompletionForm(**form_data) form_data = OpenAIChatCompletionForm(**form_data)
payload = {**form_data.model_dump(exclude_none=True, exclude=["metadata"])}
payload = { if "metadata" in payload:
**form_data.model_dump(exclude_none=True), del payload["metadata"]
}
model_id = form_data.model model_id = form_data.model
model_info = Models.get_model_by_id(model_id) model_info = Models.get_model_by_id(model_id)
+27 -20
View File
@@ -21,6 +21,7 @@ from utils.utils import (
get_admin_user, get_admin_user,
) )
from utils.task import prompt_template from utils.task import prompt_template
from utils.misc import add_or_update_system_message
from config import ( from config import (
SRC_LOG_LEVELS, SRC_LOG_LEVELS,
@@ -357,6 +358,8 @@ async def generate_chat_completion(
): ):
idx = 0 idx = 0
payload = {**form_data} payload = {**form_data}
if "metadata" in payload:
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,24 +371,36 @@ async def generate_chat_completion(
model_info.params = model_info.params.model_dump() model_info.params = model_info.params.model_dump()
if model_info.params: if model_info.params:
if model_info.params.get("temperature", None) is not None: if (
model_info.params.get("temperature", None) is not None
and payload.get("temperature") is None
):
payload["temperature"] = float(model_info.params.get("temperature")) payload["temperature"] = float(model_info.params.get("temperature"))
if model_info.params.get("top_p", None): 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)) payload["top_p"] = int(model_info.params.get("top_p", None))
if model_info.params.get("max_tokens", 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)) payload["max_tokens"] = int(model_info.params.get("max_tokens", None))
if model_info.params.get("frequency_penalty", None): if (
model_info.params.get("frequency_penalty", None)
and payload.get("frequency_penalty") is None
):
payload["frequency_penalty"] = int( payload["frequency_penalty"] = int(
model_info.params.get("frequency_penalty", None) model_info.params.get("frequency_penalty", None)
) )
if model_info.params.get("seed", None): if (
model_info.params.get("seed", None) is not None
and payload.get("seed") is None
):
payload["seed"] = model_info.params.get("seed", None) payload["seed"] = model_info.params.get("seed", None)
if model_info.params.get("stop", None): if model_info.params.get("stop", None) and payload.get("stop") is None:
payload["stop"] = ( payload["stop"] = (
[ [
bytes(stop, "utf-8").decode("unicode_escape") bytes(stop, "utf-8").decode("unicode_escape")
@@ -410,21 +425,10 @@ async def generate_chat_completion(
else {} else {}
), ),
) )
# Check if the payload already has a system message
# If not, add a system message to the payload
if payload.get("messages"): if payload.get("messages"):
for message in payload["messages"]: payload["messages"] = add_or_update_system_message(
if message.get("role") == "system": system, payload["messages"]
message["content"] = system + message["content"] )
break
else:
payload["messages"].insert(
0,
{
"role": "system",
"content": system,
},
)
else: else:
pass pass
@@ -458,6 +462,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
+25 -6
View File
@@ -930,7 +930,9 @@ def store_web_search(form_data: SearchForm, user=Depends(get_verified_user)):
) )
def store_data_in_vector_db(data, collection_name, overwrite: bool = False) -> bool: def store_data_in_vector_db(
data, collection_name, metadata: Optional[dict] = None, overwrite: bool = False
) -> bool:
text_splitter = RecursiveCharacterTextSplitter( text_splitter = RecursiveCharacterTextSplitter(
chunk_size=app.state.config.CHUNK_SIZE, chunk_size=app.state.config.CHUNK_SIZE,
@@ -942,7 +944,7 @@ def store_data_in_vector_db(data, collection_name, overwrite: bool = False) -> b
if len(docs) > 0: if len(docs) > 0:
log.info(f"store_data_in_vector_db {docs}") log.info(f"store_data_in_vector_db {docs}")
return store_docs_in_vector_db(docs, collection_name, overwrite), None return store_docs_in_vector_db(docs, collection_name, metadata, overwrite), None
else: else:
raise ValueError(ERROR_MESSAGES.EMPTY_CONTENT) raise ValueError(ERROR_MESSAGES.EMPTY_CONTENT)
@@ -956,14 +958,16 @@ def store_text_in_vector_db(
add_start_index=True, add_start_index=True,
) )
docs = text_splitter.create_documents([text], metadatas=[metadata]) docs = text_splitter.create_documents([text], metadatas=[metadata])
return store_docs_in_vector_db(docs, collection_name, overwrite) return store_docs_in_vector_db(docs, collection_name, overwrite=overwrite)
def store_docs_in_vector_db(docs, collection_name, overwrite: bool = False) -> bool: def store_docs_in_vector_db(
docs, collection_name, metadata: Optional[dict] = None, overwrite: bool = False
) -> bool:
log.info(f"store_docs_in_vector_db {docs} {collection_name}") log.info(f"store_docs_in_vector_db {docs} {collection_name}")
texts = [doc.page_content for doc in docs] texts = [doc.page_content for doc in docs]
metadatas = [doc.metadata for doc in docs] metadatas = [{**doc.metadata, **(metadata if metadata else {})} for doc in docs]
# ChromaDB does not like datetime formats # ChromaDB does not like datetime formats
# for meta-data so convert them to string. # for meta-data so convert them to string.
@@ -1095,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 (
@@ -1237,13 +1248,21 @@ def process_doc(
data = loader.load() data = loader.load()
try: try:
result = store_data_in_vector_db(data, collection_name) result = store_data_in_vector_db(
data,
collection_name,
{
"file_id": form_data.file_id,
"name": file.meta.get("name", file.filename),
},
)
if result: if result:
return { return {
"status": True, "status": True,
"collection_name": collection_name, "collection_name": collection_name,
"known_type": known_type, "known_type": known_type,
"filename": file.meta.get("name", file.filename),
} }
except Exception as e: except Exception as e:
raise HTTPException( raise HTTPException(
+31 -2
View File
@@ -52,7 +52,6 @@ async def user_join(sid, data):
user = Users.get_user_by_id(data["id"]) user = Users.get_user_by_id(data["id"])
if user: if user:
SESSION_POOL[sid] = user.id SESSION_POOL[sid] = user.id
if user.id in USER_POOL: if user.id in USER_POOL:
USER_POOL[user.id].append(sid) USER_POOL[user.id].append(sid)
@@ -80,7 +79,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
@@ -137,3 +135,34 @@ async def disconnect(sid):
await sio.emit("user-count", {"count": len(USER_POOL)}) await sio.emit("user-count", {"count": len(USER_POOL)})
else: else:
print(f"Unknown session ID {sid} disconnected") print(f"Unknown session ID {sid} disconnected")
def get_event_emitter(request_info):
async def __event_emitter__(event_data):
await sio.emit(
"chat-events",
{
"chat_id": request_info["chat_id"],
"message_id": request_info["message_id"],
"data": event_data,
},
to=request_info["session_id"],
)
return __event_emitter__
def get_event_call(request_info):
async def __event_call__(event_data):
response = await sio.call(
"chat-events",
{
"chat_id": request_info["chat_id"],
"message_id": request_info["message_id"],
"data": event_data,
},
to=request_info["session_id"],
)
return response
return __event_call__
+244 -258
View File
@@ -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,
@@ -20,15 +17,17 @@ from apps.webui.routers import (
) )
from apps.webui.models.functions import Functions 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 (
openai_chat_chunk_message_template,
openai_chat_completion_message_template,
add_or_update_system_message,
)
from utils.task import prompt_template from utils.task import prompt_template
from config import ( from config import (
WEBUI_BUILD_HASH,
SHOW_ADMIN_DETAILS, SHOW_ADMIN_DETAILS,
ADMIN_EMAIL, ADMIN_EMAIL,
WEBUI_AUTH, WEBUI_AUTH,
@@ -36,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,
@@ -48,12 +48,12 @@ from config import (
OAUTH_PICTURE_CLAIM, OAUTH_PICTURE_CLAIM,
) )
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 from typing import Iterator, Generator, AsyncGenerator
from pydantic import BaseModel from pydantic import BaseModel
app = FastAPI() app = FastAPI()
@@ -63,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
@@ -124,57 +125,63 @@ 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_models.append( pipe_flag = {"type": pipe.type}
{ if hasattr(function_module, "ChatValves"):
"id": manifold_pipe_id, pipe_flag["valves_spec"] = function_module.ChatValves.schema()
"name": manifold_pipe_name,
"object": "model", pipe_models.append(
"created": pipe.created_at, {
"owned_by": "openai", "id": manifold_pipe_id,
"pipe": {"type": pipe.type}, "name": manifold_pipe_name,
} "object": "model",
) "created": pipe.created_at,
"owned_by": "openai",
"pipe": pipe_flag,
}
)
else: else:
pipe_flag = {"type": "pipe"}
if hasattr(function_module, "ChatValves"):
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
pipe_models.append( pipe_models.append(
{ {
"id": pipe.id, "id": pipe.id,
@@ -182,239 +189,218 @@ async def get_pipe_models():
"object": "model", "object": "model",
"created": pipe.created_at, "created": pipe.created_at,
"owned_by": "openai", "owned_by": "openai",
"pipe": {"type": "pipe"}, "pipe": pipe_flag,
} }
) )
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
# 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
# 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
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)
__event_emitter__ = None
__event_call__ = None
__task__ = None
if metadata:
if all(k in metadata for k in ("session_id", "chat_id", "message_id")):
__event_emitter__ = get_event_emitter(metadata)
__event_call__ = get_event_call(metadata)
__task__ = metadata.get("task", None)
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 form_data["stream"]: async for data in res.body_iterator:
yield data
async def stream_content(): return
try: if isinstance(res, dict):
if inspect.iscoroutinefunction(pipe): yield f"data: {json.dumps(res)}\n\n"
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)
+1 -1
View File
@@ -159,7 +159,7 @@ class AuthsTable:
log.info(f"authenticate_user_by_trusted_header: {email}") log.info(f"authenticate_user_by_trusted_header: {email}")
try: try:
with get_db() as db: with get_db() as db:
auth = db.query(Auth).filter(email=email, active=True).first() auth = db.query(Auth).filter_by(email=email, active=True).first()
if auth: if auth:
user = Users.get_user_by_id(auth.id) user = Users.get_user_by_id(auth.id)
return user return user
+32
View File
@@ -245,6 +245,38 @@ 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 = 50,
) -> 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
).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]:
+9
View File
@@ -167,6 +167,15 @@ class FunctionsTable:
.all() .all()
] ]
def get_global_action_functions(self) -> List[FunctionModel]:
with get_db() as db:
return [
FunctionModel.model_validate(function)
for function in db.query(Function)
.filter_by(type="action", is_active=True, is_global=True)
.all()
]
def get_function_valves_by_id(self, id: str) -> Optional[dict]: def get_function_valves_by_id(self, id: str) -> Optional[dict]:
with get_db() as db: with get_db() as db:
+2 -10
View File
@@ -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()
+1 -1
View File
@@ -100,7 +100,7 @@ class TagTable:
) -> Optional[TagModel]: ) -> Optional[TagModel]:
try: try:
with get_db() as db: with get_db() as db:
tag = db.query(Tag).filter(name=name, user_id=user_id).first() tag = db.query(Tag).filter_by(name=name, user_id=user_id).first()
return TagModel.model_validate(tag) return TagModel.model_validate(tag)
except Exception as e: except Exception as e:
return None return None
+1 -1
View File
@@ -45,7 +45,7 @@ router = APIRouter()
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), skip: int = 0, limit: int = 50
): ):
return Chats.get_chat_list_by_user_id(user.id, skip, limit) return Chats.get_chat_title_id_list_by_user_id(user.id, skip=skip, limit=limit)
############################ ############################
+2
View File
@@ -58,6 +58,7 @@ def upload_file(file: UploadFile = File(...), user=Depends(get_verified_user)):
# replace filename with uuid # replace filename with uuid
id = str(uuid.uuid4()) id = str(uuid.uuid4())
name = filename
filename = f"{id}_{filename}" filename = f"{id}_{filename}"
file_path = f"{UPLOAD_DIR}/{filename}" file_path = f"{UPLOAD_DIR}/{filename}"
@@ -73,6 +74,7 @@ def upload_file(file: UploadFile = File(...), user=Depends(get_verified_user)):
"id": id, "id": id,
"filename": filename, "filename": filename,
"meta": { "meta": {
"name": name,
"content_type": file.content_type, "content_type": file.content_type,
"size": len(contents), "size": len(contents),
"path": file_path, "path": file_path,
+15 -2
View File
@@ -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")
+2
View File
@@ -79,6 +79,8 @@ def load_function_module_by_id(function_id):
return module.Pipe(), "pipe", frontmatter return module.Pipe(), "pipe", frontmatter
elif hasattr(module, "Filter"): elif hasattr(module, "Filter"):
return module.Filter(), "filter", frontmatter return module.Filter(), "filter", frontmatter
elif hasattr(module, "Action"):
return module.Action(), "action", frontmatter
else: else:
raise Exception("No Function class found") raise Exception("No Function class found")
except Exception as e: except Exception as e:
+60
View File
@@ -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",
@@ -1265,6 +1302,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.getenv("COMFYUI_FLUX_FP8_CLIP", ""),
)
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 +1384,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",
+5 -5
View File
@@ -95,8 +95,8 @@ class TASKS(str, Enum):
def __str__(self) -> str: def __str__(self) -> str:
return super().__str__() return super().__str__()
DEFAULT = lambda task="": f"{task if task else 'default'}" DEFAULT = lambda task="": f"{task if task else 'generation'}"
TITLE_GENERATION = "Title Generation" TITLE_GENERATION = "title_generation"
EMOJI_GENERATION = "Emoji Generation" EMOJI_GENERATION = "emoji_generation"
QUERY_GENERATION = "Query Generation" QUERY_GENERATION = "query_generation"
FUNCTION_CALLING = "Function Calling" FUNCTION_CALLING = "function_calling"
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"version": 0, "version": 0,
"ui": { "ui": {
"default_locale": "en-US", "default_locale": "",
"prompt_suggestions": [ "prompt_suggestions": [
{ {
"title": ["Help me study", "vocabulary for a college entrance exam"], "title": ["Help me study", "vocabulary for a college entrance exam"],
+240 -72
View File
@@ -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 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,
) )
@@ -317,7 +316,7 @@ async def get_function_call_response(
{"role": "user", "content": f"Query: {prompt}"}, {"role": "user", "content": f"Query: {prompt}"},
], ],
"stream": False, "stream": False,
"task": TASKS.FUNCTION_CALLING, "task": str(TASKS.FUNCTION_CALLING),
} }
try: try:
@@ -618,38 +617,15 @@ class ChatCompletionMiddleware(BaseHTTPMiddleware):
content={"detail": str(e)}, content={"detail": str(e)},
) )
# Extract session_id, chat_id and message_id from the request body metadata = {
session_id = None "chat_id": body.pop("chat_id", None),
if "session_id" in body: "message_id": body.pop("id", None),
session_id = body["session_id"] "session_id": body.pop("session_id", None),
del body["session_id"] "valves": body.pop("valves", None),
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"]
async def __event_emitter__(data): __event_emitter__ = get_event_emitter(metadata)
await sio.emit( __event_call__ = get_event_call(metadata)
"chat-events",
{
"chat_id": chat_id,
"message_id": message_id,
"data": data,
},
to=session_id,
)
async def __event_call__(data):
response = await sio.call(
"chat-events",
{"chat_id": chat_id, "message_id": message_id, "data": data},
to=session_id,
)
return response
# 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 = []
@@ -692,17 +668,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"] = metadata
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
@@ -823,9 +811,6 @@ def filter_pipeline(payload, user):
if "detail" in res: if "detail" in res:
raise Exception(r.status_code, res["detail"]) raise Exception(r.status_code, res["detail"])
if "pipeline" not in app.state.MODELS[model_id] and "task" in payload:
del payload["task"]
return payload return payload
@@ -935,6 +920,7 @@ webui_app.state.EMBEDDING_FUNCTION = rag_app.state.EMBEDDING_FUNCTION
async def get_all_models(): async def get_all_models():
# TODO: Optimize this function
pipe_models = [] pipe_models = []
openai_models = [] openai_models = []
ollama_models = [] ollama_models = []
@@ -961,6 +947,14 @@ async def get_all_models():
models = pipe_models + openai_models + ollama_models models = pipe_models + openai_models + ollama_models
global_action_ids = [
function.id for function in Functions.get_global_action_functions()
]
enabled_action_ids = [
function.id
for function in Functions.get_functions_by_type("action", active_only=True)
]
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 == None:
@@ -971,9 +965,16 @@ 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 = []
if "info" in model and "meta" in model["info"]:
action_ids.extend(model["info"]["meta"].get("actionIds", []))
model["action_ids"] = action_ids
else: else:
owned_by = "openai" owned_by = "openai"
pipe = None pipe = None
action_ids = []
for model in models: for model in models:
if ( if (
@@ -983,6 +984,9 @@ async def get_all_models():
owned_by = model["owned_by"] owned_by = model["owned_by"]
if "pipe" in model: if "pipe" in model:
pipe = model["pipe"] pipe = model["pipe"]
if "info" in model and "meta" in model["info"]:
action_ids.extend(model["info"]["meta"].get("actionIds", []))
break break
models.append( models.append(
@@ -995,9 +999,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 {}),
"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
@@ -1036,13 +1090,24 @@ async def generate_chat_completions(form_data: dict, user=Depends(get_verified_u
status_code=status.HTTP_404_NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND,
detail="Model not found", detail="Model not found",
) )
model = app.state.MODELS[model_id] model = app.state.MODELS[model_id]
pipe = model.get("pipe") # `task` field is used to determine the type of the request, e.g. `title_generation`, `query_generation`, etc.
if pipe: task = None
if "task" in form_data:
task = form_data["task"]
del form_data["task"]
if task:
if "metadata" in form_data:
form_data["metadata"]["task"] = task
else:
form_data["metadata"] = {"task": task}
if model.get("pipe"):
return await generate_function_chat_completion(form_data, user=user) return await generate_function_chat_completion(form_data, user=user)
if model["owned_by"] == "ollama": if model["owned_by"] == "ollama":
print("generate_ollama_chat_completion")
return await generate_ollama_chat_completion(form_data, user=user) return await generate_ollama_chat_completion(form_data, user=user)
else: else:
return await generate_openai_chat_completion(form_data, user=user) return await generate_openai_chat_completion(form_data, user=user)
@@ -1101,30 +1166,27 @@ 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
async def __event_emitter__(event_data): __event_emitter__ = get_event_emitter(
await sio.emit( {
"chat-events", "chat_id": data["chat_id"],
{ "message_id": data["id"],
"chat_id": data["chat_id"], "session_id": data["session_id"],
"message_id": data["id"], }
"data": event_data, )
},
to=data["session_id"],
)
async def __event_call__(event_data): __event_call__ = get_event_call(
response = await sio.call( {
"chat-events", "chat_id": data["chat_id"],
{"chat_id": data["chat_id"], "message_id": data["id"], "data": event_data}, "message_id": data["id"],
to=data["session_id"], "session_id": data["session_id"],
) }
return response )
def get_priority(function_id): def get_priority(function_id):
function = Functions.get_function_by_id(function_id) function = Functions.get_function_by_id(function_id)
@@ -1222,6 +1284,110 @@ async def chat_completed(form_data: dict, user=Depends(get_verified_user)):
return data return data
@app.post("/api/chat/actions/{action_id}")
async def chat_action(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)
if not action:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Action not found",
)
data = form_data
model_id = data["model"]
if model_id not in app.state.MODELS:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Model not found",
)
model = app.state.MODELS[model_id]
__event_emitter__ = get_event_emitter(
{
"chat_id": data["chat_id"],
"message_id": data["id"],
"session_id": data["session_id"],
}
)
__event_call__ = get_event_call(
{
"chat_id": data["chat_id"],
"message_id": data["id"],
"session_id": data["session_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, "valves") and hasattr(function_module, "Valves"):
valves = Functions.get_function_valves_by_id(action_id)
function_module.valves = function_module.Valves(**(valves if valves else {}))
if hasattr(function_module, "action"):
try:
action = function_module.action
# Get the signature of the function
sig = inspect.signature(action)
params = {"body": data}
# Extra parameters to be passed to the function
extra_params = {
"__model__": model,
"__id__": sub_action_id if sub_action_id is not None else action_id,
"__event_emitter__": __event_emitter__,
"__event_call__": __event_call__,
}
# Add extra params in contained in function signature
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(
action_id, user.id
)
)
except Exception as e:
print(e)
params = {**params, "__user__": __user__}
if inspect.iscoroutinefunction(action):
data = await action(**params)
else:
data = action(**params)
except Exception as e:
print(f"Error: {e}")
return JSONResponse(
status_code=status.HTTP_400_BAD_REQUEST,
content={"detail": str(e)},
)
return data
################################## ##################################
# #
# Task Endpoints # Task Endpoints
@@ -1314,7 +1480,7 @@ async def generate_title(form_data: dict, user=Depends(get_verified_user)):
"stream": False, "stream": False,
"max_tokens": 50, "max_tokens": 50,
"chat_id": form_data.get("chat_id", None), "chat_id": form_data.get("chat_id", None),
"task": TASKS.TITLE_GENERATION, "task": str(TASKS.TITLE_GENERATION),
} }
log.debug(payload) log.debug(payload)
@@ -1367,7 +1533,7 @@ async def generate_search_query(form_data: dict, user=Depends(get_verified_user)
"messages": [{"role": "user", "content": content}], "messages": [{"role": "user", "content": content}],
"stream": False, "stream": False,
"max_tokens": 30, "max_tokens": 30,
"task": TASKS.QUERY_GENERATION, "task": str(TASKS.QUERY_GENERATION),
} }
print(payload) print(payload)
@@ -1424,7 +1590,7 @@ Message: """{{prompt}}"""
"stream": False, "stream": False,
"max_tokens": 4, "max_tokens": 4,
"chat_id": form_data.get("chat_id", None), "chat_id": form_data.get("chat_id", None),
"task": TASKS.EMOJI_GENERATION, "task": str(TASKS.EMOJI_GENERATION),
} }
log.debug(payload) log.debug(payload)
@@ -1577,7 +1743,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
@@ -1620,7 +1785,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
@@ -1698,7 +1862,6 @@ async def get_pipeline_valves(
models = await get_all_models() 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]
@@ -1833,6 +1996,7 @@ 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,
@@ -1949,6 +2113,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
@@ -1966,7 +2131,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)
+1 -1
View File
@@ -27,7 +27,7 @@ config = context.config
# Interpret the config file for Python logging. # Interpret the config file for Python logging.
# This line sets up loggers basically. # This line sets up loggers basically.
if config.config_file_name is not None: if config.config_file_name is not None:
fileConfig(config.config_file_name) fileConfig(config.config_file_name, disable_existing_loggers=False)
# add your model's MetaData object here # add your model's MetaData object here
# for 'autogenerate' support # for 'autogenerate' support
+12 -10
View File
@@ -1,6 +1,6 @@
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
@@ -12,7 +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.30 sqlalchemy==2.0.31
alembic==1.13.2 alembic==1.13.2
peewee==3.17.6 peewee==3.17.6
peewee-migrate==1.12.2 peewee-migrate==1.12.2
@@ -30,19 +30,20 @@ APScheduler==3.10.4
# AI libraries # AI libraries
openai openai
anthropic anthropic
google-generativeai==0.5.4 google-generativeai==0.7.2
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.3 chromadb==0.5.4
sentence-transformers==3.0.1 sentence-transformers==3.0.1
pypdf==4.2.0 pypdf==4.2.0
docx2txt==0.8 docx2txt==0.8
python-pptx==0.6.23 python-pptx==0.6.23
unstructured==0.14.9 unstructured==0.15.0
Markdown==3.6 Markdown==3.6
pypandoc==1.13 pypandoc==1.13
pandas==2.2.2 pandas==2.2.2
@@ -50,9 +51,10 @@ 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.28.1
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
@@ -63,13 +65,13 @@ PyJWT[crypto]==2.8.0
authlib==1.3.1 authlib==1.3.1
black==24.4.2 black==24.4.2
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.7 duckduckgo-search~=6.2.1
## Tests ## Tests
docker~=7.1.0 docker~=7.1.0
+54 -32
View File
@@ -1,6 +1,5 @@
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
@@ -8,37 +7,39 @@ import uuid
import time import time
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 +50,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 +88,29 @@ 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):
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):
template = openai_chat_message_template(model)
template["object"] = "chat.completion"
template["choices"][0]["message"] = {"content": message, "role": "assistant"}
template["choices"][0]["finish_reason"] = "stop"
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 +181,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 +277,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)
+9
View File
@@ -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.
+46
View File
@@ -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');
});
});
});
+49
View File
@@ -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();
}); });
+2
View File
@@ -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>;
} }
} }
+11 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.3.8", "version": "0.3.11",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "open-webui", "name": "open-webui",
"version": "0.3.8", "version": "0.3.11",
"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
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.3.8", "version": "0.3.11",
"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",
+2 -2
View File
@@ -23,7 +23,7 @@ dependencies = [
"peewee==3.17.5", "peewee==3.17.5",
"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", "boto3==1.34.110",
@@ -33,7 +33,7 @@ dependencies = [
"google-generativeai==0.5.4", "google-generativeai==0.5.4",
"langchain==0.2.0", "langchain==0.2.0",
"langchain-community==0.2.0", "langchain-community==0.2.9",
"langchain-chroma==0.1.1", "langchain-chroma==0.1.1",
"fake-useragent==1.5.1", "fake-useragent==1.5.1",
+4
View File
@@ -154,3 +154,7 @@ 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;
}
+5 -2
View File
@@ -65,6 +65,7 @@
%sveltekit.head% %sveltekit.head%
</head> </head>
<body data-sveltekit-preload-data="hover"> <body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div> <div style="display: contents">%sveltekit.body%</div>
@@ -86,7 +87,7 @@
height: 6rem; height: 6rem;
top: 44%; top: 44%;
left: 50%; left: 50%;
margin-left: -3rem; transform: translateX(-50%);
" "
src="/static/splash.png" src="/static/splash.png"
/> />
@@ -98,7 +99,7 @@
left: 50%; left: 50%;
width: 24rem; width: 24rem;
margin-left: -12rem; transform: translateX(-50%);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -154,6 +155,7 @@
#splash-screen { #splash-screen {
background: #fff; background: #fff;
} }
html.dark #splash-screen { html.dark #splash-screen {
background: #000; background: #000;
} }
@@ -210,6 +212,7 @@
opacity: 0.65; opacity: 0.65;
} }
} }
.animate-pulse-fast { .animate-pulse-fast {
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite; animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
} }
+56
View File
@@ -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;
};
+39
View File
@@ -104,6 +104,45 @@ export const chatCompleted = async (token: string, body: ChatCompletedForm) => {
return res; return res;
}; };
type ChatActionForm = {
model: string;
messages: string[];
chat_id: string;
};
export const chatAction = async (token: string, action_id: string, body: ChatActionForm) => {
let error = null;
const res = await fetch(`${WEBUI_BASE_URL}/api/chat/actions/${action_id}`, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
...(token && { authorization: `Bearer ${token}` })
},
body: JSON.stringify(body)
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
if ('detail' in err) {
error = err.detail;
} else {
error = err;
}
return null;
});
if (error) {
throw error;
}
return res;
};
export const getTaskConfig = async (token: string = '') => { export const getTaskConfig = async (token: string = '') => {
let error = null; let error = null;
+1 -1
View File
@@ -425,7 +425,7 @@ export const resetUploadDir = async (token: string) => {
export const resetVectorDB = async (token: string) => { export const resetVectorDB = async (token: string) => {
let error = null; let error = null;
const res = await fetch(`${RAG_API_BASE_URL}/reset`, { const res = await fetch(`${RAG_API_BASE_URL}/reset/db`, {
method: 'GET', method: 'GET',
headers: { headers: {
Accept: 'application/json', Accept: 'application/json',
+115 -43
View File
@@ -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>
@@ -282,6 +282,7 @@
<SensitiveInput <SensitiveInput
placeholder={$i18n.t('Enter api auth string (e.g. username:password)')} placeholder={$i18n.t('Enter api auth string (e.g. username:password)')}
bind:value={AUTOMATIC1111_API_AUTH} bind:value={AUTOMATIC1111_API_AUTH}
required={false}
/> />
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500"> <div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
+144 -43
View File
@@ -52,7 +52,7 @@
import { createOpenAITextStream } from '$lib/apis/streaming'; import { createOpenAITextStream } from '$lib/apis/streaming';
import { queryMemory } from '$lib/apis/memories'; import { queryMemory } from '$lib/apis/memories';
import { getAndUpdateUserLocation, getUserSettings } from '$lib/apis/users'; import { getAndUpdateUserLocation, getUserSettings } from '$lib/apis/users';
import { chatCompleted, generateTitle, generateSearchQuery } from '$lib/apis'; import { chatCompleted, generateTitle, generateSearchQuery, chatAction } from '$lib/apis';
import Banner from '../common/Banner.svelte'; import Banner from '../common/Banner.svelte';
import MessageInput from '$lib/components/chat/MessageInput.svelte'; import MessageInput from '$lib/components/chat/MessageInput.svelte';
@@ -78,6 +78,9 @@
let showEventConfirmation = false; let showEventConfirmation = false;
let eventConfirmationTitle = ''; let eventConfirmationTitle = '';
let eventConfirmationMessage = ''; let eventConfirmationMessage = '';
let eventConfirmationInput = false;
let eventConfirmationInputPlaceholder = '';
let eventConfirmationInputValue = '';
let eventCallback = null; let eventCallback = null;
let showModelSelector = true; let showModelSelector = true;
@@ -96,6 +99,8 @@
let title = ''; let title = '';
let prompt = ''; let prompt = '';
let chatFiles = [];
let files = []; let files = [];
let messages = []; let messages = [];
let history = { let history = {
@@ -156,12 +161,28 @@
} else { } else {
message.citations = [data]; message.citations = [data];
} }
} else if (type === 'message') {
message.content += data.content;
} else if (type === 'replace') {
message.content = data.content;
} else if (type === 'confirmation') { } else if (type === 'confirmation') {
eventCallback = cb; eventCallback = cb;
eventConfirmationInput = false;
showEventConfirmation = true; showEventConfirmation = true;
eventConfirmationTitle = data.title; eventConfirmationTitle = data.title;
eventConfirmationMessage = data.message; eventConfirmationMessage = data.message;
} else if (type === 'input') {
eventCallback = cb;
eventConfirmationInput = true;
showEventConfirmation = true;
eventConfirmationTitle = data.title;
eventConfirmationMessage = data.message;
eventConfirmationInputPlaceholder = data.placeholder;
eventConfirmationInputValue = data?.value ?? '';
} else { } else {
console.log('Unknown message type', data); console.log('Unknown message type', data);
} }
@@ -244,6 +265,8 @@
messages: {}, messages: {},
currentId: null currentId: null
}; };
chatFiles = [];
params = {}; params = {};
if ($page.url.searchParams.get('models')) { if ($page.url.searchParams.get('models')) {
@@ -259,6 +282,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();
@@ -315,6 +342,7 @@
} }
params = chatContent?.params ?? {}; params = chatContent?.params ?? {};
chatFiles = chatContent?.files ?? [];
autoScroll = true; autoScroll = true;
await tick(); await tick();
@@ -347,7 +375,7 @@
} }
}; };
const chatCompletedHandler = async (modelId, responseMessageId, messages) => { const chatCompletedHandler = async (chatId, modelId, responseMessageId, messages) => {
await mermaid.run({ await mermaid.run({
querySelector: '.mermaid' querySelector: '.mermaid'
}); });
@@ -361,7 +389,7 @@
info: m.info ? m.info : undefined, info: m.info ? m.info : undefined,
timestamp: m.timestamp timestamp: m.timestamp
})), })),
chat_id: $chatId, chat_id: chatId,
session_id: $socket?.id, session_id: $socket?.id,
id: responseMessageId id: responseMessageId
}).catch((error) => { }).catch((error) => {
@@ -383,6 +411,65 @@
}; };
} }
} }
if ($chatId == chatId) {
if ($settings.saveChatHistory ?? true) {
chat = await updateChatById(localStorage.token, chatId, {
models: selectedModels,
messages: messages,
history: history,
params: params,
files: chatFiles
});
await chats.set(await getChatList(localStorage.token));
}
}
};
const chatActionHandler = async (chatId, actionId, modelId, responseMessageId) => {
const res = await chatAction(localStorage.token, actionId, {
model: modelId,
messages: messages.map((m) => ({
id: m.id,
role: m.role,
content: m.content,
info: m.info ? m.info : undefined,
timestamp: m.timestamp
})),
chat_id: chatId,
session_id: $socket?.id,
id: responseMessageId
}).catch((error) => {
toast.error(error);
messages.at(-1).error = { content: error };
return null;
});
if (res !== null) {
// Update chat history with the new messages
for (const message of res.messages) {
history.messages[message.id] = {
...history.messages[message.id],
...(history.messages[message.id].content !== message.content
? { originalContent: history.messages[message.id].content }
: {}),
...message
};
}
}
if ($chatId == chatId) {
if ($settings.saveChatHistory ?? true) {
chat = await updateChatById(localStorage.token, chatId, {
models: selectedModels,
messages: messages,
history: history,
params: params,
files: chatFiles
});
await chats.set(await getChatList(localStorage.token));
}
}
}; };
const getChatEventEmitter = async (modelId: string, chatId: string = '') => { const getChatEventEmitter = async (modelId: string, chatId: string = '') => {
@@ -439,6 +526,13 @@
} }
const _files = JSON.parse(JSON.stringify(files)); const _files = JSON.parse(JSON.stringify(files));
chatFiles.push(..._files.filter((item) => ['doc', 'file', 'collection'].includes(item.type)));
chatFiles = chatFiles.filter(
// Remove duplicates
(item, index, array) =>
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
);
files = []; files = [];
prompt = ''; prompt = '';
@@ -617,6 +711,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();
@@ -679,24 +774,15 @@
} }
}); });
let files = []; let files = JSON.parse(JSON.stringify(chatFiles));
if (model?.info?.meta?.knowledge ?? false) { if (model?.info?.meta?.knowledge ?? false) {
files = model.info.meta.knowledge; files.push(...model.info.meta.knowledge);
} }
const lastUserMessage = messages.filter((message) => message.role === 'user').at(-1); files.push(
...(userMessage?.files ?? []).filter((item) =>
files = [ ['doc', 'file', 'collection'].includes(item.type)
...files, ),
...(lastUserMessage?.files?.filter((item) => ...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type))
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
) ?? []),
...(responseMessage?.files?.filter((item) =>
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
) ?? [])
].filter(
// Remove duplicates
(item, index, array) =>
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
); );
eventTarget.dispatchEvent( eventTarget.dispatchEvent(
@@ -752,7 +838,7 @@
controller.abort('User: Stop Response'); controller.abort('User: Stop Response');
} else { } else {
const messages = createMessagesList(responseMessageId); const messages = createMessagesList(responseMessageId);
await chatCompletedHandler(model.id, responseMessageId, messages); await chatCompletedHandler(_chatId, model.id, responseMessageId, messages);
} }
_response = responseMessage.content; _response = responseMessage.content;
@@ -860,7 +946,8 @@
messages: messages, messages: messages,
history: history, history: history,
models: selectedModels, models: selectedModels,
params: params params: params,
files: chatFiles
}); });
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
} }
@@ -914,7 +1001,7 @@
scrollToBottom(); scrollToBottom();
} }
if (messages.length == 2 && messages.at(1).content !== '') { if (messages.length == 2 && messages.at(1).content !== '' && selectedModels[0] === model.id) {
window.history.replaceState(history.state, '', `/c/${_chatId}`); window.history.replaceState(history.state, '', `/c/${_chatId}`);
const _title = await generateChatTitle(userPrompt); const _title = await generateChatTitle(userPrompt);
await setChatTitle(_chatId, _title); await setChatTitle(_chatId, _title);
@@ -925,25 +1012,19 @@
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];
let files = []; const responseMessage = history.messages[responseMessageId];
const userMessage = history.messages[responseMessage.parentId];
let files = JSON.parse(JSON.stringify(chatFiles));
if (model?.info?.meta?.knowledge ?? false) { if (model?.info?.meta?.knowledge ?? false) {
files = model.info.meta.knowledge; files.push(...model.info.meta.knowledge);
} }
const lastUserMessage = messages.filter((message) => message.role === 'user').at(-1); files.push(
files = [ ...(userMessage?.files ?? []).filter((item) =>
...files, ['doc', 'file', 'collection'].includes(item.type)
...(lastUserMessage?.files?.filter((item) => ),
['doc', 'file', 'collection', 'web_search_results'].includes(item.type) ...(responseMessage?.files ?? []).filter((item) => ['web_search_results'].includes(item.type))
) ?? []),
...(responseMessage?.files?.filter((item) =>
['doc', 'file', 'collection', 'web_search_results'].includes(item.type)
) ?? [])
].filter(
// Remove duplicates
(item, index, array) =>
array.findIndex((i) => JSON.stringify(i) === JSON.stringify(item)) === index
); );
scrollToBottom(); scrollToBottom();
@@ -1064,7 +1145,7 @@
} else { } else {
const messages = createMessagesList(responseMessageId); const messages = createMessagesList(responseMessageId);
await chatCompletedHandler(model.id, responseMessageId, messages); await chatCompletedHandler(_chatId, model.id, responseMessageId, messages);
} }
_response = responseMessage.content; _response = responseMessage.content;
@@ -1137,7 +1218,8 @@
models: selectedModels, models: selectedModels,
messages: messages, messages: messages,
history: history, history: history,
params: params params: params,
files: chatFiles
}); });
await chats.set(await getChatList(localStorage.token)); await chats.set(await getChatList(localStorage.token));
} }
@@ -1175,7 +1257,7 @@
scrollToBottom(); scrollToBottom();
} }
if (messages.length == 2) { if (messages.length == 2 && selectedModels[0] === model.id) {
window.history.replaceState(history.state, '', `/c/${_chatId}`); window.history.replaceState(history.state, '', `/c/${_chatId}`);
const _title = await generateChatTitle(userPrompt); const _title = await generateChatTitle(userPrompt);
@@ -1408,8 +1490,15 @@
bind:show={showEventConfirmation} bind:show={showEventConfirmation}
title={eventConfirmationTitle} title={eventConfirmationTitle}
message={eventConfirmationMessage} message={eventConfirmationMessage}
input={eventConfirmationInput}
inputPlaceholder={eventConfirmationInputPlaceholder}
inputValue={eventConfirmationInputValue}
on:confirm={(e) => { on:confirm={(e) => {
eventCallback(true); if (e.detail) {
eventCallback(e.detail);
} else {
eventCallback(true);
}
}} }}
on:cancel={() => { on:cancel={() => {
eventCallback(false); eventCallback(false);
@@ -1511,6 +1600,7 @@
{sendPrompt} {sendPrompt}
{continueGeneration} {continueGeneration}
{regenerateResponse} {regenerateResponse}
{chatActionHandler}
/> />
</div> </div>
</div> </div>
@@ -1539,6 +1629,17 @@
</div> </div>
</div> </div>
<ChatControls bind:show={showControls} bind:params /> <ChatControls
models={selectedModelIds.reduce((a, e, i, arr) => {
const model = $models.find((m) => m.id === e);
if (model) {
return [...a, model];
}
return a;
}, [])}
bind:show={showControls}
bind:chatFiles
bind:params
/>
</div> </div>
{/if} {/if}
@@ -6,7 +6,10 @@
export let show = false; export let show = false;
export let models = [];
export let chatId = null; export let chatId = null;
export let chatFiles = [];
export let params = {}; export let params = {};
let largeScreen = false; let largeScreen = false;
@@ -43,6 +46,8 @@
on:close={() => { on:close={() => {
show = false; show = false;
}} }}
{models}
bind:chatFiles
bind:params bind:params
/> />
</div> </div>
@@ -56,6 +61,8 @@
on:close={() => { on:close={() => {
show = false; show = false;
}} }}
{models}
bind:chatFiles
bind:params bind:params
/> />
</div> </div>
@@ -5,7 +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/chat/Controls/Valves.svelte';
import FileItem from '$lib/components/common/FileItem.svelte';
import Collapsible from '$lib/components/common/Collapsible.svelte';
export let models = [];
export let chatFiles = [];
export let params = {}; export let params = {};
</script> </script>
@@ -22,28 +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">
<div> {#if chatFiles.length > 0}
<div class="mb-1.5 font-medium">System Prompt</div> <Collapsible title={$i18n.t('Files')} open={true}>
<div class="flex flex-col gap-1 mt-1.5" slot="content">
{#each chatFiles as file, fileIdx}
<FileItem
className="w-full"
url={`${file?.url}`}
name={file.name}
type={file.type}
size={file?.size}
dismissible={true}
on:dismiss={() => {
// Remove the file from the chatFiles array
<div> chatFiles.splice(fileIdx, 1);
<textarea chatFiles = chatFiles;
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" {/each}
placeholder="Enter system prompt" </div>
/> </Collapsible>
<hr class="my-2 border-gray-100 dark:border-gray-800" />
{/if}
<Collapsible title={$i18n.t('Valves')}>
<div class="text-sm mt-1.5" slot="content">
<Valves />
</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" />
<div> <Collapsible title={$i18n.t('System Prompt')} open={true}>
<div class="mb-1.5 font-medium">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>
@@ -0,0 +1,188 @@
<script lang="ts">
import { toast } from 'svelte-sonner';
import { config, functions, models, settings, tools, user } from '$lib/stores';
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
import {
getUserValvesSpecById as getToolUserValvesSpecById,
getUserValvesById as getToolUserValvesById,
updateUserValvesById as updateToolUserValvesById
} from '$lib/apis/tools';
import {
getUserValvesSpecById as getFunctionUserValvesSpecById,
getUserValvesById as getFunctionUserValvesById,
updateUserValvesById as updateFunctionUserValvesById
} from '$lib/apis/functions';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Spinner from '$lib/components/common/Spinner.svelte';
import Valves from '$lib/components/common/Valves.svelte';
const dispatch = createEventDispatcher();
const i18n = getContext('i18n');
let tab = 'tools';
let selectedId = '';
let loading = false;
let valvesSpec = null;
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 () => {
loading = true;
if (tab === 'tools') {
valves = await getToolUserValvesById(localStorage.token, selectedId);
valvesSpec = await getToolUserValvesSpecById(localStorage.token, selectedId);
} else if (tab === 'functions') {
valves = await getFunctionUserValvesById(localStorage.token, selectedId);
valvesSpec = await getFunctionUserValvesSpecById(localStorage.token, selectedId);
}
if (valvesSpec) {
// Convert array to string
for (const property in valvesSpec.properties) {
if (valvesSpec.properties[property]?.type === 'array') {
valves[property] = (valves[property] ?? []).join(',');
}
}
}
loading = false;
};
const submitHandler = async () => {
if (valvesSpec) {
// Convert string to array
for (const property in valvesSpec.properties) {
if (valvesSpec.properties[property]?.type === 'array') {
valves[property] = (valves[property] ?? '').split(',').map((v) => v.trim());
}
}
if (tab === 'tools') {
const res = await updateToolUserValvesById(localStorage.token, selectedId, valves).catch(
(error) => {
toast.error(error);
return null;
}
);
if (res) {
toast.success($i18n.t('Valves updated'));
valves = res;
}
} else if (tab === 'functions') {
const res = await updateFunctionUserValvesById(
localStorage.token,
selectedId,
valves
).catch((error) => {
toast.error(error);
return null;
});
if (res) {
toast.success($i18n.t('Valves updated'));
valves = res;
}
}
}
};
$: if (tab) {
selectedId = '';
}
$: if (selectedId) {
getUserValves();
}
</script>
<form
class="flex flex-col h-full justify-between space-y-3 text-sm"
on:submit|preventDefault={() => {
submitHandler();
dispatch('save');
}}
>
<div class="flex flex-col">
<div class="space-y-1">
<div class="flex gap-2">
<div class="flex-1">
<select
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}
on:change={async () => {
await tick();
}}
>
{#if tab === 'tools'}
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-800"
>{$i18n.t('Select a tool')}</option
>
{#each $tools as tool, toolIdx}
<option value={tool.id} class="bg-gray-100 dark:bg-gray-800">{tool.name}</option>
{/each}
{:else if tab === 'functions'}
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-800"
>{$i18n.t('Select a function')}</option
>
{#each $functions as func, funcIdx}
<option value={func.id} class="bg-gray-100 dark:bg-gray-800">{func.name}</option>
{/each}
{/if}
</select>
</div>
</div>
</div>
{#if selectedId}
<hr class="dark:border-gray-800 my-1 w-full" />
<div class="my-2 text-xs">
{#if !loading}
<Valves
{valvesSpec}
bind:valves
on:change={() => {
debounceSubmitHandler();
}}
/>
{:else}
<Spinner className="size-5" />
{/if}
</div>
{/if}
</div>
</form>
+72 -174
View File
@@ -40,6 +40,8 @@
import Headphone from '../icons/Headphone.svelte'; import Headphone from '../icons/Headphone.svelte';
import VoiceRecording from './MessageInput/VoiceRecording.svelte'; import VoiceRecording from './MessageInput/VoiceRecording.svelte';
import { transcribeAudio } from '$lib/apis/audio'; import { transcribeAudio } from '$lib/apis/audio';
import FileItem from '../common/FileItem.svelte';
import FilesOverlay from './MessageInput/FilesOverlay.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@@ -96,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) => {
@@ -110,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);
} }
}; };
@@ -160,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;
} }
@@ -297,24 +308,7 @@
}); });
</script> </script>
{#if dragged} <FilesOverlay show={dragged} />
<div
class="fixed {$showSidebar
? 'left-0 md:left-[260px] md:w-[calc(100%-260px)]'
: 'left-0'} w-full h-full flex z-50 touch-none pointer-events-none"
id="dropzone"
role="region"
aria-label="Drag and Drop Container"
>
<div class="absolute w-full h-full backdrop-blur bg-gray-800/40 flex justify-center">
<div class="m-auto pt-64 flex flex-col justify-center">
<div class="max-w-md">
<AddFilesPlaceholder />
</div>
</div>
</div>
</div>
{/if}
<div class="w-full font-primary"> <div class="w-full font-primary">
<div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center"> <div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
@@ -500,10 +494,10 @@
dir={$settings?.chatDirection ?? 'LTR'} dir={$settings?.chatDirection ?? 'LTR'}
> >
{#if files.length > 0} {#if files.length > 0}
<div class="mx-2 mt-2 mb-1 flex flex-wrap gap-2"> <div class="mx-1 mt-2.5 mb-1 flex flex-wrap gap-2">
{#each files as file, fileIdx} {#each files as file, fileIdx}
<div class=" relative group"> {#if file.type === 'image'}
{#if file.type === 'image'} <div class=" relative group">
<div class="relative"> <div class="relative">
<img <img
src={file.url} src={file.url}
@@ -534,137 +528,41 @@
</Tooltip> </Tooltip>
{/if} {/if}
</div> </div>
{:else if ['doc', 'file'].includes(file.type)} <div class=" absolute -top-1 -right-1">
<div <button
class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none" class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
> type="button"
<div class="p-2.5 bg-red-400 text-white rounded-lg"> on:click={() => {
{#if file.status === 'processed'} files.splice(fileIdx, 1);
<svg files = files;
xmlns="http://www.w3.org/2000/svg" }}
viewBox="0 0 24 24" >
fill="currentColor"
class="w-6 h-6"
>
<path
fill-rule="evenodd"
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
clip-rule="evenodd"
/>
<path
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
/>
</svg>
{:else}
<svg
class=" w-6 h-6 translate-y-[0.5px]"
fill="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
><style>
.spinner_qM83 {
animation: spinner_8HQG 1.05s infinite;
}
.spinner_oXPr {
animation-delay: 0.1s;
}
.spinner_ZTLf {
animation-delay: 0.2s;
}
@keyframes spinner_8HQG {
0%,
57.14% {
animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
transform: translate(0);
}
28.57% {
animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
transform: translateY(-6px);
}
100% {
transform: translate(0);
}
}
</style><circle
class="spinner_qM83"
cx="4"
cy="12"
r="2.5"
/><circle
class="spinner_qM83 spinner_oXPr"
cx="12"
cy="12"
r="2.5"
/><circle
class="spinner_qM83 spinner_ZTLf"
cx="20"
cy="12"
r="2.5"
/></svg
>
{/if}
</div>
<div class="flex flex-col justify-center -space-y-0.5">
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
{file.name}
</div>
<div class=" text-gray-500 text-sm">{$i18n.t('Document')}</div>
</div>
</div>
{:else if file.type === 'collection'}
<div
class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none"
>
<div class="p-2.5 bg-red-400 text-white rounded-lg">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24" viewBox="0 0 20 20"
fill="currentColor" fill="currentColor"
class="w-6 h-6" class="w-4 h-4"
> >
<path <path
d="M7.5 3.375c0-1.036.84-1.875 1.875-1.875h.375a3.75 3.75 0 0 1 3.75 3.75v1.875C13.5 8.161 14.34 9 15.375 9h1.875A3.75 3.75 0 0 1 21 12.75v3.375C21 17.16 20.16 18 19.125 18h-9.75A1.875 1.875 0 0 1 7.5 16.125V3.375Z" d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
<path
d="M15 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 17.25 7.5h-1.875A.375.375 0 0 1 15 7.125V5.25ZM4.875 6H6v10.125A3.375 3.375 0 0 0 9.375 19.5H16.5v1.125c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 0 1 3 20.625V7.875C3 6.839 3.84 6 4.875 6Z"
/> />
</svg> </svg>
</div> </button>
<div class="flex flex-col justify-center -space-y-0.5">
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
{file?.title ?? `#${file.name}`}
</div>
<div class=" text-gray-500 text-sm">{$i18n.t('Collection')}</div>
</div>
</div> </div>
{/if}
<div class=" absolute -top-1 -right-1">
<button
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
type="button"
on:click={() => {
files.splice(fileIdx, 1);
files = files;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div> </div>
</div> {:else}
<FileItem
name={file.name}
type={file.type}
size={file?.size}
status={file.status}
dismissible={true}
on:dismiss={() => {
files.splice(fileIdx, 1);
files = files;
}}
/>
{/if}
{/each} {/each}
</div> </div>
{/if} {/if}
@@ -0,0 +1,35 @@
<script lang="ts">
import { showSidebar } from '$lib/stores';
import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte';
export let show = false;
let overlayElement = null;
$: if (show && overlayElement) {
document.body.appendChild(overlayElement);
document.body.style.overflow = 'hidden';
} else if (overlayElement) {
document.body.removeChild(overlayElement);
document.body.style.overflow = 'unset';
}
</script>
{#if show}
<div
bind:this={overlayElement}
class="fixed {$showSidebar
? 'left-0 md:left-[260px] md:w-[calc(100%-260px)]'
: 'left-0'} fixed top-0 right-0 bottom-0 w-full h-full flex z-[9999] touch-none pointer-events-none"
id="dropzone"
role="region"
aria-label="Drag and Drop Container"
>
<div class="absolute w-full h-full backdrop-blur bg-gray-800/40 flex justify-center">
<div class="m-auto pt-64 flex flex-col justify-center">
<div class="max-w-md">
<AddFilesPlaceholder />
</div>
</div>
</div>
</div>
{/if}
+4
View File
@@ -22,6 +22,7 @@
export let sendPrompt: Function; export let sendPrompt: Function;
export let continueGeneration: Function; export let continueGeneration: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let chatActionHandler: Function;
export let user = $_user; export let user = $_user;
export let prompt; export let prompt;
@@ -335,6 +336,9 @@
copyToClipboard={copyToClipboardWithToast} copyToClipboard={copyToClipboardWithToast}
{continueGeneration} {continueGeneration}
{regenerateResponse} {regenerateResponse}
on:action={async (e) => {
await chatActionHandler(chatId, e.detail, message.model, message.id);
}}
on:save={async (e) => { on:save={async (e) => {
console.log('save', e); console.log('save', e);
@@ -1,6 +1,5 @@
<script lang="ts"> <script lang="ts">
import { getContext, onMount, tick } from 'svelte'; import { getContext, onMount, tick } from 'svelte';
import Modal from '$lib/components/common/Modal.svelte'; import Modal from '$lib/components/common/Modal.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@@ -54,9 +53,25 @@
<div class="text-sm font-medium dark:text-gray-300"> <div class="text-sm font-medium dark:text-gray-300">
{$i18n.t('Source')} {$i18n.t('Source')}
</div> </div>
<div class="text-sm dark:text-gray-400">
{document.source?.name ?? $i18n.t('No source available')} {#if document.source?.name}
</div> <div class="text-sm dark:text-gray-400">
<a
href={document?.metadata?.file_id
? `/api/v1/files/${document?.metadata?.file_id}/content`
: document.source.name.includes('http')
? document.source.name
: `#`}
target="_blank"
>
{document?.metadata?.name ?? document.source.name}
</a>
</div>
{:else}
<div class="text-sm dark:text-gray-400">
{$i18n.t('No source available')}
</div>
{/if}
</div> </div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class=" text-sm font-medium dark:text-gray-300"> <div class=" text-sm font-medium dark:text-gray-300">
@@ -37,6 +37,7 @@
import CitationsModal from '$lib/components/chat/Messages/CitationsModal.svelte'; import CitationsModal from '$lib/components/chat/Messages/CitationsModal.svelte';
import Spinner from '$lib/components/common/Spinner.svelte'; import Spinner from '$lib/components/common/Spinner.svelte';
import WebSearchResults from './ResponseMessage/WebSearchResults.svelte'; import WebSearchResults from './ResponseMessage/WebSearchResults.svelte';
import Sparkles from '$lib/components/icons/Sparkles.svelte';
export let message; export let message;
export let siblings; export let siblings;
@@ -54,6 +55,7 @@
export let copyToClipboard: Function; export let copyToClipboard: Function;
export let continueGeneration: Function; export let continueGeneration: Function;
export let regenerateResponse: Function; export let regenerateResponse: Function;
export let chatActionHandler: Function;
let model = null; let model = null;
$: model = $models.find((m) => m.id === message.model); $: model = $models.find((m) => m.id === message.model);
@@ -173,7 +175,10 @@
delimiters: [ delimiters: [
{ left: '$$', right: '$$', display: false }, { left: '$$', right: '$$', display: false },
{ left: '$ ', right: ' $', display: false }, { left: '$ ', right: ' $', display: false },
{ left: '\\pu{', right: '}', display: false },
{ left: '\\ce{', right: '}', display: false },
{ left: '\\(', right: '\\)', display: false }, { left: '\\(', right: '\\)', display: false },
{ left: '( ', right: ' )', display: false },
{ left: '\\[', right: '\\]', display: false }, { left: '\\[', right: '\\]', display: false },
{ left: '[ ', right: ' ]', display: false } { left: '[ ', right: ' ]', display: false }
], ],
@@ -216,7 +221,7 @@
if ((message?.content ?? '').trim() !== '') { if ((message?.content ?? '').trim() !== '') {
speaking = true; speaking = true;
if ($config.audio.tts.engine === 'openai') { if ($config.audio.tts.engine !== '') {
loadingSpeech = true; loadingSpeech = true;
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => { const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
@@ -248,7 +253,9 @@
for (const [idx, sentence] of sentences.entries()) { for (const [idx, sentence] of sentences.entries()) {
const res = await synthesizeOpenAISpeech( const res = await synthesizeOpenAISpeech(
localStorage.token, localStorage.token,
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice, $settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice
? $settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice
: $config?.audio?.tts?.voice,
sentence sentence
).catch((error) => { ).catch((error) => {
toast.error(error); toast.error(error);
@@ -431,7 +438,7 @@
{@const status = ( {@const status = (
message?.statusHistory ?? [...(message?.status ? [message?.status] : [])] message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]
).at(-1)} ).at(-1)}
<div class="flex items-center gap-2 pt-1 pb-1"> <div class="flex items-center gap-2 pt-0.5 pb-1">
{#if status.done === false} {#if status.done === false}
<div class=""> <div class="">
<Spinner className="size-4" /> <Spinner className="size-4" />
@@ -564,6 +571,11 @@
const metadata = citation.metadata?.[index]; const metadata = citation.metadata?.[index];
const id = metadata?.source ?? 'N/A'; const id = metadata?.source ?? 'N/A';
let source = citation?.source; let source = citation?.source;
if (metadata?.name) {
source = { ...source, name: metadata.name };
}
// Check if ID looks like a URL // Check if ID looks like a URL
if (id.startsWith('http://') || id.startsWith('https://')) { if (id.startsWith('http://') || id.startsWith('https://')) {
source = { name: id }; source = { name: id };
@@ -1020,6 +1032,33 @@
</svg> </svg>
</button> </button>
</Tooltip> </Tooltip>
{#each model?.actions ?? [] as action}
<Tooltip content={action.name} placement="bottom">
<button
type="button"
class="{isLastMessage
? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
on:click={() => {
dispatch('action', action.id);
}}
>
{#if action.icon_url}
<img
src={action.icon_url}
class="w-4 h-4 {action.icon_url.includes('svg')
? 'dark:invert-[80%]'
: ''}"
style="fill: currentColor;"
alt={action.name}
/>
{:else}
<Sparkles strokeWidth="2.1" className="size-4" />
{/if}
</button>
</Tooltip>
{/each}
{/if} {/if}
{/if} {/if}
{/if} {/if}
@@ -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}"
@@ -9,6 +9,7 @@
import { user as _user } from '$lib/stores'; import { user as _user } from '$lib/stores';
import { getFileContentById } from '$lib/apis/files'; import { getFileContentById } from '$lib/apis/files';
import FileItem from '$lib/components/common/FileItem.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@@ -98,107 +99,14 @@
<div class={$settings?.chatBubble ?? true ? 'self-end' : ''}> <div class={$settings?.chatBubble ?? true ? 'self-end' : ''}>
{#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 if file.type === 'file'} {:else}
<button <FileItem
class="h-16 w-72 flex items-center space-x-3 px-2.5 dark:bg-gray-850 rounded-xl border border-gray-200 dark:border-none text-left" url={file.url}
type="button" name={file.name}
on:click={async () => { type={file.type}
if (file?.url) { size={file?.size}
window.open(`${file?.url}/content`, '_blank').focus(); colorClassName="bg-white dark:bg-gray-850 "
} />
}}
>
<div class="p-2.5 bg-red-400 text-white rounded-lg">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
class="w-6 h-6"
>
<path
fill-rule="evenodd"
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
clip-rule="evenodd"
/>
<path
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
/>
</svg>
</div>
<div class="flex flex-col justify-center -space-y-0.5">
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
{file.name}
</div>
<div class=" text-gray-500 text-sm">{$i18n.t('File')}</div>
</div>
</button>
{:else if file.type === 'doc'}
<button
class="h-16 w-72 flex items-center space-x-3 px-2.5 dark:bg-gray-850 rounded-xl border border-gray-200 dark:border-none text-left"
type="button"
on:click={() => {
if (file?.url) {
window.open(file?.url, '_blank').focus();
}
}}
>
<div class="p-2.5 bg-red-400 text-white rounded-lg">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
class="w-6 h-6"
>
<path
fill-rule="evenodd"
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
clip-rule="evenodd"
/>
<path
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
/>
</svg>
</div>
<div class="flex flex-col justify-center -space-y-0.5">
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
{file.name}
</div>
<div class=" text-gray-500 text-sm">{$i18n.t('Document')}</div>
</div>
</button>
{:else if file.type === 'collection'}
<button
class="h-16 w-72 flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none text-left"
type="button"
>
<div class="p-2.5 bg-red-400 text-white rounded-lg">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
class="w-6 h-6"
>
<path
d="M7.5 3.375c0-1.036.84-1.875 1.875-1.875h.375a3.75 3.75 0 0 1 3.75 3.75v1.875C13.5 8.161 14.34 9 15.375 9h1.875A3.75 3.75 0 0 1 21 12.75v3.375C21 17.16 20.16 18 19.125 18h-9.75A1.875 1.875 0 0 1 7.5 16.125V3.375Z"
/>
<path
d="M15 5.25a5.23 5.23 0 0 0-1.279-3.434 9.768 9.768 0 0 1 6.963 6.963A5.23 5.23 0 0 0 17.25 7.5h-1.875A.375.375 0 0 1 15 7.125V5.25ZM4.875 6H6v10.125A3.375 3.375 0 0 0 9.375 19.5H16.5v1.125c0 1.035-.84 1.875-1.875 1.875h-9.75A1.875 1.875 0 0 1 3 20.625V7.875C3 6.839 3.84 6 4.875 6Z"
/>
</svg>
</div>
<div class="flex flex-col justify-center -space-y-0.5">
<div class=" dark:text-gray-100 text-sm font-medium line-clamp-1">
{file?.title ?? `#${file.name}`}
</div>
<div class=" text-gray-500 text-sm">{$i18n.t('Collection')}</div>
</div>
</button>
{/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>
@@ -1,4 +1,5 @@
<script lang="ts"> <script lang="ts">
import Switch from '$lib/components/common/Switch.svelte';
import { getContext, createEventDispatcher } from 'svelte'; import { getContext, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@@ -19,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,
@@ -384,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>
@@ -720,10 +768,22 @@
{#if (params?.use_mmap ?? null) === null} {#if (params?.use_mmap ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span> <span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else} {:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span> <span class="ml-2 self-center">{$i18n.t('Custom')}</span>
{/if} {/if}
</button> </button>
</div> </div>
{#if (params?.use_mmap ?? null) !== null}
<div class="flex justify-between items-center mt-1">
<div class="text-xs text-gray-500">
{params.use_mmap ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch bind:state={params.use_mmap} />
</div>
</div>
{/if}
</div> </div>
<div class=" py-0.5 w-full justify-between"> <div class=" py-0.5 w-full justify-between">
@@ -740,10 +800,22 @@
{#if (params?.use_mlock ?? null) === null} {#if (params?.use_mlock ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span> <span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else} {:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span> <span class="ml-2 self-center">{$i18n.t('Custom')}</span>
{/if} {/if}
</button> </button>
</div> </div>
{#if (params?.use_mlock ?? null) !== null}
<div class="flex justify-between items-center mt-1">
<div class="text-xs text-gray-500">
{params.use_mlock ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch bind:state={params.use_mlock} />
</div>
</div>
{/if}
</div> </div>
<div class=" py-0.5 w-full justify-between"> <div class=" py-0.5 w-full justify-between">
+33 -27
View File
@@ -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>
@@ -144,7 +144,10 @@
chatDirection = $settings.chatDirection ?? 'LTR'; chatDirection = $settings.chatDirection ?? 'LTR';
userLocation = $settings.userLocation ?? false; userLocation = $settings.userLocation ?? false;
defaultModelId = ($settings?.models ?? ['']).at(0); defaultModelId = $settings?.models?.at(0) ?? '';
if ($config?.default_models) {
defaultModelId = $config.default_models.split(',')[0];
}
backgroundImageUrl = $settings.backgroundImageUrl ?? null; backgroundImageUrl = $settings.backgroundImageUrl ?? null;
}); });
@@ -1,273 +0,0 @@
<script lang="ts">
import { toast } from 'svelte-sonner';
import { config, functions, models, settings, tools, user } from '$lib/stores';
import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
import {
getUserValvesSpecById as getToolUserValvesSpecById,
getUserValvesById as getToolUserValvesById,
updateUserValvesById as updateToolUserValvesById
} from '$lib/apis/tools';
import {
getUserValvesSpecById as getFunctionUserValvesSpecById,
getUserValvesById as getFunctionUserValvesById,
updateUserValvesById as updateFunctionUserValvesById
} from '$lib/apis/functions';
import ManageModal from './Personalization/ManageModal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Spinner from '$lib/components/common/Spinner.svelte';
import Switch from '$lib/components/common/Switch.svelte';
const dispatch = createEventDispatcher();
const i18n = getContext('i18n');
export let saveSettings: Function;
let tab = 'tools';
let selectedId = '';
let loading = false;
let valvesSpec = null;
let valves = {};
const getUserValves = async () => {
loading = true;
if (tab === 'tools') {
valves = await getToolUserValvesById(localStorage.token, selectedId);
valvesSpec = await getToolUserValvesSpecById(localStorage.token, selectedId);
} else if (tab === 'functions') {
valves = await getFunctionUserValvesById(localStorage.token, selectedId);
valvesSpec = await getFunctionUserValvesSpecById(localStorage.token, selectedId);
}
if (valvesSpec) {
// Convert array to string
for (const property in valvesSpec.properties) {
if (valvesSpec.properties[property]?.type === 'array') {
valves[property] = (valves[property] ?? []).join(',');
}
}
}
loading = false;
};
const submitHandler = async () => {
if (valvesSpec) {
// Convert string to array
for (const property in valvesSpec.properties) {
if (valvesSpec.properties[property]?.type === 'array') {
valves[property] = (valves[property] ?? '').split(',').map((v) => v.trim());
}
}
if (tab === 'tools') {
const res = await updateToolUserValvesById(localStorage.token, selectedId, valves).catch(
(error) => {
toast.error(error);
return null;
}
);
if (res) {
toast.success($i18n.t('Valves updated'));
valves = res;
}
} else if (tab === 'functions') {
const res = await updateFunctionUserValvesById(
localStorage.token,
selectedId,
valves
).catch((error) => {
toast.error(error);
return null;
});
if (res) {
toast.success($i18n.t('Valves updated'));
valves = res;
}
}
}
};
$: if (tab) {
selectedId = '';
}
$: if (selectedId) {
getUserValves();
}
</script>
<form
class="flex flex-col h-full justify-between space-y-3 text-sm"
on:submit|preventDefault={() => {
submitHandler();
dispatch('save');
}}
>
<div class="flex flex-col pr-1.5 overflow-y-scroll max-h-[25rem]">
<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="flex gap-2">
<div class="flex-1">
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={selectedId}
on:change={async () => {
await tick();
}}
>
{#if tab === 'tools'}
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-700"
>{$i18n.t('Select a tool')}</option
>
{#each $tools as tool, toolIdx}
<option value={tool.id} class="bg-gray-100 dark:bg-gray-700">{tool.name}</option>
{/each}
{:else if tab === 'functions'}
<option value="" selected disabled class="bg-gray-100 dark:bg-gray-700"
>{$i18n.t('Select a function')}</option
>
{#each $functions as func, funcIdx}
<option value={func.id} class="bg-gray-100 dark:bg-700">{func.name}</option>
{/each}
{/if}
</select>
</div>
</div>
</div>
{#if selectedId}
<hr class="dark:border-gray-800 my-3 w-full" />
<div>
{#if !loading}
{#if valvesSpec}
{#each Object.keys(valvesSpec.properties) as property, idx}
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">
{valvesSpec.properties[property].title}
{#if (valvesSpec?.required ?? []).includes(property)}
<span class=" text-gray-500">*required</span>
{/if}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
valves[property] =
(valves[property] ?? null) === null
? valvesSpec.properties[property]?.default ?? ''
: null;
}}
>
{#if (valves[property] ?? null) === null}
<span class="ml-2 self-center">
{#if (valvesSpec?.required ?? []).includes(property)}
{$i18n.t('None')}
{:else}
{$i18n.t('Default')}
{/if}
</span>
{:else}
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
{/if}
</button>
</div>
{#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1">
{#if valvesSpec.properties[property]?.enum ?? null}
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={valves[property]}
>
{#each valvesSpec.properties[property].enum as option}
<option value={option} selected={option === valves[property]}>
{option}
</option>
{/each}
</select>
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
<div class="flex justify-between items-center">
<div class="text-xs text-gray-500">
{valves[property] ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch bind:state={valves[property]} />
</div>
</div>
{:else}
<input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
type="text"
placeholder={valvesSpec.properties[property].title}
bind:value={valves[property]}
autocomplete="off"
required
/>
{/if}
</div>
</div>
{/if}
{#if (valvesSpec.properties[property]?.description ?? null) !== null}
<div class="text-xs text-gray-500">
{valvesSpec.properties[property].description}
</div>
{/if}
</div>
{/each}
{:else}
<div>No valves</div>
{/if}
{:else}
<Spinner className="size-5" />
{/if}
</div>
{/if}
</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>
@@ -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'}
+30 -3
View File
@@ -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' }}>
+16 -1
View File
@@ -13,7 +13,12 @@
export let cancelLabel = $i18n.t('Cancel'); export let cancelLabel = $i18n.t('Cancel');
export let confirmLabel = $i18n.t('Confirm'); export let confirmLabel = $i18n.t('Confirm');
export let input = false;
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;
@@ -73,6 +78,16 @@
{:else} {:else}
{$i18n.t('This action cannot be undone. Do you wish to continue?')} {$i18n.t('This action cannot be undone. Do you wish to continue?')}
{/if} {/if}
{#if input}
<textarea
bind:value={inputValue}
placeholder={inputPlaceholder ? inputPlaceholder : $i18n.t('Enter your message')}
class="w-full mt-2 rounded-lg px-4 py-2 text-sm dark:text-gray-300 dark:bg-gray-900 outline-none resize-none"
rows="3"
required
/>
{/if}
</div> </div>
</slot> </slot>
@@ -91,7 +106,7 @@
class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition" class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition"
on:click={() => { on:click={() => {
show = false; show = false;
dispatch('confirm'); dispatch('confirm', inputValue);
}} }}
type="button" type="button"
> >
+154
View File
@@ -0,0 +1,154 @@
<script lang="ts">
import { createEventDispatcher, getContext } from 'svelte';
const i18n = getContext('i18n');
const dispatch = createEventDispatcher();
export let className = 'w-72';
export let colorClassName = 'bg-white dark:bg-gray-800';
export let url: string | null = null;
export let clickHandler: Function | null = null;
export let dismissible = false;
export let status = 'processed';
export let name: 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>
<div class="relative group">
<button
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"
on:click={async () => {
if (clickHandler === null) {
if (url) {
if (type === 'file') {
window.open(`${url}/content`, '_blank').focus();
} else {
window.open(`${url}`, '_blank').focus();
}
}
} else {
clickHandler();
}
}}
>
<div class="p-4 py-[1.1rem] bg-red-400 text-white rounded-l-xl">
{#if status === 'processed'}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
class=" size-5"
>
<path
fill-rule="evenodd"
d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z"
clip-rule="evenodd"
/>
<path
d="M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z"
/>
</svg>
{:else}
<svg
class=" size-5 translate-y-[0.5px]"
fill="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
><style>
.spinner_qM83 {
animation: spinner_8HQG 1.05s infinite;
}
.spinner_oXPr {
animation-delay: 0.1s;
}
.spinner_ZTLf {
animation-delay: 0.2s;
}
@keyframes spinner_8HQG {
0%,
57.14% {
animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);
transform: translate(0);
}
28.57% {
animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);
transform: translateY(-6px);
}
100% {
transform: translate(0);
}
}
</style><circle class="spinner_qM83" cx="4" cy="12" r="2.5" /><circle
class="spinner_qM83 spinner_oXPr"
cx="12"
cy="12"
r="2.5"
/><circle class="spinner_qM83 spinner_ZTLf" cx="20" cy="12" r="2.5" /></svg
>
{/if}
</div>
<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 mb-1">
{name}
</div>
<div class=" flex justify-between text-gray-500 text-xs">
{#if type === 'file'}
{$i18n.t('File')}
{:else if type === 'doc'}
{$i18n.t('Document')}
{:else if type === 'collection'}
{$i18n.t('Collection')}
{:else}
<span class=" capitalize">{type}</span>
{/if}
{#if size}
<span class="capitalize">{formatSize(size)}</span>
{/if}
</div>
</div>
</button>
{#if dismissible}
<div class=" absolute -top-1 -right-1">
<button
class=" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition"
type="button"
on:click={() => {
dispatch('dismiss');
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
{/if}
</div>
@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
export let value: string = ''; export let value: string = '';
export let placeholder = ''; export let placeholder = '';
export let required = true;
export let readOnly = false; export let readOnly = false;
export let outerClassName = 'flex flex-1'; export let outerClassName = 'flex flex-1';
export let inputClassName = export let inputClassName =
@@ -12,13 +13,13 @@
<div class={outerClassName}> <div class={outerClassName}>
<input <input
class={inputClassName} class={`${inputClassName} ${show ? '' : 'password'}`}
{placeholder} {placeholder}
bind:value bind:value
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;
}} }}
+109
View File
@@ -0,0 +1,109 @@
<script>
import { onMount, getContext, createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
const i18n = getContext('i18n');
import Switch from './Switch.svelte';
export let valvesSpec = null;
export let valves = {};
</script>
{#if valvesSpec && Object.keys(valvesSpec?.properties ?? {}).length}
{#each Object.keys(valvesSpec.properties) as property, idx}
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">
{valvesSpec.properties[property].title}
{#if (valvesSpec?.required ?? []).includes(property)}
<span class=" text-gray-500">*required</span>
{/if}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
valves[property] =
(valves[property] ?? null) === null
? valvesSpec.properties[property]?.default ?? ''
: null;
dispatch('change');
}}
>
{#if (valves[property] ?? null) === null}
<span class="ml-2 self-center">
{#if (valvesSpec?.required ?? []).includes(property)}
{$i18n.t('None')}
{:else}
{$i18n.t('Default')}
{/if}
</span>
{:else}
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
{/if}
</button>
</div>
{#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1">
{#if valvesSpec.properties[property]?.enum ?? null}
<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"
bind:value={valves[property]}
on:change={() => {
dispatch('change');
}}
>
{#each valvesSpec.properties[property].enum as option}
<option value={option} selected={option === valves[property]}>
{option}
</option>
{/each}
</select>
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
<div class="flex justify-between items-center">
<div class="text-xs text-gray-500">
{valves[property] ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch
bind:state={valves[property]}
on:change={() => {
dispatch('change');
}}
/>
</div>
</div>
{:else}
<input
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"
type="text"
placeholder={valvesSpec.properties[property].title}
bind:value={valves[property]}
autocomplete="off"
required
on:change={() => {
dispatch('change');
}}
/>
{/if}
</div>
</div>
{/if}
{#if (valvesSpec.properties[property]?.description ?? null) !== null}
<div class="text-xs text-gray-500">
{valvesSpec.properties[property].description}
</div>
{/if}
</div>
{/each}
{:else}
<div class="text-xs">No valves</div>
{/if}
@@ -16,6 +16,7 @@
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let show = false; export let show = false;
export let uploadDoc: Function;
let uploadDocInputElement: HTMLInputElement; let uploadDocInputElement: HTMLInputElement;
let inputFiles; let inputFiles;
let tags = []; let tags = [];
@@ -26,32 +27,6 @@
content: null content: null
}; };
const uploadDoc = async (file) => {
const res = await uploadDocToVectorDB(localStorage.token, '', file).catch((error) => {
toast.error(error);
return null;
});
if (res) {
await createNewDoc(
localStorage.token,
res.collection_name,
res.filename,
transformFileName(res.filename),
res.filename,
tags.length > 0
? {
tags: tags
}
: null
).catch((error) => {
toast.error(error);
return null;
});
await documents.set(await getDocs(localStorage.token));
}
};
const submitHandler = async () => { const submitHandler = async () => {
if (inputFiles && inputFiles.length > 0) { if (inputFiles && inputFiles.length > 0) {
for (const file of inputFiles) { for (const file of inputFiles) {
@@ -60,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);
} }
} }
+19
View File
@@ -0,0 +1,19 @@
<script lang="ts">
export let className = 'w-4 h-4';
export let strokeWidth = '1.5';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width={strokeWidth}
stroke="currentColor"
class={className}
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z"
/>
</svg>
+2 -2
View File
@@ -238,7 +238,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 +282,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);
}} }}
+39 -7
View File
@@ -8,14 +8,16 @@
import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents'; import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents';
import { SUPPORTED_FILE_TYPE, SUPPORTED_FILE_EXTENSIONS } from '$lib/constants'; import { SUPPORTED_FILE_TYPE, SUPPORTED_FILE_EXTENSIONS } from '$lib/constants';
import { uploadDocToVectorDB } from '$lib/apis/rag'; import { processDocToVectorDB, uploadDocToVectorDB } from '$lib/apis/rag';
import { transformFileName } from '$lib/utils'; import { blobToFile, transformFileName } from '$lib/utils';
import Checkbox from '$lib/components/common/Checkbox.svelte'; import Checkbox from '$lib/components/common/Checkbox.svelte';
import EditDocModal from '$lib/components/documents/EditDocModal.svelte'; import EditDocModal from '$lib/components/documents/EditDocModal.svelte';
import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte'; import AddFilesPlaceholder from '$lib/components/AddFilesPlaceholder.svelte';
import AddDocModal from '$lib/components/documents/AddDocModal.svelte'; import AddDocModal from '$lib/components/documents/AddDocModal.svelte';
import { transcribeAudio } from '$lib/apis/audio';
import { uploadFile } from '$lib/apis/files';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
@@ -49,8 +51,29 @@
await documents.set(await getDocs(localStorage.token)); await documents.set(await getDocs(localStorage.token));
}; };
const uploadDoc = async (file) => { const uploadDoc = async (file, tags?: object) => {
const res = await uploadDocToVectorDB(localStorage.token, '', file).catch((error) => { console.log(file);
// Check if the file is an audio file and transcribe/convert it to text file
if (['audio/mpeg', 'audio/wav'].includes(file['type'])) {
const transcribeRes = await transcribeAudio(localStorage.token, file).catch((error) => {
toast.error(error);
return null;
});
if (transcribeRes) {
console.log(transcribeRes);
const blob = new Blob([transcribeRes.text], { type: 'text/plain' });
file = blobToFile(blob, `${file.name}.txt`);
}
}
// Upload the file to the server
const uploadedFile = await uploadFile(localStorage.token, file).catch((error) => {
toast.error(error);
return null;
});
const res = await processDocToVectorDB(localStorage.token, uploadedFile.id).catch((error) => {
toast.error(error); toast.error(error);
return null; return null;
}); });
@@ -61,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;
@@ -182,7 +210,7 @@
<EditDocModal bind:show={showEditDocModal} {selectedDoc} /> <EditDocModal bind:show={showEditDocModal} {selectedDoc} />
{/key} {/key}
<AddDocModal bind:show={showAddDocModal} /> <AddDocModal bind:show={showAddDocModal} {uploadDoc} />
<div class="mb-3"> <div class="mb-3">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
@@ -216,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;
}} }}
@@ -418,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;
@@ -465,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();
@@ -518,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;
+16 -11
View File
@@ -122,12 +122,17 @@
if (res) { if (res) {
if (func.is_global) { if (func.is_global) {
toast.success($i18n.t('Filter is now globally enabled')); func.type === 'filter'
? toast.success($i18n.t('Filter is now globally enabled'))
: toast.success($i18n.t('Function is now globally enabled'));
} else { } else {
toast.success($i18n.t('Filter is now globally disabled')); func.type === 'filter'
? toast.success($i18n.t('Filter is now globally disabled'))
: toast.success($i18n.t('Function is now globally disabled'));
} }
functions.set(await getFunctions(localStorage.token)); functions.set(await getFunctions(localStorage.token));
models.set(await getModels(localStorage.token));
} }
}; };
</script> </script>
@@ -230,7 +235,7 @@
</a> </a>
<div class="flex flex-row gap-0.5 self-center"> <div class="flex flex-row gap-0.5 self-center">
{#if func?.meta?.manifest?.funding_url ?? false} {#if func?.meta?.manifest?.funding_url ?? false}
<Tooltip content="Support"> <Tooltip content={$i18n.t('Support')}>
<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"
@@ -244,7 +249,7 @@
</Tooltip> </Tooltip>
{/if} {/if}
<Tooltip content="Valves"> <Tooltip content={$i18n.t('Valves')}>
<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"
@@ -294,7 +299,7 @@
showDeleteConfirm = true; showDeleteConfirm = true;
}} }}
toggleGlobalHandler={() => { toggleGlobalHandler={() => {
if (func.type === 'filter') { if (['filter', 'action'].includes(func.type)) {
toggleGlobalHandler(func); toggleGlobalHandler(func);
} }
}} }}
@@ -309,7 +314,7 @@
</FunctionMenu> </FunctionMenu>
<div class=" self-center mx-1"> <div class=" self-center mx-1">
<Tooltip content={func.is_active ? 'Enabled' : 'Disabled'}> <Tooltip content={func.is_active ? $i18n.t('Enabled') : $i18n.t('Disabled')}>
<Switch <Switch
bind:state={func.is_active} bind:state={func.is_active}
on:change={async (e) => { on:change={async (e) => {
@@ -489,15 +494,15 @@
<div>Please carefully review the following warnings:</div> <div>Please carefully review the following warnings:</div>
<ul class=" mt-1 list-disc pl-4 text-xs"> <ul class=" mt-1 list-disc pl-4 text-xs">
<li>Functions allow arbitrary code execution.</li> <li>{$i18n.t('Functions allow arbitrary code execution.')}</li>
<li>Do not install functions from sources you do not fully trust.</li> <li>{$i18n.t('Do not install functions from sources you do not fully trust.')}</li>
</ul> </ul>
</div> </div>
<div class="my-3"> <div class="my-3">
I acknowledge that I have read and I understand the implications of my action. I am aware of {$i18n.t(
the risks associated with executing arbitrary code and I have verified the trustworthiness of '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.'
the source. )}
</div> </div>
</div> </div>
</ConfirmDialog> </ConfirmDialog>
@@ -309,7 +309,7 @@ class Pipe:
<input <input
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none" class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
type="text" type="text"
placeholder="Function Name (e.g. My Filter)" placeholder={$i18n.t('Function Name (e.g. My Filter)')}
bind:value={name} bind:value={name}
required required
/> />
@@ -317,7 +317,7 @@ class Pipe:
<input <input
class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none" class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
type="text" type="text"
placeholder="Function ID (e.g. my_filter)" placeholder={$i18n.t('Function ID (e.g. my_filter)')}
bind:value={id} bind:value={id}
required required
disabled={edit} disabled={edit}
@@ -326,7 +326,9 @@ class Pipe:
<input <input
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none" class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
type="text" type="text"
placeholder="Function Description (e.g. A filter to remove profanity from text)" placeholder={$i18n.t(
'Function Description (e.g. A filter to remove profanity from text)'
)}
bind:value={meta.description} bind:value={meta.description}
required required
/> />
@@ -348,10 +350,10 @@ class Pipe:
<div class="pb-3 flex justify-between"> <div class="pb-3 flex justify-between">
<div class="flex-1 pr-3"> <div class="flex-1 pr-3">
<div class="text-xs text-gray-500 line-clamp-2"> <div class="text-xs text-gray-500 line-clamp-2">
<span class=" font-semibold dark:text-gray-200">Warning:</span> Functions allow <span class=" font-semibold dark:text-gray-200">{$i18n.t('Warning:')}</span>
arbitrary code execution <br />— {$i18n.t('Functions allow arbitrary code execution')} <br />—
<span class=" font-medium dark:text-gray-400" <span class=" font-medium dark:text-gray-400"
>don't install random functions from sources you don't trust.</span >{$i18n.t(`don't install random functions from sources you don't trust.`)}</span
> >
</div> </div>
</div> </div>
@@ -376,18 +378,18 @@ class Pipe:
> >
<div class="text-sm text-gray-500"> <div class="text-sm text-gray-500">
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3"> <div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
<div>Please carefully review the following warnings:</div> <div>{$i18n.t('Please carefully review the following warnings:')}</div>
<ul class=" mt-1 list-disc pl-4 text-xs"> <ul class=" mt-1 list-disc pl-4 text-xs">
<li>Functions allow arbitrary code execution.</li> <li>{$i18n.t('Functions allow arbitrary code execution.')}</li>
<li>Do not install functions from sources you do not fully trust.</li> <li>{$i18n.t('Do not install functions from sources you do not fully trust.')}</li>
</ul> </ul>
</div> </div>
<div class="my-3"> <div class="my-3">
I acknowledge that I have read and I understand the implications of my action. I am aware of {$i18n.t(
the risks associated with executing arbitrary code and I have verified the trustworthiness of '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.'
the source. )}
</div> </div>
</div> </div>
</ConfirmDialog> </ConfirmDialog>
@@ -48,7 +48,7 @@
align="start" align="start"
transition={flyAndScale} transition={flyAndScale}
> >
{#if func.type === 'filter'} {#if ['filter', 'action'].includes(func.type)}
<div <div
class="flex gap-2 justify-between items-center px-3 py-2 text-sm font-medium cursor-pointerrounded-md" class="flex gap-2 justify-between items-center px-3 py-2 text-sm font-medium cursor-pointerrounded-md"
> >
@@ -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>
+9 -7
View File
@@ -221,7 +221,7 @@
</Tooltip> </Tooltip>
{/if} {/if}
<Tooltip content="Valves"> <Tooltip content={$i18n.t('Valves')}>
<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"
@@ -436,18 +436,20 @@
> >
<div class="text-sm text-gray-500"> <div class="text-sm text-gray-500">
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3"> <div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
<div>Please carefully review the following warnings:</div> <div>{$i18n.t('Please carefully review the following warnings:')}</div>
<ul class=" mt-1 list-disc pl-4 text-xs"> <ul class=" mt-1 list-disc pl-4 text-xs">
<li>Tools have a function calling system that allows arbitrary code execution.</li> <li>
<li>Do not install tools from sources you do not fully trust.</li> {$i18n.t('Tools have a function calling system that allows arbitrary code execution')}.
</li>
<li>{$i18n.t('Do not install tools from sources you do not fully trust.')}</li>
</ul> </ul>
</div> </div>
<div class="my-3"> <div class="my-3">
I acknowledge that I have read and I understand the implications of my action. I am aware of {$i18n.t(
the risks associated with executing arbitrary code and I have verified the trustworthiness of '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.'
the source. )}
</div> </div>
</div> </div>
</ConfirmDialog> </ConfirmDialog>
@@ -197,7 +197,7 @@ class Tools:
<input <input
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none" class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
type="text" type="text"
placeholder="Toolkit Name (e.g. My ToolKit)" placeholder={$i18n.t('Toolkit Name (e.g. My ToolKit)')}
bind:value={name} bind:value={name}
required required
/> />
@@ -205,7 +205,7 @@ class Tools:
<input <input
class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none" class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
type="text" type="text"
placeholder="Toolkit ID (e.g. my_toolkit)" placeholder={$i18n.t('Toolkit ID (e.g. my_toolkit)')}
bind:value={id} bind:value={id}
required required
disabled={edit} disabled={edit}
@@ -214,7 +214,9 @@ class Tools:
<input <input
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none" class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
type="text" type="text"
placeholder="Toolkit Description (e.g. A toolkit for performing various operations)" placeholder={$i18n.t(
'Toolkit Description (e.g. A toolkit for performing various operations)'
)}
bind:value={meta.description} bind:value={meta.description}
required required
/> />
@@ -236,10 +238,10 @@ class Tools:
<div class="pb-3 flex justify-between"> <div class="pb-3 flex justify-between">
<div class="flex-1 pr-3"> <div class="flex-1 pr-3">
<div class="text-xs text-gray-500 line-clamp-2"> <div class="text-xs text-gray-500 line-clamp-2">
<span class=" font-semibold dark:text-gray-200">Warning:</span> Tools are a function <span class=" font-semibold dark:text-gray-200">{$i18n.t('Warning:')}</span>
calling system with arbitrary code execution <br />— {$i18n.t('Tools are a function calling system with arbitrary code execution')} <br />—
<span class=" font-medium dark:text-gray-400" <span class=" font-medium dark:text-gray-400"
>don't install random tools from sources you don't trust.</span >{$i18n.t(`don't install random tools from sources you don't trust.`)}</span
> >
</div> </div>
</div> </div>
@@ -264,18 +266,20 @@ class Tools:
> >
<div class="text-sm text-gray-500"> <div class="text-sm text-gray-500">
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3"> <div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
<div>Please carefully review the following warnings:</div> <div>{$i18n.t('Please carefully review the following warnings:')}</div>
<ul class=" mt-1 list-disc pl-4 text-xs"> <ul class=" mt-1 list-disc pl-4 text-xs">
<li>Tools have a function calling system that allows arbitrary code execution.</li> <li>
<li>Do not install tools from sources you do not fully trust.</li> {$i18n.t('Tools have a function calling system that allows arbitrary code execution.')}
</li>
<li>{$i18n.t('Do not install tools from sources you do not fully trust.')}</li>
</ul> </ul>
</div> </div>
<div class="my-3"> <div class="my-3">
I acknowledge that I have read and I understand the implications of my action. I am aware of {$i18n.t(
the risks associated with executing arbitrary code and I have verified the trustworthiness of '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.'
the source. )}
</div> </div>
</div> </div>
</ConfirmDialog> </ConfirmDialog>
@@ -44,23 +44,25 @@
}} }}
> >
<div class="px-1 text-sm"> <div class="px-1 text-sm">
<div class=" my-2"> <div class="my-2">
The developers behind this plugin are passionate volunteers from the community. If you {$i18n.t(
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.'
)}
</div> </div>
<div class=" my-2">
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.
</div>
<hr class=" dark:border-gray-800 my-3" />
<div class="my-2"> <div class="my-2">
Support this plugin: <a {$i18n.t(
'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.'
)}
</div>
<hr class="dark:border-gray-800 my-3" />
<div class="my-2">
{$i18n.t('Support this plugin:')}
<a
href={manifest.funding_url} href={manifest.funding_url}
target="_blank" target="_blank"
class=" underline text-blue-400 hover:text-blue-300">{manifest.funding_url}</a class="underline text-blue-400 hover:text-blue-300">{manifest.funding_url}</a
> >
</div> </div>
</div> </div>
@@ -13,6 +13,7 @@
import { getToolValvesById, getToolValvesSpecById, updateToolValvesById } from '$lib/apis/tools'; import { getToolValvesById, getToolValvesSpecById, updateToolValvesById } from '$lib/apis/tools';
import Spinner from '../../common/Spinner.svelte'; import Spinner from '../../common/Spinner.svelte';
import Switch from '$lib/components/common/Switch.svelte'; import Switch from '$lib/components/common/Switch.svelte';
import Valves from '$lib/components/common/Valves.svelte';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
@@ -127,91 +128,7 @@
> >
<div class="px-1"> <div class="px-1">
{#if !loading} {#if !loading}
{#if valvesSpec} <Valves {valvesSpec} bind:valves />
{#each Object.keys(valvesSpec.properties) as property, idx}
<div class=" py-0.5 w-full justify-between">
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">
{valvesSpec.properties[property].title}
{#if (valvesSpec?.required ?? []).includes(property)}
<span class=" text-gray-500">*required</span>
{/if}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
valves[property] =
(valves[property] ?? null) === null
? valvesSpec.properties[property]?.default ?? ''
: null;
}}
>
{#if (valves[property] ?? null) === null}
<span class="ml-2 self-center">
{#if (valvesSpec?.required ?? []).includes(property)}
{$i18n.t('None')}
{:else}
{$i18n.t('Default')}
{/if}
</span>
{:else}
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
{/if}
</button>
</div>
{#if (valves[property] ?? null) !== null}
<!-- {valves[property]} -->
<div class="flex mt-0.5 mb-1.5 space-x-2">
<div class=" flex-1">
{#if valvesSpec.properties[property]?.enum ?? null}
<select
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
bind:value={valves[property]}
>
{#each valvesSpec.properties[property].enum as option}
<option value={option} selected={option === valves[property]}>
{option}
</option>
{/each}
</select>
{:else if (valvesSpec.properties[property]?.type ?? null) === 'boolean'}
<div class="flex justify-between items-center">
<div class="text-xs text-gray-500">
{valves[property] ? 'Enabled' : 'Disabled'}
</div>
<div class=" pr-2">
<Switch bind:state={valves[property]} />
</div>
</div>
{:else}
<input
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
type="text"
placeholder={valvesSpec.properties[property].title}
bind:value={valves[property]}
autocomplete="off"
required
/>
{/if}
</div>
</div>
{/if}
{#if (valvesSpec.properties[property]?.description ?? null) !== null}
<div class="text-xs text-gray-500">
{valvesSpec.properties[property].description}
</div>
{/if}
</div>
{/each}
{:else}
<div class="text-sm">No valves</div>
{/if}
{:else} {:else}
<Spinner className="size-5" /> <Spinner className="size-5" />
{/if} {/if}
+39 -1
View File
@@ -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": "أحذف هذا الرابط",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "حذف {{name}}", "Deleted {{name}}": "حذف {{name}}",
"Description": "وصف", "Description": "وصف",
"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل", "Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "اكتشف نموذجا", "Discover a model": "اكتشف نموذجا",
"Discover a prompt": "اكتشاف موجه", "Discover a prompt": "اكتشاف موجه",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة", "Display the username instead of You in the Chat": "اعرض اسم المستخدم بدلاً منك في الدردشة",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "المستند", "Document": "المستند",
"Document Settings": "أعدادات المستند", "Document Settings": "أعدادات المستند",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "لا يجري أي اتصالات خارجية، وتظل بياناتك آمنة على الخادم المستضاف محليًا.", "does not make any external connections, and your data stays securely on your locally hosted server.": "لا يجري أي اتصالات خارجية، وتظل بياناتك آمنة على الخادم المستضاف محليًا.",
"Don't Allow": "لا تسمح بذلك", "Don't Allow": "لا تسمح بذلك",
"Don't have an account?": "ليس لديك حساب؟", "Don't have an account?": "ليس لديك حساب؟",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "لا أحب النمط", "Don't like the style": "لا أحب النمط",
"Done": "", "Done": "",
"Download": "تحميل", "Download": "تحميل",
@@ -206,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": "نموذج التضمين",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "تمكين مشاركة المجتمع", "Enable Community Sharing": "تمكين مشاركة المجتمع",
"Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة", "Enable New Sign Ups": "تفعيل عمليات التسجيل الجديدة",
"Enable Web Search": "تمكين بحث الويب", "Enable Web Search": "تمكين بحث الويب",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
"Enter {{role}} message here": "أدخل رسالة {{role}} هنا", "Enter {{role}} message here": "أدخل رسالة {{role}} هنا",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack", "Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
"Enter stop sequence": "أدخل تسلسل التوقف", "Enter stop sequence": "أدخل تسلسل التوقف",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "أدخل Top K", "Enter Top K": "أدخل Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "URL (e.g. http://localhost:11434)",
"Enter Your Email": "أدخل البريد الاكتروني", "Enter Your Email": "أدخل البريد الاكتروني",
"Enter Your Full Name": "أدخل الاسم كامل", "Enter Your Full Name": "أدخل الاسم كامل",
"Enter your message": "",
"Enter Your Password": "ادخل كلمة المرور", "Enter Your Password": "ادخل كلمة المرور",
"Enter Your Role": "أدخل الصلاحيات", "Enter Your Role": "أدخل الصلاحيات",
"Error": "خطأ", "Error": "خطأ",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "وضع الملف", "File Mode": "وضع الملف",
"File not found.": "لم يتم العثور على الملف.", "File not found.": "لم يتم العثور على الملف.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "عقوبة التردد", "Frequency Penalty": "عقوبة التردد",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "عام", "General": "عام",
"General Settings": "الاعدادات العامة", "General Settings": "الاعدادات العامة",
"Generate Image": "", "Generate Image": "",
"Generating search query": "إنشاء استعلام بحث", "Generating search query": "إنشاء استعلام بحث",
"Generation Info": "معلومات الجيل", "Generation Info": "معلومات الجيل",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "استجابة جيدة", "Good Response": "استجابة جيدة",
"Google PSE API Key": "مفتاح واجهة برمجة تطبيقات PSE من Google", "Google PSE API Key": "مفتاح واجهة برمجة تطبيقات PSE من Google",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "كيف استطيع مساعدتك اليوم؟", "How can I help you today?": "كيف استطيع مساعدتك اليوم؟",
"Hybrid Search": "البحث الهجين", "Hybrid Search": "البحث الهجين",
"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.": "",
"Image Generation (Experimental)": "توليد الصور (تجريبي)", "Image Generation (Experimental)": "توليد الصور (تجريبي)",
"Image Generation Engine": "محرك توليد الصور", "Image Generation Engine": "محرك توليد الصور",
"Image Settings": "إعدادات الصورة", "Image Settings": "إعدادات الصورة",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "اختصارات لوحة المفاتيح", "Keyboard shortcuts": "اختصارات لوحة المفاتيح",
"Knowledge": "", "Knowledge": "",
"Language": "اللغة", "Language": "اللغة",
"large language models, locally.": "",
"Last Active": "آخر نشاط", "Last Active": "آخر نشاط",
"Last Modified": "", "Last Modified": "",
"Light": "فاتح", "Light": "فاتح",
@@ -341,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 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "صمامات خطوط الأنابيب", "Pipelines Valves": "صمامات خطوط الأنابيب",
"Plain text (.txt)": "نص عادي (.txt)", "Plain text (.txt)": "نص عادي (.txt)",
"Playground": "مكان التجربة", "Playground": "مكان التجربة",
"Please carefully review the following warnings:": "",
"Positive attitude": "موقف ايجابي", "Positive attitude": "موقف ايجابي",
"Previous 30 days": "أخر 30 يوم", "Previous 30 days": "أخر 30 يوم",
"Previous 7 days": "أخر 7 أيام", "Previous 7 days": "أخر 7 أيام",
@@ -475,10 +499,12 @@
"Rosé Pine": "Rosé Pine", "Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn", "Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "من اليمين إلى اليسار", "RTL": "من اليمين إلى اليسار",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!": "تم المسح",
@@ -562,6 +588,8 @@
"Success": "نجاح", "Success": "نجاح",
"Successfully updated.": "تم التحديث بنجاح", "Successfully updated.": "تم التحديث بنجاح",
"Suggested": "مقترحات", "Suggested": "مقترحات",
"Support": "",
"Support this plugin:": "",
"System": "النظام", "System": "النظام",
"System Prompt": "محادثة النظام", "System Prompt": "محادثة النظام",
"Tags": "الوسوم", "Tags": "الوسوم",
@@ -574,6 +602,7 @@
"Text-to-Speech Engine": "محرك تحويل النص إلى كلام", "Text-to-Speech Engine": "محرك تحويل النص إلى كلام",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "شكرا لملاحظاتك!", "Thanks for your feedback!": "شكرا لملاحظاتك!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "يجب أن تكون النتيجة قيمة تتراوح بين 0.0 (0%) و1.0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "يجب أن تكون النتيجة قيمة تتراوح بين 0.0 (0%) و1.0 (100%).",
"Theme": "الثيم", "Theme": "الثيم",
"Thinking...": "", "Thinking...": "",
@@ -597,6 +626,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": "اليوم",
@@ -607,7 +637,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول", "Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول",
@@ -649,6 +685,7 @@
"Version": "إصدار", "Version": "إصدار",
"Voice": "", "Voice": "",
"Warning": "تحذير", "Warning": "تحذير",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.",
"Web": "Web", "Web": "Web",
"Web API": "", "Web API": "",
@@ -675,6 +712,7 @@
"You're a helpful assistant.": "مساعدك المفيد هنا", "You're a helpful assistant.": "مساعدك المفيد هنا",
"You're now logged in.": "لقد قمت الآن بتسجيل الدخول.", "You're now logged in.": "لقد قمت الآن بتسجيل الدخول.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Youtube تحميل اعدادات" "Youtube Loader Settings": "Youtube تحميل اعدادات"
} }
+39 -1
View File
@@ -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": "Изтриване на този линк",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Изтрито {{име}}", "Deleted {{name}}": "Изтрито {{име}}",
"Description": "Описание", "Description": "Описание",
"Didn't fully follow instructions": "Не следва инструкциите", "Didn't fully follow instructions": "Не следва инструкциите",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "Открийте модел", "Discover a model": "Открийте модел",
"Discover a prompt": "Откриване на промпт", "Discover a prompt": "Откриване на промпт",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата", "Display the username instead of You in the Chat": "Показване на потребителското име вместо Вие в чата",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Документ", "Document": "Документ",
"Document Settings": "Документ Настройки", "Document Settings": "Документ Настройки",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "няма външни връзки, и вашите данни остават сигурни на локално назначен сървър.", "does not make any external connections, and your data stays securely on your locally hosted server.": "няма външни връзки, и вашите данни остават сигурни на локално назначен сървър.",
"Don't Allow": "Не Позволявай", "Don't Allow": "Не Позволявай",
"Don't have an account?": "Нямате акаунт?", "Don't have an account?": "Нямате акаунт?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "Не харесваш стила?", "Don't like the style": "Не харесваш стила?",
"Done": "", "Done": "",
"Download": "Изтегляне отменено", "Download": "Изтегляне отменено",
@@ -206,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": "Модел за вграждане",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Разрешаване на споделяне в общност", "Enable Community Sharing": "Разрешаване на споделяне в общност",
"Enable New Sign Ups": "Вклюване на Нови Потребители", "Enable New Sign Ups": "Вклюване на Нови Потребители",
"Enable Web Search": "Разрешаване на търсене в уеб", "Enable Web Search": "Разрешаване на търсене в уеб",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук", "Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Въведете Serpstack API ключ", "Enter Serpstack API Key": "Въведете Serpstack API ключ",
"Enter stop sequence": "Въведете стоп последователност", "Enter stop sequence": "Въведете стоп последователност",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Въведете Top K", "Enter Top K": "Въведете Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Въведете URL (напр. http://localhost:11434)",
"Enter Your Email": "Въведете имейл", "Enter Your Email": "Въведете имейл",
"Enter Your Full Name": "Въведете вашето пълно име", "Enter Your Full Name": "Въведете вашето пълно име",
"Enter your message": "",
"Enter Your Password": "Въведете вашата парола", "Enter Your Password": "Въведете вашата парола",
"Enter Your Role": "Въведете вашата роля", "Enter Your Role": "Въведете вашата роля",
"Error": "Грешка", "Error": "Грешка",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "Файл Мод", "File Mode": "Файл Мод",
"File not found.": "Файл не е намерен.", "File not found.": "Файл не е намерен.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Наказание за честота", "Frequency Penalty": "Наказание за честота",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Основни", "General": "Основни",
"General Settings": "Основни Настройки", "General Settings": "Основни Настройки",
"Generate Image": "", "Generate Image": "",
"Generating search query": "Генериране на заявка за търсене", "Generating search query": "Генериране на заявка за търсене",
"Generation Info": "Информация за Генерация", "Generation Info": "Информация за Генерация",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "Добра отговор", "Good Response": "Добра отговор",
"Google PSE API Key": "Google PSE API ключ", "Google PSE API Key": "Google PSE API ключ",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "Как мога да ви помогна днес?", "How can I help you today?": "Как мога да ви помогна днес?",
"Hybrid Search": "Hybrid Search", "Hybrid Search": "Hybrid Search",
"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.": "",
"Image Generation (Experimental)": "Генерация на изображения (Експериментално)", "Image Generation (Experimental)": "Генерация на изображения (Експериментално)",
"Image Generation Engine": "Двигател за генериране на изображения", "Image Generation Engine": "Двигател за генериране на изображения",
"Image Settings": "Настройки на изображения", "Image Settings": "Настройки на изображения",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Клавиши за бърз достъп", "Keyboard shortcuts": "Клавиши за бърз достъп",
"Knowledge": "", "Knowledge": "",
"Language": "Език", "Language": "Език",
"large language models, locally.": "",
"Last Active": "Последни активни", "Last Active": "Последни активни",
"Last Modified": "", "Last Modified": "",
"Light": "Светъл", "Light": "Светъл",
@@ -341,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 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Тръбопроводи Вентили", "Pipelines Valves": "Тръбопроводи Вентили",
"Plain text (.txt)": "Plain text (.txt)", "Plain text (.txt)": "Plain text (.txt)",
"Playground": "Плейграунд", "Playground": "Плейграунд",
"Please carefully review the following warnings:": "",
"Positive attitude": "Позитивна ативност", "Positive attitude": "Позитивна ативност",
"Previous 30 days": "Предыдущите 30 дни", "Previous 30 days": "Предыдущите 30 дни",
"Previous 7 days": "Предыдущите 7 дни", "Previous 7 days": "Предыдущите 7 дни",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!": "Сканиране завършено!",
@@ -558,6 +584,8 @@
"Success": "Успех", "Success": "Успех",
"Successfully updated.": "Успешно обновено.", "Successfully updated.": "Успешно обновено.",
"Suggested": "Препоръчано", "Suggested": "Препоръчано",
"Support": "",
"Support this plugin:": "",
"System": "Система", "System": "Система",
"System Prompt": "Системен Промпт", "System Prompt": "Системен Промпт",
"Tags": "Тагове", "Tags": "Тагове",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "Text-to-Speech Engine", "Text-to-Speech Engine": "Text-to-Speech Engine",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Благодарим ви за вашия отзив!", "Thanks for your feedback!": "Благодарим ви за вашия отзив!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "The score should be a value between 0.0 (0%) and 1.0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "The score should be a value between 0.0 (0%) and 1.0 (100%).",
"Theme": "Тема", "Theme": "Тема",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "днес",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?", "Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
@@ -645,6 +681,7 @@
"Version": "Версия", "Version": "Версия",
"Voice": "", "Voice": "",
"Warning": "Предупреждение", "Warning": "Предупреждение",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.",
"Web": "Уеб", "Web": "Уеб",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "Вие сте полезен асистент.", "You're a helpful assistant.": "Вие сте полезен асистент.",
"You're now logged in.": "Сега, вие влязохте в системата.", "You're now logged in.": "Сега, вие влязохте в системата.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Youtube Loader Settings" "Youtube Loader Settings": "Youtube Loader Settings"
} }
+39 -1
View File
@@ -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": "এই লিংক মুছে ফেলুন",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "{{name}} মোছা হয়েছে", "Deleted {{name}}": "{{name}} মোছা হয়েছে",
"Description": "বিবরণ", "Description": "বিবরণ",
"Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি", "Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "একটি মডেল আবিষ্কার করুন", "Discover a model": "একটি মডেল আবিষ্কার করুন",
"Discover a prompt": "একটি প্রম্পট খুঁজে বের করুন", "Discover a prompt": "একটি প্রম্পট খুঁজে বের করুন",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান", "Display the username instead of You in the Chat": "চ্যাটে 'আপনি'-র পরবর্তে ইউজারনেম দেখান",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "ডকুমেন্ট", "Document": "ডকুমেন্ট",
"Document Settings": "ডকুমেন্ট সেটিংসমূহ", "Document Settings": "ডকুমেন্ট সেটিংসমূহ",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "কোন এক্সটার্নাল কানেকশন তৈরি করে না, এবং আপনার ডেটা আর লোকালি হোস্টেড সার্ভারেই নিরাপদে থাকে।", "does not make any external connections, and your data stays securely on your locally hosted server.": "কোন এক্সটার্নাল কানেকশন তৈরি করে না, এবং আপনার ডেটা আর লোকালি হোস্টেড সার্ভারেই নিরাপদে থাকে।",
"Don't Allow": "অনুমোদন দেবেন না", "Don't Allow": "অনুমোদন দেবেন না",
"Don't have an account?": "একাউন্ট নেই?", "Don't have an account?": "একাউন্ট নেই?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "স্টাইল পছন্দ করেন না", "Don't like the style": "স্টাইল পছন্দ করেন না",
"Done": "", "Done": "",
"Download": "ডাউনলোড", "Download": "ডাউনলোড",
@@ -206,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": "ইমেজ ইমেবডিং মডেল",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন", "Enable Community Sharing": "সম্প্রদায় শেয়ারকরণ সক্ষম করুন",
"Enable New Sign Ups": "নতুন সাইনআপ চালু করুন", "Enable New Sign Ups": "নতুন সাইনআপ চালু করুন",
"Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন", "Enable Web Search": "ওয়েব অনুসন্ধান সক্ষম করুন",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন", "Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack API কী লিখুন", "Enter Serpstack API Key": "Serpstack API কী লিখুন",
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন", "Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Top K লিখুন", "Enter Top K": "Top K লিখুন",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "ইউআরএল দিন (যেমন http://localhost:11434)",
"Enter Your Email": "আপনার ইমেইল লিখুন", "Enter Your Email": "আপনার ইমেইল লিখুন",
"Enter Your Full Name": "আপনার পূর্ণ নাম লিখুন", "Enter Your Full Name": "আপনার পূর্ণ নাম লিখুন",
"Enter your message": "",
"Enter Your Password": "আপনার পাসওয়ার্ড লিখুন", "Enter Your Password": "আপনার পাসওয়ার্ড লিখুন",
"Enter Your Role": "আপনার রোল লিখুন", "Enter Your Role": "আপনার রোল লিখুন",
"Error": "ত্রুটি", "Error": "ত্রুটি",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "ফাইল মোড", "File Mode": "ফাইল মোড",
"File not found.": "ফাইল পাওয়া যায়নি", "File not found.": "ফাইল পাওয়া যায়নি",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "ফ্রিকোয়েন্সি পেনাল্টি", "Frequency Penalty": "ফ্রিকোয়েন্সি পেনাল্টি",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "সাধারণ", "General": "সাধারণ",
"General Settings": "সাধারণ সেটিংসমূহ", "General Settings": "সাধারণ সেটিংসমূহ",
"Generate Image": "", "Generate Image": "",
"Generating search query": "অনুসন্ধান ক্যোয়ারী তৈরি করা হচ্ছে", "Generating search query": "অনুসন্ধান ক্যোয়ারী তৈরি করা হচ্ছে",
"Generation Info": "জেনারেশন ইনফো", "Generation Info": "জেনারেশন ইনফো",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "ভালো সাড়া", "Good Response": "ভালো সাড়া",
"Google PSE API Key": "গুগল পিএসই এপিআই কী", "Google PSE API Key": "গুগল পিএসই এপিআই কী",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "আপনাকে আজ কিভাবে সাহায্য করতে পারি?", "How can I help you today?": "আপনাকে আজ কিভাবে সাহায্য করতে পারি?",
"Hybrid Search": "হাইব্রিড অনুসন্ধান", "Hybrid Search": "হাইব্রিড অনুসন্ধান",
"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.": "",
"Image Generation (Experimental)": "ইমেজ জেনারেশন (পরিক্ষামূলক)", "Image Generation (Experimental)": "ইমেজ জেনারেশন (পরিক্ষামূলক)",
"Image Generation Engine": "ইমেজ জেনারেশন ইঞ্জিন", "Image Generation Engine": "ইমেজ জেনারেশন ইঞ্জিন",
"Image Settings": "ছবির সেটিংসমূহ", "Image Settings": "ছবির সেটিংসমূহ",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "কিবোর্ড শর্টকাটসমূহ", "Keyboard shortcuts": "কিবোর্ড শর্টকাটসমূহ",
"Knowledge": "", "Knowledge": "",
"Language": "ভাষা", "Language": "ভাষা",
"large language models, locally.": "",
"Last Active": "সর্বশেষ সক্রিয়", "Last Active": "সর্বশেষ সক্রিয়",
"Last Modified": "", "Last Modified": "",
"Light": "লাইট", "Light": "লাইট",
@@ -341,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.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "পাইপলাইন ভালভ", "Pipelines Valves": "পাইপলাইন ভালভ",
"Plain text (.txt)": "প্লায়েন টেক্সট (.txt)", "Plain text (.txt)": "প্লায়েন টেক্সট (.txt)",
"Playground": "খেলাঘর", "Playground": "খেলাঘর",
"Please carefully review the following warnings:": "",
"Positive attitude": "পজিটিভ আক্রমণ", "Positive attitude": "পজিটিভ আক্রমণ",
"Previous 30 days": "পূর্ব ৩০ দিন", "Previous 30 days": "পূর্ব ৩০ দিন",
"Previous 7 days": "পূর্ব ৭ দিন", "Previous 7 days": "পূর্ব ৭ দিন",
@@ -475,10 +499,12 @@
"Rosé Pine": "রোজ পাইন", "Rosé Pine": "রোজ পাইন",
"Rosé Pine Dawn": "ভোরের রোজ পাইন", "Rosé Pine Dawn": "ভোরের রোজ পাইন",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!": "স্ক্যান সম্পন্ন হয়েছে!",
@@ -558,6 +584,8 @@
"Success": "সফল", "Success": "সফল",
"Successfully updated.": "সফলভাবে আপডেট হয়েছে", "Successfully updated.": "সফলভাবে আপডেট হয়েছে",
"Suggested": "প্রস্তাবিত", "Suggested": "প্রস্তাবিত",
"Support": "",
"Support this plugin:": "",
"System": "সিস্টেম", "System": "সিস্টেম",
"System Prompt": "সিস্টেম প্রম্পট", "System Prompt": "সিস্টেম প্রম্পট",
"Tags": "ট্যাগসমূহ", "Tags": "ট্যাগসমূহ",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "টেক্সট-টু-স্পিচ ইঞ্জিন", "Text-to-Speech Engine": "টেক্সট-টু-স্পিচ ইঞ্জিন",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "আপনার মতামত ধন্যবাদ!", "Thanks for your feedback!": "আপনার মতামত ধন্যবাদ!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "স্কোর একটি 0.0 (0%) এবং 1.0 (100%) এর মধ্যে একটি মান হওয়া উচিত।", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "স্কোর একটি 0.0 (0%) এবং 1.0 (100%) এর মধ্যে একটি মান হওয়া উচিত।",
"Theme": "থিম", "Theme": "থিম",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "আজ",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?", "Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?",
@@ -645,6 +681,7 @@
"Version": "ভার্সন", "Version": "ভার্সন",
"Voice": "", "Voice": "",
"Warning": "সতর্কীকরণ", "Warning": "সতর্কীকরণ",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "সতর্কীকরণ: আপনি যদি আপনার এম্বেডিং মডেল আপডেট বা পরিবর্তন করেন, তাহলে আপনাকে সমস্ত নথি পুনরায় আমদানি করতে হবে।.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "সতর্কীকরণ: আপনি যদি আপনার এম্বেডিং মডেল আপডেট বা পরিবর্তন করেন, তাহলে আপনাকে সমস্ত নথি পুনরায় আমদানি করতে হবে।.",
"Web": "ওয়েব", "Web": "ওয়েব",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট", "You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট",
"You're now logged in.": "আপনি এখন লগইন করা অবস্থায় আছেন", "You're now logged in.": "আপনি এখন লগইন করা অবস্থায় আছেন",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "YouTube", "Youtube": "YouTube",
"Youtube Loader Settings": "YouTube লোডার সেটিংস" "Youtube Loader Settings": "YouTube লোডার সেটিংস"
} }
+39 -1
View File
@@ -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": "",
"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": "",
"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": "",
"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ç",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "S'ha eliminat {{name}}", "Deleted {{name}}": "S'ha eliminat {{name}}",
"Description": "Descripció", "Description": "Descripció",
"Didn't fully follow instructions": "No s'han seguit les instruccions completament", "Didn't fully follow instructions": "No s'han seguit les instruccions completament",
"Disabled": "Deshabilitat",
"Discover a function": "Descobrir una funció", "Discover a function": "Descobrir una funció",
"Discover a model": "Descobrir un model", "Discover a model": "Descobrir un model",
"Discover a prompt": "Descobrir una indicació", "Discover a prompt": "Descobrir una indicació",
@@ -188,6 +192,8 @@
"Dismissible": "Descartable", "Dismissible": "Descartable",
"Display Emoji in Call": "Mostrar emojis a la trucada", "Display Emoji in Call": "Mostrar emojis a la trucada",
"Display the username instead of You in the Chat": "Mostrar el nom d'usuari en lloc de 'Tu' al xat", "Display the username instead of You in the Chat": "Mostrar el nom d'usuari en lloc de 'Tu' al xat",
"Do not install functions from sources you do not fully trust.": "No instal·lis funcions de fonts en què no confiïs plenament.",
"Do not install tools from sources you do not fully trust.": "No instal·lis eines de fonts en què no confiïs plenament.",
"Document": "Document", "Document": "Document",
"Document Settings": "Preferències de documents", "Document Settings": "Preferències de documents",
"Documentation": "Documentació", "Documentation": "Documentació",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realitza connexions externes, i les teves dades romanen segures al teu servidor allotjat localment.", "does not make any external connections, and your data stays securely on your locally hosted server.": "no realitza connexions externes, i les teves dades romanen segures al teu servidor allotjat localment.",
"Don't Allow": "No permetre", "Don't Allow": "No permetre",
"Don't have an account?": "No tens un compte?", "Don't have an account?": "No tens un compte?",
"don't install random functions from sources you don't trust.": "no instal·lis funcions aleatòries de fonts en què no confiïs.",
"don't install random tools from sources you don't trust.": "no instal·lis eines aleatòries de fonts en què no confiïs.",
"Don't like the style": "No t'agrada l'estil?", "Don't like the style": "No t'agrada l'estil?",
"Done": "Fet", "Done": "Fet",
"Download": "Descarregar", "Download": "Descarregar",
@@ -206,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": "",
"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ó",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Activar l'ús compartit amb la comunitat", "Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
"Enable New Sign Ups": "Permetre nous registres", "Enable New Sign Ups": "Permetre nous registres",
"Enable Web Search": "Activar la cerca web", "Enable Web Search": "Activar la cerca web",
"Enabled": "Habilitat",
"Engine": "Motor", "Engine": "Motor",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assegura't que els teus fitxers CSV inclouen 4 columnes en aquest ordre: Nom, Correu electrònic, Contrasenya, Rol.",
"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}", "Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Introdueix la clau API Serply", "Enter Serply API Key": "Introdueix la clau API Serply",
"Enter Serpstack API Key": "Introdueix la clau API Serpstack", "Enter Serpstack API Key": "Introdueix la clau API Serpstack",
"Enter stop sequence": "Introdueix la seqüència de parada", "Enter stop sequence": "Introdueix la seqüència de parada",
"Enter system prompt": "Introdueix la indicació de sistema",
"Enter Tavily API Key": "Introdueix la clau API de Tavily", "Enter Tavily API Key": "Introdueix la clau API de Tavily",
"Enter Tika Server URL": "Introdueix l'URL del servidor Tika", "Enter Tika Server URL": "Introdueix l'URL del servidor Tika",
"Enter Top K": "Introdueix Top K", "Enter Top K": "Introdueix Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
"Enter Your Email": "Introdueix el teu correu electrònic", "Enter Your Email": "Introdueix el teu correu electrònic",
"Enter Your Full Name": "Introdueix el teu nom complet", "Enter Your Full Name": "Introdueix el teu nom complet",
"Enter your message": "Introdueix el teu missatge",
"Enter Your Password": "Introdueix la teva contrasenya", "Enter Your Password": "Introdueix la teva contrasenya",
"Enter Your Role": "Introdueix el teu rol", "Enter Your Role": "Introdueix el teu rol",
"Error": "Error", "Error": "Error",
@@ -266,6 +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": "",
"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",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Penalització per freqüència", "Frequency Penalty": "Penalització per freqüència",
"Function created successfully": "La funció s'ha creat correctament", "Function created successfully": "La funció s'ha creat correctament",
"Function deleted successfully": "La funció s'ha eliminat correctament", "Function deleted successfully": "La funció s'ha eliminat correctament",
"Function Description (e.g. A filter to remove profanity from text)": "Descripció de la funció (per exemple, un filtre per eliminar paraules malsonants del text)",
"Function ID (e.g. my_filter)": "ID de la funció (per exemple, el_meu_filtre)",
"Function is now globally disabled": "La funció ha estat desactivada globalment",
"Function is now globally enabled": "La funció ha estat activada globalment",
"Function Name (e.g. My Filter)": "Nom de la funció (per exemple, El Meu Filtre)",
"Function updated successfully": "La funció s'ha actualitzat correctament", "Function updated successfully": "La funció s'ha actualitzat correctament",
"Functions": "Funcions", "Functions": "Funcions",
"Functions allow arbitrary code execution": "Les funcions permeten l'execució de codi arbitrari",
"Functions allow arbitrary code execution.": "Les funcions permeten l'execució de codi arbitrari.",
"Functions imported successfully": "Les funcions s'han importat correctament", "Functions imported successfully": "Les funcions s'han importat correctament",
"General": "General", "General": "General",
"General Settings": "Preferències generals", "General Settings": "Preferències generals",
"Generate Image": "Generar imatge", "Generate Image": "Generar imatge",
"Generating search query": "Generant consulta", "Generating search query": "Generant consulta",
"Generation Info": "Informació sobre la generació", "Generation Info": "Informació sobre la generació",
"Get up and running with": "Posa't en marxa amb",
"Global": "Global", "Global": "Global",
"Good Response": "Bona resposta", "Good Response": "Bona resposta",
"Google PSE API Key": "Clau API PSE de Google", "Google PSE API Key": "Clau API PSE de Google",
@@ -298,6 +319,7 @@
"Hide Model": "Amagar el model", "Hide Model": "Amagar el model",
"How can I help you today?": "Com et puc ajudar avui?", "How can I help you today?": "Com et puc ajudar avui?",
"Hybrid Search": "Cerca híbrida", "Hybrid Search": "Cerca híbrida",
"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.": "Afirmo que he llegit i entenc les implicacions de la meva acció. Soc conscient dels riscos associats a l'execució de codi arbitrari i he verificat la fiabilitat de la font.",
"Image Generation (Experimental)": "Generació d'imatges (Experimental)", "Image Generation (Experimental)": "Generació d'imatges (Experimental)",
"Image Generation Engine": "Motor de generació d'imatges", "Image Generation Engine": "Motor de generació d'imatges",
"Image Settings": "Preferències d'imatges", "Image Settings": "Preferències d'imatges",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Dreceres de teclat", "Keyboard shortcuts": "Dreceres de teclat",
"Knowledge": "Coneixement", "Knowledge": "Coneixement",
"Language": "Idioma", "Language": "Idioma",
"large language models, locally.": "models de llenguatge extensos, localment",
"Last Active": "Activitat recent", "Last Active": "Activitat recent",
"Last Modified": "Modificació", "Last Modified": "Modificació",
"Light": "Clar", "Light": "Clar",
@@ -341,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.",
@@ -353,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": "",
"Minimum Score": "Puntuació mínima", "Minimum Score": "Puntuació mínima",
"Mirostat": "Mirostat", "Mirostat": "Mirostat",
"Mirostat Eta": "Eta de Mirostat", "Mirostat Eta": "Eta de Mirostat",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Vàlvules de les Pipelines", "Pipelines Valves": "Vàlvules de les Pipelines",
"Plain text (.txt)": "Text pla (.txt)", "Plain text (.txt)": "Text pla (.txt)",
"Playground": "Zona de jocs", "Playground": "Zona de jocs",
"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
"Positive attitude": "Actitud positiva", "Positive attitude": "Actitud positiva",
"Previous 30 days": "30 dies anteriors", "Previous 30 days": "30 dies anteriors",
"Previous 7 days": "7 dies anteriors", "Previous 7 days": "7 dies anteriors",
@@ -475,10 +499,12 @@
"Rosé Pine": "Rosé Pine", "Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Albada Rosé Pine", "Rosé Pine Dawn": "Albada Rosé Pine",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "Executa Llama 2, Code Llama, i altres models. Personalitza i crea els teus propis models.",
"Running": "S'està executant", "Running": "S'està executant",
"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": "",
"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!",
@@ -559,6 +585,8 @@
"Success": "Èxit", "Success": "Èxit",
"Successfully updated.": "Actualitzat correctament.", "Successfully updated.": "Actualitzat correctament.",
"Suggested": "Suggerit", "Suggested": "Suggerit",
"Support": "Dona suport",
"Support this plugin:": "Dona suport a aquest complement:",
"System": "Sistema", "System": "Sistema",
"System Prompt": "Indicació del Sistema", "System Prompt": "Indicació del Sistema",
"Tags": "Etiquetes", "Tags": "Etiquetes",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "Motor de text a veu", "Text-to-Speech Engine": "Motor de text a veu",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Gràcies pel teu comentari!", "Thanks for your feedback!": "Gràcies pel teu comentari!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Els desenvolupadors d'aquest complement són voluntaris apassionats de la comunitat. Si trobeu útil aquest complement, considereu contribuir al seu desenvolupament.",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El valor de puntuació hauria de ser entre 0.0 (0%) i 1.0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "El valor de puntuació hauria de ser entre 0.0 (0%) i 1.0 (100%).",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "Pensant...", "Thinking...": "Pensant...",
@@ -594,6 +623,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.": "",
"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",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "Eina eliminada correctament", "Tool deleted successfully": "Eina eliminada correctament",
"Tool imported successfully": "Eina importada correctament", "Tool imported successfully": "Eina importada correctament",
"Tool updated successfully": "Eina actualitzada correctament", "Tool updated successfully": "Eina actualitzada correctament",
"Toolkit Description (e.g. A toolkit for performing various operations)": "Descripció del kit d'eines (p. ex. Un kit d'eines per fer diverses operacions)",
"Toolkit ID (e.g. my_toolkit)": "ID del kit d'eines (p. ex. el_meu_kit)",
"Toolkit Name (e.g. My ToolKit)": "Nom del kit d'eines (p. ex. El meu kit)",
"Tools": "Eines", "Tools": "Eines",
"Tools are a function calling system with arbitrary code execution": "Les eines són un sistema de crida a funcions amb execució de codi arbitrari",
"Tools have a function calling system that allows arbitrary code execution": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari",
"Tools have a function calling system that allows arbitrary code execution.": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari.",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problemes en accedir a Ollama?", "Trouble accessing Ollama?": "Problemes en accedir a Ollama?",
@@ -646,6 +682,7 @@
"Version": "Versió", "Version": "Versió",
"Voice": "Veu", "Voice": "Veu",
"Warning": "Avís", "Warning": "Avís",
"Warning:": "Avís:",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si s'actualitza o es canvia el model d'incrustació, s'hauran de tornar a importar tots els documents.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si s'actualitza o es canvia el model d'incrustació, s'hauran de tornar a importar tots els documents.",
"Web": "Web", "Web": "Web",
"Web API": "Web API", "Web API": "Web API",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "Ets un assistent útil.", "You're a helpful assistant.": "Ets un assistent útil.",
"You're now logged in.": "Ara estàs connectat.", "You're now logged in.": "Ara estàs connectat.",
"Your account status is currently pending activation.": "El compte està actualment pendent d'activació", "Your account status is currently pending activation.": "El compte està actualment pendent d'activació",
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Tota la teva contribució anirà directament al desenvolupador del complement; Open WebUI no se'n queda cap percentatge. Tanmateix, la plataforma de finançament escollida pot tenir les seves pròpies comissions.",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Preferències del carregador de Youtube" "Youtube Loader Settings": "Preferències del carregador de Youtube"
} }
+39 -1
View File
@@ -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": "",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "", "Deleted {{name}}": "",
"Description": "Deskripsyon", "Description": "Deskripsyon",
"Didn't fully follow instructions": "", "Didn't fully follow instructions": "",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "", "Discover a model": "",
"Discover a prompt": "Pagkaplag usa ka prompt", "Discover a prompt": "Pagkaplag usa ka prompt",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan", "Display the username instead of You in the Chat": "Ipakita ang username imbes nga 'Ikaw' sa Panaghisgutan",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Dokumento", "Document": "Dokumento",
"Document Settings": "Mga Setting sa Dokumento", "Document Settings": "Mga Setting sa Dokumento",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "wala maghimo ug eksternal nga koneksyon, ug ang imong data nagpabiling luwas sa imong lokal nga host server.", "does not make any external connections, and your data stays securely on your locally hosted server.": "wala maghimo ug eksternal nga koneksyon, ug ang imong data nagpabiling luwas sa imong lokal nga host server.",
"Don't Allow": "Dili tugotan", "Don't Allow": "Dili tugotan",
"Don't have an account?": "Wala kay account ?", "Don't have an account?": "Wala kay account ?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "", "Don't like the style": "",
"Done": "", "Done": "",
"Download": "", "Download": "",
@@ -206,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": "",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "I-enable ang bag-ong mga rehistro", "Enable New Sign Ups": "I-enable ang bag-ong mga rehistro",
"Enable Web Search": "", "Enable Web Search": "",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi", "Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay", "Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Pagsulod sa Top K", "Enter Top K": "Pagsulod sa Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "", "Enter URL (e.g. http://localhost:11434)": "",
"Enter Your Email": "Pagsulod sa imong e-mail address", "Enter Your Email": "Pagsulod sa imong e-mail address",
"Enter Your Full Name": "Ibutang ang imong tibuok nga ngalan", "Enter Your Full Name": "Ibutang ang imong tibuok nga ngalan",
"Enter your message": "",
"Enter Your Password": "Ibutang ang imong password", "Enter Your Password": "Ibutang ang imong password",
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "File mode", "File Mode": "File mode",
"File not found.": "Wala makit-an ang file.", "File not found.": "Wala makit-an ang file.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "", "Frequency Penalty": "",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Heneral", "General": "Heneral",
"General Settings": "kinatibuk-ang mga setting", "General Settings": "kinatibuk-ang mga setting",
"Generate Image": "", "Generate Image": "",
"Generating search query": "", "Generating search query": "",
"Generation Info": "", "Generation Info": "",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "", "Good Response": "",
"Google PSE API Key": "", "Google PSE API Key": "",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "Unsaon nako pagtabang kanimo karon?", "How can I help you today?": "Unsaon nako pagtabang kanimo karon?",
"Hybrid Search": "", "Hybrid Search": "",
"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.": "",
"Image Generation (Experimental)": "Pagmugna og hulagway (Eksperimento)", "Image Generation (Experimental)": "Pagmugna og hulagway (Eksperimento)",
"Image Generation Engine": "Makina sa paghimo og imahe", "Image Generation Engine": "Makina sa paghimo og imahe",
"Image Settings": "Mga Setting sa Imahen", "Image Settings": "Mga Setting sa Imahen",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Mga shortcut sa keyboard", "Keyboard shortcuts": "Mga shortcut sa keyboard",
"Knowledge": "", "Knowledge": "",
"Language": "Pinulongan", "Language": "Pinulongan",
"large language models, locally.": "",
"Last Active": "", "Last Active": "",
"Last Modified": "", "Last Modified": "",
"Light": "Kahayag", "Light": "Kahayag",
@@ -341,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. ",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "", "Pipelines Valves": "",
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "Dulaanan", "Playground": "Dulaanan",
"Please carefully review the following warnings:": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -475,10 +499,12 @@
"Rosé Pine": "Rosé Pine", "Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Aube Pine Rosé", "Rosé Pine Dawn": "Aube Pine Rosé",
"RTL": "", "RTL": "",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!",
@@ -558,6 +584,8 @@
"Success": "Kalampusan", "Success": "Kalampusan",
"Successfully updated.": "Malampuson nga na-update.", "Successfully updated.": "Malampuson nga na-update.",
"Suggested": "", "Suggested": "",
"Support": "",
"Support this plugin:": "",
"System": "Sistema", "System": "Sistema",
"System Prompt": "Madasig nga Sistema", "System Prompt": "Madasig nga Sistema",
"Tags": "Mga tag", "Tags": "Mga tag",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "Text-to-speech nga makina", "Text-to-Speech Engine": "Text-to-speech nga makina",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "", "Thanks for your feedback!": "",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "", "Thinking...": "",
@@ -593,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.": "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": "",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Ibabaw nga P", "Top P": "Ibabaw nga P",
"Trouble accessing Ollama?": "Adunay mga problema sa pag-access sa Ollama?", "Trouble accessing Ollama?": "Adunay mga problema sa pag-access sa Ollama?",
@@ -645,6 +681,7 @@
"Version": "Bersyon", "Version": "Bersyon",
"Voice": "", "Voice": "",
"Warning": "", "Warning": "",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "Web", "Web": "Web",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "Usa ka ka mapuslanon nga katabang", "You're a helpful assistant.": "Usa ka ka mapuslanon nga katabang",
"You're now logged in.": "Konektado ka na karon.", "You're now logged in.": "Konektado ka na karon.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "", "Youtube": "",
"Youtube Loader Settings": "" "Youtube Loader Settings": ""
} }
+40 -2
View File
@@ -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.",
@@ -130,7 +132,7 @@
"Content Extraction": "Inhaltsextraktion", "Content Extraction": "Inhaltsextraktion",
"Context Length": "Kontextlänge", "Context Length": "Kontextlänge",
"Continue Response": "Antwort fortsetzen", "Continue Response": "Antwort fortsetzen",
"Continue with {{provider}}": "Mit {{Anbieter}} fortfahren", "Continue with {{provider}}": "Mit {{provider}} fortfahren",
"Controls": "", "Controls": "",
"Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!", "Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!",
"Copy": "Kopieren", "Copy": "Kopieren",
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "{{name}} gelöscht", "Deleted {{name}}": "{{name}} gelöscht",
"Description": "Beschreibung", "Description": "Beschreibung",
"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt", "Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
"Disabled": "",
"Discover a function": "Entdecken Sie weitere Funktionen", "Discover a function": "Entdecken Sie weitere Funktionen",
"Discover a model": "Entdecken Sie weitere Modelle", "Discover a model": "Entdecken Sie weitere Modelle",
"Discover a prompt": "Entdecken Sie weitere Prompts", "Discover a prompt": "Entdecken Sie weitere Prompts",
@@ -188,6 +192,8 @@
"Dismissible": "ausblendbar", "Dismissible": "ausblendbar",
"Display Emoji in Call": "Emojis im Anruf anzeigen", "Display Emoji in Call": "Emojis im Anruf anzeigen",
"Display the username instead of You in the Chat": "Soll \"Sie\" durch Ihren Benutzernamen ersetzt werden?", "Display the username instead of You in the Chat": "Soll \"Sie\" durch Ihren Benutzernamen ersetzt werden?",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Dokument", "Document": "Dokument",
"Document Settings": "Dokumenteinstellungen", "Document Settings": "Dokumenteinstellungen",
"Documentation": "Dokumentation", "Documentation": "Dokumentation",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Ihre Daten bleiben sicher auf Ihrem lokal gehosteten Server.", "does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Ihre Daten bleiben sicher auf Ihrem lokal gehosteten Server.",
"Don't Allow": "Verbieten", "Don't Allow": "Verbieten",
"Don't have an account?": "Haben Sie noch kein Benutzerkonto?", "Don't have an account?": "Haben Sie noch kein Benutzerkonto?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "schlechter Schreibstil", "Don't like the style": "schlechter Schreibstil",
"Done": "Erledigt", "Done": "Erledigt",
"Download": "Exportieren", "Download": "Exportieren",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Community-Freigabe aktivieren", "Enable Community Sharing": "Community-Freigabe aktivieren",
"Enable New Sign Ups": "Registrierung erlauben", "Enable New Sign Ups": "Registrierung erlauben",
"Enable Web Search": "Websuche aktivieren", "Enable Web Search": "Websuche aktivieren",
"Enabled": "",
"Engine": "Engine", "Engine": "Engine",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.",
"Enter {{role}} message here": "Geben Sie die {{role}}-Nachricht hier ein", "Enter {{role}} message here": "Geben Sie die {{role}}-Nachricht hier ein",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Geben Sie den", "Enter Serply API Key": "Geben Sie den",
"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein", "Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
"Enter stop sequence": "Stop-Sequenz eingeben", "Enter stop sequence": "Stop-Sequenz eingeben",
"Enter system prompt": "",
"Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein", "Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein",
"Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein", "Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein",
"Enter Top K": "Geben Sie Top K ein", "Enter Top K": "Geben Sie Top K ein",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)",
"Enter Your Email": "Geben Sie Ihre E-Mail-Adresse ein", "Enter Your Email": "Geben Sie Ihre E-Mail-Adresse ein",
"Enter Your Full Name": "Geben Sie Ihren vollständigen Namen ein", "Enter Your Full Name": "Geben Sie Ihren vollständigen Namen ein",
"Enter your message": "",
"Enter Your Password": "Geben Sie Ihr Passwort ein", "Enter Your Password": "Geben Sie Ihr Passwort ein",
"Enter Your Role": "Geben Sie Ihre Rolle ein", "Enter Your Role": "Geben Sie Ihre Rolle ein",
"Error": "Fehler", "Error": "Fehler",
@@ -266,6 +278,7 @@
"File": "Datei", "File": "Datei",
"File Mode": "Datei-Modus", "File Mode": "Datei-Modus",
"File not found.": "Datei nicht gefunden.", "File not found.": "Datei nicht gefunden.",
"Files": "",
"Filter is now globally disabled": "Filter ist jetzt global deaktiviert", "Filter is now globally disabled": "Filter ist jetzt global deaktiviert",
"Filter is now globally enabled": "Filter ist jetzt global aktiviert", "Filter is now globally enabled": "Filter ist jetzt global aktiviert",
"Filters": "Filter", "Filters": "Filter",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Frequenzstrafe", "Frequency Penalty": "Frequenzstrafe",
"Function created successfully": "Funktion erfolgreich erstellt", "Function created successfully": "Funktion erfolgreich erstellt",
"Function deleted successfully": "Funktion erfolgreich gelöscht", "Function deleted successfully": "Funktion erfolgreich gelöscht",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "Funktion erfolgreich aktualisiert", "Function updated successfully": "Funktion erfolgreich aktualisiert",
"Functions": "Funktionen", "Functions": "Funktionen",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "Funktionen erfolgreich importiert", "Functions imported successfully": "Funktionen erfolgreich importiert",
"General": "Allgemein", "General": "Allgemein",
"General Settings": "Allgemeine Einstellungen", "General Settings": "Allgemeine Einstellungen",
"Generate Image": "Bild erzeugen", "Generate Image": "Bild erzeugen",
"Generating search query": "Suchanfrage wird erstellt", "Generating search query": "Suchanfrage wird erstellt",
"Generation Info": "Generierungsinformationen", "Generation Info": "Generierungsinformationen",
"Get up and running with": "",
"Global": "Global", "Global": "Global",
"Good Response": "Gute Antwort", "Good Response": "Gute Antwort",
"Google PSE API Key": "Google PSE-API-Schlüssel", "Google PSE API Key": "Google PSE-API-Schlüssel",
@@ -298,6 +319,7 @@
"Hide Model": "Modell ausblenden", "Hide Model": "Modell ausblenden",
"How can I help you today?": "Wie kann ich Ihnen heute helfen?", "How can I help you today?": "Wie kann ich Ihnen heute helfen?",
"Hybrid Search": "Hybride Suche", "Hybrid Search": "Hybride Suche",
"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.": "",
"Image Generation (Experimental)": "Bildgenerierung (experimentell)", "Image Generation (Experimental)": "Bildgenerierung (experimentell)",
"Image Generation Engine": "Bildgenerierungs-Engine", "Image Generation Engine": "Bildgenerierungs-Engine",
"Image Settings": "Bildeinstellungen", "Image Settings": "Bildeinstellungen",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Tastenkombinationen", "Keyboard shortcuts": "Tastenkombinationen",
"Knowledge": "Wissen", "Knowledge": "Wissen",
"Language": "Sprache", "Language": "Sprache",
"large language models, locally.": "",
"Last Active": "Zuletzt aktiv", "Last Active": "Zuletzt aktiv",
"Last Modified": "Zuletzt bearbeitet", "Last Modified": "Zuletzt bearbeitet",
"Light": "Hell", "Light": "Hell",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Pipeline Valves", "Pipelines Valves": "Pipeline Valves",
"Plain text (.txt)": "Nur Text (.txt)", "Plain text (.txt)": "Nur Text (.txt)",
"Playground": "Testumgebung", "Playground": "Testumgebung",
"Please carefully review the following warnings:": "",
"Positive attitude": "Positive Einstellung", "Positive attitude": "Positive Einstellung",
"Previous 30 days": "Vorherige 30 Tage", "Previous 30 days": "Vorherige 30 Tage",
"Previous 7 days": "Vorherige 7 Tage", "Previous 7 days": "Vorherige 7 Tage",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "Läuft", "Running": "Läuft",
"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!",
@@ -558,6 +584,8 @@
"Success": "Erfolg", "Success": "Erfolg",
"Successfully updated.": "Erfolgreich aktualisiert.", "Successfully updated.": "Erfolgreich aktualisiert.",
"Suggested": "Vorgeschlagen", "Suggested": "Vorgeschlagen",
"Support": "",
"Support this plugin:": "",
"System": "System", "System": "System",
"System Prompt": "System-Prompt", "System Prompt": "System-Prompt",
"Tags": "Tags", "Tags": "Tags",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "Text-zu-Sprache-Engine", "Text-to-Speech Engine": "Text-zu-Sprache-Engine",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Danke für Ihr Feedback!", "Thanks for your feedback!": "Danke für Ihr Feedback!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.",
"Theme": "Design", "Theme": "Design",
"Thinking...": "Denke nach...", "Thinking...": "Denke nach...",
@@ -593,6 +622,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",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "Werkzeug erfolgreich gelöscht", "Tool deleted successfully": "Werkzeug erfolgreich gelöscht",
"Tool imported successfully": "Werkzeug erfolgreich importiert", "Tool imported successfully": "Werkzeug erfolgreich importiert",
"Tool updated successfully": "Werkzeug erfolgreich aktualisiert", "Tool updated successfully": "Werkzeug erfolgreich aktualisiert",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "Werkzeuge", "Tools": "Werkzeuge",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?", "Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?",
@@ -645,6 +681,7 @@
"Version": "Version", "Version": "Version",
"Voice": "Stimme", "Voice": "Stimme",
"Warning": "Warnung", "Warning": "Warnung",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Warnung: Wenn Sie das Einbettungsmodell aktualisieren oder ändern, müssen Sie alle Dokumente erneut importieren.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Warnung: Wenn Sie das Einbettungsmodell aktualisieren oder ändern, müssen Sie alle Dokumente erneut importieren.",
"Web": "Web", "Web": "Web",
"Web API": "Web-API", "Web API": "Web-API",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "Du bist ein hilfreicher Assistent.", "You're a helpful assistant.": "Du bist ein hilfreicher Assistent.",
"You're now logged in.": "Sie sind jetzt eingeloggt.", "You're now logged in.": "Sie sind jetzt eingeloggt.",
"Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.", "Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.",
"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "",
"Youtube": "YouTube", "Youtube": "YouTube",
"Youtube Loader Settings": "YouTube-Ladeeinstellungen" "Youtube Loader Settings": "YouTube-Ladeeinstellungen"
} }
+39 -1
View File
@@ -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": "",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "", "Deleted {{name}}": "",
"Description": "Description", "Description": "Description",
"Didn't fully follow instructions": "", "Didn't fully follow instructions": "",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "", "Discover a model": "",
"Discover a prompt": "Discover a prompt", "Discover a prompt": "Discover a prompt",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Display username instead of You in Chat", "Display the username instead of You in the Chat": "Display username instead of You in Chat",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Document", "Document": "Document",
"Document Settings": "Document Settings", "Document Settings": "Document Settings",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "does not connect external, data stays safe locally.", "does not make any external connections, and your data stays securely on your locally hosted server.": "does not connect external, data stays safe locally.",
"Don't Allow": "Don't Allow", "Don't Allow": "Don't Allow",
"Don't have an account?": "No account? Much sad.", "Don't have an account?": "No account? Much sad.",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "", "Don't like the style": "",
"Done": "", "Done": "",
"Download": "", "Download": "",
@@ -206,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": "",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "Enable New Bark Ups", "Enable New Sign Ups": "Enable New Bark Ups",
"Enable Web Search": "", "Enable Web Search": "",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "Enter {{role}} bork here", "Enter {{role}} message here": "Enter {{role}} bork here",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "Enter stop bark", "Enter stop sequence": "Enter stop bark",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Enter Top Wow", "Enter Top K": "Enter Top Wow",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "", "Enter URL (e.g. http://localhost:11434)": "",
"Enter Your Email": "Enter Your Dogemail", "Enter Your Email": "Enter Your Dogemail",
"Enter Your Full Name": "Enter Your Full Wow", "Enter Your Full Name": "Enter Your Full Wow",
"Enter your message": "",
"Enter Your Password": "Enter Your Barkword", "Enter Your Password": "Enter Your Barkword",
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "Bark Mode", "File Mode": "Bark Mode",
"File not found.": "Bark not found.", "File not found.": "Bark not found.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "", "Frequency Penalty": "",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Woweral", "General": "Woweral",
"General Settings": "General Doge Settings", "General Settings": "General Doge Settings",
"Generate Image": "", "Generate Image": "",
"Generating search query": "", "Generating search query": "",
"Generation Info": "", "Generation Info": "",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "", "Good Response": "",
"Google PSE API Key": "", "Google PSE API Key": "",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "How can I halp u today?", "How can I help you today?": "How can I halp u today?",
"Hybrid Search": "", "Hybrid Search": "",
"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.": "",
"Image Generation (Experimental)": "Image Wow (Much Experiment)", "Image Generation (Experimental)": "Image Wow (Much Experiment)",
"Image Generation Engine": "Image Engine", "Image Generation Engine": "Image Engine",
"Image Settings": "Settings for Wowmage", "Image Settings": "Settings for Wowmage",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Keyboard Barkcuts", "Keyboard shortcuts": "Keyboard Barkcuts",
"Knowledge": "", "Knowledge": "",
"Language": "Doge Speak", "Language": "Doge Speak",
"large language models, locally.": "",
"Last Active": "", "Last Active": "",
"Last Modified": "", "Last Modified": "",
"Light": "Light", "Light": "Light",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "", "Pipelines Valves": "",
"Plain text (.txt)": "Plain text (.txt)", "Plain text (.txt)": "Plain text (.txt)",
"Playground": "Playground", "Playground": "Playground",
"Please carefully review the following warnings:": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -475,10 +499,12 @@
"Rosé Pine": "Rosé Pine", "Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn", "Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "", "RTL": "",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!",
@@ -560,6 +586,8 @@
"Success": "Success very success", "Success": "Success very success",
"Successfully updated.": "Successfully updated. Very updated.", "Successfully updated.": "Successfully updated. Very updated.",
"Suggested": "", "Suggested": "",
"Support": "",
"Support this plugin:": "",
"System": "System very system", "System": "System very system",
"System Prompt": "System Prompt much prompt", "System Prompt": "System Prompt much prompt",
"Tags": "Tags very tags", "Tags": "Tags very tags",
@@ -572,6 +600,7 @@
"Text-to-Speech Engine": "Text-to-Speech Engine much speak", "Text-to-Speech Engine": "Text-to-Speech Engine much speak",
"Tfs Z": "Tfs Z much Z", "Tfs Z": "Tfs Z much Z",
"Thanks for your feedback!": "", "Thanks for your feedback!": "",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
"Theme": "Theme much theme", "Theme": "Theme much theme",
"Thinking...": "", "Thinking...": "",
@@ -595,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. 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": "",
@@ -605,7 +635,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K very top", "Top K": "Top K very top",
"Top P": "Top P very top", "Top P": "Top P very top",
"Trouble accessing Ollama?": "Trouble accessing Ollama? Much trouble?", "Trouble accessing Ollama?": "Trouble accessing Ollama? Much trouble?",
@@ -647,6 +683,7 @@
"Version": "Version much version", "Version": "Version much version",
"Voice": "", "Voice": "",
"Warning": "", "Warning": "",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "Web very web", "Web": "Web very web",
"Web API": "", "Web API": "",
@@ -673,6 +710,7 @@
"You're a helpful assistant.": "You're a helpful assistant. Much helpful.", "You're a helpful assistant.": "You're a helpful assistant. Much helpful.",
"You're now logged in.": "You're now logged in. Much logged.", "You're now logged in.": "You're now logged in. Much logged.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "", "Youtube": "",
"Youtube Loader Settings": "" "Youtube Loader Settings": ""
} }
+39 -1
View File
@@ -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": "",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "", "Deleted {{name}}": "",
"Description": "", "Description": "",
"Didn't fully follow instructions": "", "Didn't fully follow instructions": "",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "", "Discover a model": "",
"Discover a prompt": "", "Discover a prompt": "",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "", "Display the username instead of You in the Chat": "",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "", "Document": "",
"Document Settings": "", "Document Settings": "",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "", "does not make any external connections, and your data stays securely on your locally hosted server.": "",
"Don't Allow": "", "Don't Allow": "",
"Don't have an account?": "", "Don't have an account?": "",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "", "Don't like the style": "",
"Done": "", "Done": "",
"Download": "", "Download": "",
@@ -206,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": "",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "", "Enable New Sign Ups": "",
"Enable Web Search": "", "Enable Web Search": "",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "", "Enter {{role}} message here": "",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "", "Enter stop sequence": "",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "", "Enter Top K": "",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "", "Enter URL (e.g. http://localhost:11434)": "",
"Enter Your Email": "", "Enter Your Email": "",
"Enter Your Full Name": "", "Enter Your Full Name": "",
"Enter your message": "",
"Enter Your Password": "", "Enter Your Password": "",
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "", "File Mode": "",
"File not found.": "", "File not found.": "",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "", "Frequency Penalty": "",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "", "General": "",
"General Settings": "", "General Settings": "",
"Generate Image": "", "Generate Image": "",
"Generating search query": "", "Generating search query": "",
"Generation Info": "", "Generation Info": "",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "", "Good Response": "",
"Google PSE API Key": "", "Google PSE API Key": "",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "", "How can I help you today?": "",
"Hybrid Search": "", "Hybrid Search": "",
"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.": "",
"Image Generation (Experimental)": "", "Image Generation (Experimental)": "",
"Image Generation Engine": "", "Image Generation Engine": "",
"Image Settings": "", "Image Settings": "",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "", "Keyboard shortcuts": "",
"Knowledge": "", "Knowledge": "",
"Language": "", "Language": "",
"large language models, locally.": "",
"Last Active": "", "Last Active": "",
"Last Modified": "", "Last Modified": "",
"Light": "", "Light": "",
@@ -341,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.": "",
@@ -353,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": "",
@@ -438,6 +461,7 @@
"Pipelines Valves": "", "Pipelines Valves": "",
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "", "Playground": "",
"Please carefully review the following warnings:": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!": "",
@@ -558,6 +584,8 @@
"Success": "", "Success": "",
"Successfully updated.": "", "Successfully updated.": "",
"Suggested": "", "Suggested": "",
"Support": "",
"Support this plugin:": "",
"System": "", "System": "",
"System Prompt": "", "System Prompt": "",
"Tags": "", "Tags": "",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "", "Text-to-Speech Engine": "",
"Tfs Z": "", "Tfs Z": "",
"Thanks for your feedback!": "", "Thanks for your feedback!": "",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
"Theme": "", "Theme": "",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "", "Top K": "",
"Top P": "", "Top P": "",
"Trouble accessing Ollama?": "", "Trouble accessing Ollama?": "",
@@ -645,6 +681,7 @@
"Version": "", "Version": "",
"Voice": "", "Voice": "",
"Warning": "", "Warning": "",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "", "Web": "",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "", "You're a helpful assistant.": "",
"You're now logged in.": "", "You're now logged in.": "",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "", "Youtube": "",
"Youtube Loader Settings": "" "Youtube Loader Settings": ""
} }
+39 -1
View File
@@ -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": "",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "", "Deleted {{name}}": "",
"Description": "", "Description": "",
"Didn't fully follow instructions": "", "Didn't fully follow instructions": "",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "", "Discover a model": "",
"Discover a prompt": "", "Discover a prompt": "",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "", "Display the username instead of You in the Chat": "",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "", "Document": "",
"Document Settings": "", "Document Settings": "",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "", "does not make any external connections, and your data stays securely on your locally hosted server.": "",
"Don't Allow": "", "Don't Allow": "",
"Don't have an account?": "", "Don't have an account?": "",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "", "Don't like the style": "",
"Done": "", "Done": "",
"Download": "", "Download": "",
@@ -206,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": "",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "", "Enable New Sign Ups": "",
"Enable Web Search": "", "Enable Web Search": "",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
"Enter {{role}} message here": "", "Enter {{role}} message here": "",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "", "Enter stop sequence": "",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "", "Enter Top K": "",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "", "Enter URL (e.g. http://localhost:11434)": "",
"Enter Your Email": "", "Enter Your Email": "",
"Enter Your Full Name": "", "Enter Your Full Name": "",
"Enter your message": "",
"Enter Your Password": "", "Enter Your Password": "",
"Enter Your Role": "", "Enter Your Role": "",
"Error": "", "Error": "",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "", "File Mode": "",
"File not found.": "", "File not found.": "",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "", "Frequency Penalty": "",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "", "General": "",
"General Settings": "", "General Settings": "",
"Generate Image": "", "Generate Image": "",
"Generating search query": "", "Generating search query": "",
"Generation Info": "", "Generation Info": "",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "", "Good Response": "",
"Google PSE API Key": "", "Google PSE API Key": "",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "", "How can I help you today?": "",
"Hybrid Search": "", "Hybrid Search": "",
"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.": "",
"Image Generation (Experimental)": "", "Image Generation (Experimental)": "",
"Image Generation Engine": "", "Image Generation Engine": "",
"Image Settings": "", "Image Settings": "",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "", "Keyboard shortcuts": "",
"Knowledge": "", "Knowledge": "",
"Language": "", "Language": "",
"large language models, locally.": "",
"Last Active": "", "Last Active": "",
"Last Modified": "", "Last Modified": "",
"Light": "", "Light": "",
@@ -341,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.": "",
@@ -353,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": "",
@@ -438,6 +461,7 @@
"Pipelines Valves": "", "Pipelines Valves": "",
"Plain text (.txt)": "", "Plain text (.txt)": "",
"Playground": "", "Playground": "",
"Please carefully review the following warnings:": "",
"Positive attitude": "", "Positive attitude": "",
"Previous 30 days": "", "Previous 30 days": "",
"Previous 7 days": "", "Previous 7 days": "",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!": "",
@@ -558,6 +584,8 @@
"Success": "", "Success": "",
"Successfully updated.": "", "Successfully updated.": "",
"Suggested": "", "Suggested": "",
"Support": "",
"Support this plugin:": "",
"System": "", "System": "",
"System Prompt": "", "System Prompt": "",
"Tags": "", "Tags": "",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "", "Text-to-Speech Engine": "",
"Tfs Z": "", "Tfs Z": "",
"Thanks for your feedback!": "", "Thanks for your feedback!": "",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
"Theme": "", "Theme": "",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "", "Top K": "",
"Top P": "", "Top P": "",
"Trouble accessing Ollama?": "", "Trouble accessing Ollama?": "",
@@ -645,6 +681,7 @@
"Version": "", "Version": "",
"Voice": "", "Voice": "",
"Warning": "", "Warning": "",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
"Web": "", "Web": "",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "", "You're a helpful assistant.": "",
"You're now logged in.": "", "You're now logged in.": "",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "", "Youtube": "",
"Youtube Loader Settings": "" "Youtube Loader Settings": ""
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Eliminado {{nombre}}", "Deleted {{name}}": "Eliminado {{nombre}}",
"Description": "Descripción", "Description": "Descripción",
"Didn't fully follow instructions": "No siguió las instrucciones", "Didn't fully follow instructions": "No siguió las instrucciones",
"Disabled": "",
"Discover a function": "Descubre una función", "Discover a function": "Descubre una función",
"Discover a model": "Descubrir un modelo", "Discover a model": "Descubrir un modelo",
"Discover a prompt": "Descubre un Prompt", "Discover a prompt": "Descubre un Prompt",
@@ -188,6 +192,8 @@
"Dismissible": "Desestimable", "Dismissible": "Desestimable",
"Display Emoji in Call": "Muestra Emoji en llamada", "Display Emoji in Call": "Muestra Emoji en llamada",
"Display the username instead of You in the Chat": "Mostrar el nombre de usuario en lugar de Usted en el chat", "Display the username instead of You in the Chat": "Mostrar el nombre de usuario en lugar de Usted en el chat",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Documento", "Document": "Documento",
"Document Settings": "Configuración del Documento", "Document Settings": "Configuración del Documento",
"Documentation": "Documentación", "Documentation": "Documentación",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "no realiza ninguna conexión externa y sus datos permanecen seguros en su servidor alojado localmente.", "does not make any external connections, and your data stays securely on your locally hosted server.": "no realiza ninguna conexión externa y sus datos permanecen seguros en su servidor alojado localmente.",
"Don't Allow": "No Permitir", "Don't Allow": "No Permitir",
"Don't have an account?": "¿No tienes una cuenta?", "Don't have an account?": "¿No tienes una cuenta?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "No te gusta el estilo?", "Don't like the style": "No te gusta el estilo?",
"Done": "Hecho", "Done": "Hecho",
"Download": "Descargar", "Download": "Descargar",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Habilitar el uso compartido de la comunidad", "Enable Community Sharing": "Habilitar el uso compartido de la comunidad",
"Enable New Sign Ups": "Habilitar Nuevos Registros", "Enable New Sign Ups": "Habilitar Nuevos Registros",
"Enable Web Search": "Habilitar la búsqueda web", "Enable Web Search": "Habilitar la búsqueda web",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.",
"Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí", "Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Ingrese la clave API de Serply", "Enter Serply API Key": "Ingrese la clave API de Serply",
"Enter Serpstack API Key": "Ingrese la clave API de Serpstack", "Enter Serpstack API Key": "Ingrese la clave API de Serpstack",
"Enter stop sequence": "Ingrese la secuencia de parada", "Enter stop sequence": "Ingrese la secuencia de parada",
"Enter system prompt": "",
"Enter Tavily API Key": "Ingrese la clave API de Tavily", "Enter Tavily API Key": "Ingrese la clave API de Tavily",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Ingrese el Top K", "Enter Top K": "Ingrese el Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Ingrese la URL (p.ej., http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Ingrese la URL (p.ej., http://localhost:11434)",
"Enter Your Email": "Ingrese su correo electrónico", "Enter Your Email": "Ingrese su correo electrónico",
"Enter Your Full Name": "Ingrese su nombre completo", "Enter Your Full Name": "Ingrese su nombre completo",
"Enter your message": "",
"Enter Your Password": "Ingrese su contraseña", "Enter Your Password": "Ingrese su contraseña",
"Enter Your Role": "Ingrese su rol", "Enter Your Role": "Ingrese su rol",
"Error": "Error", "Error": "Error",
@@ -266,6 +278,7 @@
"File": "Archivo", "File": "Archivo",
"File Mode": "Modo de archivo", "File Mode": "Modo de archivo",
"File not found.": "Archivo no encontrado.", "File not found.": "Archivo no encontrado.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "Filtros", "Filters": "Filtros",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Penalización de frecuencia", "Frequency Penalty": "Penalización de frecuencia",
"Function created successfully": "Función creada exitosamente", "Function created successfully": "Función creada exitosamente",
"Function deleted successfully": "Función borrada exitosamente", "Function deleted successfully": "Función borrada exitosamente",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "Función actualizada exitosamente", "Function updated successfully": "Función actualizada exitosamente",
"Functions": "Funciones", "Functions": "Funciones",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "Funciones importadas exitosamente", "Functions imported successfully": "Funciones importadas exitosamente",
"General": "General", "General": "General",
"General Settings": "Opciones Generales", "General Settings": "Opciones Generales",
"Generate Image": "Generar imagen", "Generate Image": "Generar imagen",
"Generating search query": "Generación de consultas de búsqueda", "Generating search query": "Generación de consultas de búsqueda",
"Generation Info": "Información de Generación", "Generation Info": "Información de Generación",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "Buena Respuesta", "Good Response": "Buena Respuesta",
"Google PSE API Key": "Clave API de Google PSE", "Google PSE API Key": "Clave API de Google PSE",
@@ -298,6 +319,7 @@
"Hide Model": "Esconder Modelo", "Hide Model": "Esconder Modelo",
"How can I help you today?": "¿Cómo puedo ayudarte hoy?", "How can I help you today?": "¿Cómo puedo ayudarte hoy?",
"Hybrid Search": "Búsqueda Híbrida", "Hybrid Search": "Búsqueda Híbrida",
"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.": "",
"Image Generation (Experimental)": "Generación de imágenes (experimental)", "Image Generation (Experimental)": "Generación de imágenes (experimental)",
"Image Generation Engine": "Motor de generación de imágenes", "Image Generation Engine": "Motor de generación de imágenes",
"Image Settings": "Ajustes de la Imágen", "Image Settings": "Ajustes de la Imágen",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Atajos de teclado", "Keyboard shortcuts": "Atajos de teclado",
"Knowledge": "Conocimiento", "Knowledge": "Conocimiento",
"Language": "Lenguaje", "Language": "Lenguaje",
"large language models, locally.": "",
"Last Active": "Última Actividad", "Last Active": "Última Actividad",
"Last Modified": "Modificado por última vez", "Last Modified": "Modificado por última vez",
"Light": "Claro", "Light": "Claro",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Tuberías Válvulas", "Pipelines Valves": "Tuberías Válvulas",
"Plain text (.txt)": "Texto plano (.txt)", "Plain text (.txt)": "Texto plano (.txt)",
"Playground": "Patio de juegos", "Playground": "Patio de juegos",
"Please carefully review the following warnings:": "",
"Positive attitude": "Actitud positiva", "Positive attitude": "Actitud positiva",
"Previous 30 days": "Últimos 30 días", "Previous 30 days": "Últimos 30 días",
"Previous 7 days": "Últimos 7 días", "Previous 7 days": "Últimos 7 días",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "Ejecutando", "Running": "Ejecutando",
"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!",
@@ -559,6 +585,8 @@
"Success": "Éxito", "Success": "Éxito",
"Successfully updated.": "Actualizado exitosamente.", "Successfully updated.": "Actualizado exitosamente.",
"Suggested": "Sugerido", "Suggested": "Sugerido",
"Support": "",
"Support this plugin:": "",
"System": "Sistema", "System": "Sistema",
"System Prompt": "Prompt del sistema", "System Prompt": "Prompt del sistema",
"Tags": "Etiquetas", "Tags": "Etiquetas",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "Motor de texto a voz", "Text-to-Speech Engine": "Motor de texto a voz",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "¡Gracias por tu retroalimentación!", "Thanks for your feedback!": "¡Gracias por tu retroalimentación!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "El puntaje debe ser un valor entre 0.0 (0%) y 1.0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "El puntaje debe ser un valor entre 0.0 (0%) y 1.0 (100%).",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "Pensando...", "Thinking...": "Pensando...",
@@ -594,6 +623,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",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "Herramienta eliminada con éxito", "Tool deleted successfully": "Herramienta eliminada con éxito",
"Tool imported successfully": "Herramienta importada con éxito", "Tool imported successfully": "Herramienta importada con éxito",
"Tool updated successfully": "Herramienta actualizada con éxito", "Tool updated successfully": "Herramienta actualizada con éxito",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "Herramientas", "Tools": "Herramientas",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?", "Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
@@ -646,6 +682,7 @@
"Version": "Versión", "Version": "Versión",
"Voice": "Voz", "Voice": "Voz",
"Warning": "Advertencia", "Warning": "Advertencia",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advertencia: Si actualiza o cambia su modelo de inserción, necesitará volver a importar todos los documentos.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Advertencia: Si actualiza o cambia su modelo de inserción, necesitará volver a importar todos los documentos.",
"Web": "Web", "Web": "Web",
"Web API": "API Web", "Web API": "API Web",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "Usted es un asistente útil.", "You're a helpful assistant.": "Usted es un asistente útil.",
"You're now logged in.": "Usted ahora está conectado.", "You're now logged in.": "Usted ahora está conectado.",
"Your account status is currently pending activation.": "El estado de su cuenta actualmente se encuentra pendiente de activación.", "Your account status is currently pending activation.": "El estado de su cuenta actualmente se encuentra pendiente de activación.",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Configuración del cargador de Youtube" "Youtube Loader Settings": "Configuración del cargador de Youtube"
} }
+39 -1
View File
@@ -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": "حذف این لینک",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "حذف شده {{name}}", "Deleted {{name}}": "حذف شده {{name}}",
"Description": "توضیحات", "Description": "توضیحات",
"Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند", "Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "کشف یک مدل", "Discover a model": "کشف یک مدل",
"Discover a prompt": "یک اعلان را کشف کنید", "Discover a prompt": "یک اعلان را کشف کنید",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "نمایش نام کاربری به جای «شما» در چت", "Display the username instead of You in the Chat": "نمایش نام کاربری به جای «شما» در چت",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "سند", "Document": "سند",
"Document Settings": "تنظیمات سند", "Document Settings": "تنظیمات سند",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "هیچ اتصال خارجی ایجاد نمی کند و داده های شما به طور ایمن در سرور میزبان محلی شما باقی می ماند.", "does not make any external connections, and your data stays securely on your locally hosted server.": "هیچ اتصال خارجی ایجاد نمی کند و داده های شما به طور ایمن در سرور میزبان محلی شما باقی می ماند.",
"Don't Allow": "اجازه نده", "Don't Allow": "اجازه نده",
"Don't have an account?": "حساب کاربری ندارید؟", "Don't have an account?": "حساب کاربری ندارید؟",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "نظری ندارید؟", "Don't like the style": "نظری ندارید؟",
"Done": "", "Done": "",
"Download": "دانلود کن", "Download": "دانلود کن",
@@ -206,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": "مدل پیدائش",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "فعالسازی اشتراک انجمن", "Enable Community Sharing": "فعالسازی اشتراک انجمن",
"Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید", "Enable New Sign Ups": "فعال کردن ثبت نام\u200cهای جدید",
"Enable Web Search": "فعالسازی جستجوی وب", "Enable Web Search": "فعالسازی جستجوی وب",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "اطمینان حاصل کنید که فایل CSV شما شامل چهار ستون در این ترتیب است: نام، ایمیل، رمز عبور، نقش.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "اطمینان حاصل کنید که فایل CSV شما شامل چهار ستون در این ترتیب است: نام، ایمیل، رمز عبور، نقش.",
"Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید", "Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "کلید API Serpstack را وارد کنید", "Enter Serpstack API Key": "کلید API Serpstack را وارد کنید",
"Enter stop sequence": "توالی توقف را وارد کنید", "Enter stop sequence": "توالی توقف را وارد کنید",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "مقدار Top K را وارد کنید", "Enter Top K": "مقدار Top K را وارد کنید",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "مقدار URL را وارد کنید (مثال http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "مقدار URL را وارد کنید (مثال http://localhost:11434)",
"Enter Your Email": "ایمیل خود را وارد کنید", "Enter Your Email": "ایمیل خود را وارد کنید",
"Enter Your Full Name": "نام کامل خود را وارد کنید", "Enter Your Full Name": "نام کامل خود را وارد کنید",
"Enter your message": "",
"Enter Your Password": "رمز عبور خود را وارد کنید", "Enter Your Password": "رمز عبور خود را وارد کنید",
"Enter Your Role": "نقش خود را وارد کنید", "Enter Your Role": "نقش خود را وارد کنید",
"Error": "خطا", "Error": "خطا",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "حالت فایل", "File Mode": "حالت فایل",
"File not found.": "فایل یافت نشد.", "File not found.": "فایل یافت نشد.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "مجازات فرکانس", "Frequency Penalty": "مجازات فرکانس",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "عمومی", "General": "عمومی",
"General Settings": "تنظیمات عمومی", "General Settings": "تنظیمات عمومی",
"Generate Image": "", "Generate Image": "",
"Generating search query": "در حال تولید پرسوجوی جستجو", "Generating search query": "در حال تولید پرسوجوی جستجو",
"Generation Info": "اطلاعات تولید", "Generation Info": "اطلاعات تولید",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "پاسخ خوب", "Good Response": "پاسخ خوب",
"Google PSE API Key": "گوگل PSE API کلید", "Google PSE API Key": "گوگل PSE API کلید",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "امروز چطور می توانم کمک تان کنم؟", "How can I help you today?": "امروز چطور می توانم کمک تان کنم؟",
"Hybrid Search": "جستجوی همزمان", "Hybrid Search": "جستجوی همزمان",
"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.": "",
"Image Generation (Experimental)": "تولید تصویر (آزمایشی)", "Image Generation (Experimental)": "تولید تصویر (آزمایشی)",
"Image Generation Engine": "موتور تولید تصویر", "Image Generation Engine": "موتور تولید تصویر",
"Image Settings": "تنظیمات تصویر", "Image Settings": "تنظیمات تصویر",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "میانبرهای صفحه کلید", "Keyboard shortcuts": "میانبرهای صفحه کلید",
"Knowledge": "", "Knowledge": "",
"Language": "زبان", "Language": "زبان",
"large language models, locally.": "",
"Last Active": "آخرین فعال", "Last Active": "آخرین فعال",
"Last Modified": "", "Last Modified": "",
"Light": "روشن", "Light": "روشن",
@@ -341,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 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "شیرالات خطوط لوله", "Pipelines Valves": "شیرالات خطوط لوله",
"Plain text (.txt)": "متن ساده (.txt)", "Plain text (.txt)": "متن ساده (.txt)",
"Playground": "زمین بازی", "Playground": "زمین بازی",
"Please carefully review the following warnings:": "",
"Positive attitude": "نظرات مثبت", "Positive attitude": "نظرات مثبت",
"Previous 30 days": "30 روز قبل", "Previous 30 days": "30 روز قبل",
"Previous 7 days": "7 روز قبل", "Previous 7 days": "7 روز قبل",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!": "اسکن کامل شد!",
@@ -558,6 +584,8 @@
"Success": "موفقیت", "Success": "موفقیت",
"Successfully updated.": "با موفقیت به روز شد", "Successfully updated.": "با موفقیت به روز شد",
"Suggested": "پیشنهادی", "Suggested": "پیشنهادی",
"Support": "",
"Support this plugin:": "",
"System": "سیستم", "System": "سیستم",
"System Prompt": "پرامپت سیستم", "System Prompt": "پرامپت سیستم",
"Tags": "تگ\u200cها", "Tags": "تگ\u200cها",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "موتور تبدیل متن به گفتار", "Text-to-Speech Engine": "موتور تبدیل متن به گفتار",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "با تشکر از بازخورد شما!", "Thanks for your feedback!": "با تشکر از بازخورد شما!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "امتیاز باید یک مقدار بین 0.0 (0%) و 1.0 (100%) باشد.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "امتیاز باید یک مقدار بین 0.0 (0%) و 1.0 (100%) باشد.",
"Theme": "قالب", "Theme": "قالب",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "امروز",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "در دسترسی به اولاما مشکل دارید؟", "Trouble accessing Ollama?": "در دسترسی به اولاما مشکل دارید؟",
@@ -645,6 +681,7 @@
"Version": "نسخه", "Version": "نسخه",
"Voice": "", "Voice": "",
"Warning": "هشدار", "Warning": "هشدار",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "هشدار: اگر شما به روز کنید یا تغییر دهید مدل شما، باید تمام سند ها را مجددا وارد کنید.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "هشدار: اگر شما به روز کنید یا تغییر دهید مدل شما، باید تمام سند ها را مجددا وارد کنید.",
"Web": "وب", "Web": "وب",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "تو یک دستیار سودمند هستی.", "You're a helpful assistant.": "تو یک دستیار سودمند هستی.",
"You're now logged in.": "شما اکنون وارد شده\u200cاید.", "You're now logged in.": "شما اکنون وارد شده\u200cاید.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "یوتیوب", "Youtube": "یوتیوب",
"Youtube Loader Settings": "تنظیمات لودر یوتیوب" "Youtube Loader Settings": "تنظیمات لودر یوتیوب"
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Poistettu {{nimi}}", "Deleted {{name}}": "Poistettu {{nimi}}",
"Description": "Kuvaus", "Description": "Kuvaus",
"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin", "Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "Tutustu malliin", "Discover a model": "Tutustu malliin",
"Discover a prompt": "Löydä kehote", "Discover a prompt": "Löydä kehote",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa", "Display the username instead of You in the Chat": "Näytä käyttäjänimi keskustelussa",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Asiakirja", "Document": "Asiakirja",
"Document Settings": "Asiakirja-asetukset", "Document Settings": "Asiakirja-asetukset",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "ei tee ulkoisia yhteyksiä, ja tietosi pysyvät turvallisesti paikallisesti isännöidyllä palvelimellasi.", "does not make any external connections, and your data stays securely on your locally hosted server.": "ei tee ulkoisia yhteyksiä, ja tietosi pysyvät turvallisesti paikallisesti isännöidyllä palvelimellasi.",
"Don't Allow": "Älä salli", "Don't Allow": "Älä salli",
"Don't have an account?": "Eikö sinulla ole tiliä?", "Don't have an account?": "Eikö sinulla ole tiliä?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "En pidä tyylistä", "Don't like the style": "En pidä tyylistä",
"Done": "", "Done": "",
"Download": "Lataa", "Download": "Lataa",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön", "Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
"Enable New Sign Ups": "Salli uudet rekisteröitymiset", "Enable New Sign Ups": "Salli uudet rekisteröitymiset",
"Enable Web Search": "Ota verkkohaku käyttöön", "Enable Web Search": "Ota verkkohaku käyttöön",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta seuraavassa järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta seuraavassa järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.",
"Enter {{role}} message here": "Kirjoita {{role}} viesti tähän", "Enter {{role}} message here": "Kirjoita {{role}} viesti tähän",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Anna Serpstack API -avain", "Enter Serpstack API Key": "Anna Serpstack API -avain",
"Enter stop sequence": "Syötä lopetussekvenssi", "Enter stop sequence": "Syötä lopetussekvenssi",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Syötä Top K", "Enter Top K": "Syötä Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Syötä URL (esim. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Syötä URL (esim. http://localhost:11434)",
"Enter Your Email": "Syötä sähköpostiosoitteesi", "Enter Your Email": "Syötä sähköpostiosoitteesi",
"Enter Your Full Name": "Syötä koko nimesi", "Enter Your Full Name": "Syötä koko nimesi",
"Enter your message": "",
"Enter Your Password": "Syötä salasanasi", "Enter Your Password": "Syötä salasanasi",
"Enter Your Role": "Syötä roolisi", "Enter Your Role": "Syötä roolisi",
"Error": "Virhe", "Error": "Virhe",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "Tiedostotila", "File Mode": "Tiedostotila",
"File not found.": "Tiedostoa ei löytynyt.", "File not found.": "Tiedostoa ei löytynyt.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Taajuussakko", "Frequency Penalty": "Taajuussakko",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Yleinen", "General": "Yleinen",
"General Settings": "Yleisasetukset", "General Settings": "Yleisasetukset",
"Generate Image": "", "Generate Image": "",
"Generating search query": "Hakukyselyn luominen", "Generating search query": "Hakukyselyn luominen",
"Generation Info": "Generointitiedot", "Generation Info": "Generointitiedot",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "Hyvä vastaus", "Good Response": "Hyvä vastaus",
"Google PSE API Key": "Google PSE API -avain", "Google PSE API Key": "Google PSE API -avain",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "Kuinka voin auttaa tänään?", "How can I help you today?": "Kuinka voin auttaa tänään?",
"Hybrid Search": "Hybridihaku", "Hybrid Search": "Hybridihaku",
"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.": "",
"Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)", "Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)",
"Image Generation Engine": "Kuvagenerointimoottori", "Image Generation Engine": "Kuvagenerointimoottori",
"Image Settings": "Kuva-asetukset", "Image Settings": "Kuva-asetukset",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Pikanäppäimet", "Keyboard shortcuts": "Pikanäppäimet",
"Knowledge": "", "Knowledge": "",
"Language": "Kieli", "Language": "Kieli",
"large language models, locally.": "",
"Last Active": "Viimeksi aktiivinen", "Last Active": "Viimeksi aktiivinen",
"Last Modified": "", "Last Modified": "",
"Light": "Vaalea", "Light": "Vaalea",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Putkistot Venttiilit", "Pipelines Valves": "Putkistot Venttiilit",
"Plain text (.txt)": "Pelkkä teksti (.txt)", "Plain text (.txt)": "Pelkkä teksti (.txt)",
"Playground": "Leikkipaikka", "Playground": "Leikkipaikka",
"Please carefully review the following warnings:": "",
"Positive attitude": "Positiivinen asenne", "Positive attitude": "Positiivinen asenne",
"Previous 30 days": "Edelliset 30 päivää", "Previous 30 days": "Edelliset 30 päivää",
"Previous 7 days": "Edelliset 7 päivää", "Previous 7 days": "Edelliset 7 päivää",
@@ -475,10 +499,12 @@
"Rosé Pine": "Rosee-mänty", "Rosé Pine": "Rosee-mänty",
"Rosé Pine Dawn": "Aamuinen Rosee-mänty", "Rosé Pine Dawn": "Aamuinen Rosee-mänty",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!",
@@ -558,6 +584,8 @@
"Success": "Onnistui", "Success": "Onnistui",
"Successfully updated.": "Päivitetty onnistuneesti.", "Successfully updated.": "Päivitetty onnistuneesti.",
"Suggested": "Suositeltu", "Suggested": "Suositeltu",
"Support": "",
"Support this plugin:": "",
"System": "Järjestelmä", "System": "Järjestelmä",
"System Prompt": "Järjestelmäkehote", "System Prompt": "Järjestelmäkehote",
"Tags": "Tagit", "Tags": "Tagit",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "Puhemoottori", "Text-to-Speech Engine": "Puhemoottori",
"Tfs Z": "TFS Z", "Tfs Z": "TFS Z",
"Thanks for your feedback!": "Kiitos palautteestasi!", "Thanks for your feedback!": "Kiitos palautteestasi!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0.0 (0%) ja 1.0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Pisteytyksen tulee olla arvo välillä 0.0 (0%) ja 1.0 (100%).",
"Theme": "Teema", "Theme": "Teema",
"Thinking...": "", "Thinking...": "",
@@ -593,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.": "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",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?", "Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?",
@@ -645,6 +681,7 @@
"Version": "Versio", "Version": "Versio",
"Voice": "", "Voice": "",
"Warning": "Varoitus", "Warning": "Varoitus",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Varoitus: Jos päivität tai vaihdat upotusmallia, sinun on tuotava kaikki asiakirjat uudelleen.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Varoitus: Jos päivität tai vaihdat upotusmallia, sinun on tuotava kaikki asiakirjat uudelleen.",
"Web": "Web", "Web": "Web",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "Olet avulias apulainen.", "You're a helpful assistant.": "Olet avulias apulainen.",
"You're now logged in.": "Olet nyt kirjautunut sisään.", "You're now logged in.": "Olet nyt kirjautunut sisään.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Youtube Loader-asetukset" "Youtube Loader Settings": "Youtube Loader-asetukset"
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Supprimé {{name}}", "Deleted {{name}}": "Supprimé {{name}}",
"Description": "Description", "Description": "Description",
"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions", "Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
"Disabled": "",
"Discover a function": "Découvrez une fonction", "Discover a function": "Découvrez une fonction",
"Discover a model": "Découvrir un modèle", "Discover a model": "Découvrir un modèle",
"Discover a prompt": "Découvrir une suggestion", "Discover a prompt": "Découvrir une suggestion",
@@ -188,6 +192,8 @@
"Dismissible": "Fermeture", "Dismissible": "Fermeture",
"Display Emoji in Call": "Afficher les emojis pendant l'appel", "Display Emoji in Call": "Afficher les emojis pendant l'appel",
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat", "Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Document", "Document": "Document",
"Document Settings": "Paramètres du document", "Document Settings": "Paramètres du document",
"Documentation": "Documentation", "Documentation": "Documentation",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe et garde vos données en sécurité sur votre serveur local.", "does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe et garde vos données en sécurité sur votre serveur local.",
"Don't Allow": "Ne pas autoriser", "Don't Allow": "Ne pas autoriser",
"Don't have an account?": "Vous n'avez pas de compte ?", "Don't have an account?": "Vous n'avez pas de compte ?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "N'apprécie pas le style", "Don't like the style": "N'apprécie pas le style",
"Done": "Terminé", "Done": "Terminé",
"Download": "Télécharger", "Download": "Télécharger",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Activer le partage communautaire", "Enable Community Sharing": "Activer le partage communautaire",
"Enable New Sign Ups": "Activer les nouvelles inscriptions", "Enable New Sign Ups": "Activer les nouvelles inscriptions",
"Enable Web Search": "Activer la recherche sur le Web", "Enable Web Search": "Activer la recherche sur le Web",
"Enabled": "",
"Engine": "Moteur", "Engine": "Moteur",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.",
"Enter {{role}} message here": "Entrez le message {{role}} ici", "Enter {{role}} message here": "Entrez le message {{role}} ici",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Entrez la clé API Serply", "Enter Serply API Key": "Entrez la clé API Serply",
"Enter Serpstack API Key": "Entrez la clé API Serpstack", "Enter Serpstack API Key": "Entrez la clé API Serpstack",
"Enter stop sequence": "Entrez la séquence d'arrêt", "Enter stop sequence": "Entrez la séquence d'arrêt",
"Enter system prompt": "",
"Enter Tavily API Key": "Entrez la clé API Tavily", "Enter Tavily API Key": "Entrez la clé API Tavily",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Entrez les Top K", "Enter Top K": "Entrez les Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
"Enter Your Email": "Entrez votre adresse e-mail", "Enter Your Email": "Entrez votre adresse e-mail",
"Enter Your Full Name": "Entrez votre nom complet", "Enter Your Full Name": "Entrez votre nom complet",
"Enter your message": "",
"Enter Your Password": "Entrez votre mot de passe", "Enter Your Password": "Entrez votre mot de passe",
"Enter Your Role": "Entrez votre rôle", "Enter Your Role": "Entrez votre rôle",
"Error": "Erreur", "Error": "Erreur",
@@ -266,6 +278,7 @@
"File": "Fichier", "File": "Fichier",
"File Mode": "Mode fichier", "File Mode": "Mode fichier",
"File not found.": "Fichier introuvable.", "File not found.": "Fichier introuvable.",
"Files": "",
"Filter is now globally disabled": "Le filtre est maintenant désactivé globalement", "Filter is now globally disabled": "Le filtre est maintenant désactivé globalement",
"Filter is now globally enabled": "Le filtre est désormais activé globalement", "Filter is now globally enabled": "Le filtre est désormais activé globalement",
"Filters": "Filtres", "Filters": "Filtres",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Pénalité de fréquence", "Frequency Penalty": "Pénalité de fréquence",
"Function created successfully": "La fonction a été créée avec succès", "Function created successfully": "La fonction a été créée avec succès",
"Function deleted successfully": "Fonction supprimée avec succès", "Function deleted successfully": "Fonction supprimée avec succès",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "La fonction a été mise à jour avec succès", "Function updated successfully": "La fonction a été mise à jour avec succès",
"Functions": "Fonctions", "Functions": "Fonctions",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "Fonctions importées avec succès", "Functions imported successfully": "Fonctions importées avec succès",
"General": "Général", "General": "Général",
"General Settings": "Paramètres Généraux", "General Settings": "Paramètres Généraux",
"Generate Image": "Générer une image", "Generate Image": "Générer une image",
"Generating search query": "Génération d'une requête de recherche", "Generating search query": "Génération d'une requête de recherche",
"Generation Info": "Informations sur la génération", "Generation Info": "Informations sur la génération",
"Get up and running with": "",
"Global": "Mondial", "Global": "Mondial",
"Good Response": "Bonne réponse", "Good Response": "Bonne réponse",
"Google PSE API Key": "Clé API Google PSE", "Google PSE API Key": "Clé API Google PSE",
@@ -298,6 +319,7 @@
"Hide Model": "Masquer le modèle", "Hide Model": "Masquer le modèle",
"How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?", "How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?",
"Hybrid Search": "Recherche hybride", "Hybrid Search": "Recherche hybride",
"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.": "",
"Image Generation (Experimental)": "Génération d'images (expérimental)", "Image Generation (Experimental)": "Génération d'images (expérimental)",
"Image Generation Engine": "Moteur de génération d'images", "Image Generation Engine": "Moteur de génération d'images",
"Image Settings": "Paramètres de l'image", "Image Settings": "Paramètres de l'image",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Raccourcis clavier", "Keyboard shortcuts": "Raccourcis clavier",
"Knowledge": "Connaissance", "Knowledge": "Connaissance",
"Language": "Langue", "Language": "Langue",
"large language models, locally.": "",
"Last Active": "Dernière activité", "Last Active": "Dernière activité",
"Last Modified": "Dernière modification", "Last Modified": "Dernière modification",
"Light": "Lumineux", "Light": "Lumineux",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Vannes de Pipelines", "Pipelines Valves": "Vannes de Pipelines",
"Plain text (.txt)": "Texte simple (.txt)", "Plain text (.txt)": "Texte simple (.txt)",
"Playground": "Aire de jeux", "Playground": "Aire de jeux",
"Please carefully review the following warnings:": "",
"Positive attitude": "Attitude positive", "Positive attitude": "Attitude positive",
"Previous 30 days": "30 derniers jours", "Previous 30 days": "30 derniers jours",
"Previous 7 days": "7 derniers jours", "Previous 7 days": "7 derniers jours",
@@ -475,10 +499,12 @@
"Rosé Pine": "Pin rosé", "Rosé Pine": "Pin rosé",
"Rosé Pine Dawn": "Aube de Pin Rosé", "Rosé Pine Dawn": "Aube de Pin Rosé",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "Courir", "Running": "Courir",
"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é !",
@@ -559,6 +585,8 @@
"Success": "Réussite", "Success": "Réussite",
"Successfully updated.": "Mise à jour réussie.", "Successfully updated.": "Mise à jour réussie.",
"Suggested": "Sugéré", "Suggested": "Sugéré",
"Support": "",
"Support this plugin:": "",
"System": "Système", "System": "Système",
"System Prompt": "Prompt du système", "System Prompt": "Prompt du système",
"Tags": "Balises", "Tags": "Balises",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "Moteur de synthèse vocale", "Text-to-Speech Engine": "Moteur de synthèse vocale",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Merci pour vos commentaires !", "Thanks for your feedback!": "Merci pour vos commentaires !",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).",
"Theme": "Thème", "Theme": "Thème",
"Thinking...": "En train de réfléchir...", "Thinking...": "En train de réfléchir...",
@@ -594,6 +623,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",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "Outil supprimé avec succès", "Tool deleted successfully": "Outil supprimé avec succès",
"Tool imported successfully": "Outil importé avec succès", "Tool imported successfully": "Outil importé avec succès",
"Tool updated successfully": "L'outil a été mis à jour avec succès", "Tool updated successfully": "L'outil a été mis à jour avec succès",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "Outils", "Tools": "Outils",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Rencontrez-vous des difficultés pour accéder à Ollama ?", "Trouble accessing Ollama?": "Rencontrez-vous des difficultés pour accéder à Ollama ?",
@@ -646,6 +682,7 @@
"Version": "Version améliorée", "Version": "Version améliorée",
"Voice": "Voix", "Voice": "Voix",
"Warning": "Avertissement !", "Warning": "Avertissement !",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'encodage, vous devrez réimporter tous les documents.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'encodage, vous devrez réimporter tous les documents.",
"Web": "Web", "Web": "Web",
"Web API": "API Web", "Web API": "API Web",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "Vous êtes un assistant serviable.", "You're a helpful assistant.": "Vous êtes un assistant serviable.",
"You're now logged in.": "Vous êtes désormais connecté.", "You're now logged in.": "Vous êtes désormais connecté.",
"Your account status is currently pending activation.": "Votre statut de compte est actuellement en attente d'activation.", "Your account status is currently pending activation.": "Votre statut de compte est actuellement en attente d'activation.",
"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.": "",
"Youtube": "YouTube", "Youtube": "YouTube",
"Youtube Loader Settings": "Paramètres de l'outil de téléchargement YouTube" "Youtube Loader Settings": "Paramètres de l'outil de téléchargement YouTube"
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Supprimé {{name}}", "Deleted {{name}}": "Supprimé {{name}}",
"Description": "Description", "Description": "Description",
"Didn't fully follow instructions": "N'a pas entièrement respecté les instructions", "Didn't fully follow instructions": "N'a pas entièrement respecté les instructions",
"Disabled": "",
"Discover a function": "Découvrez une fonction", "Discover a function": "Découvrez une fonction",
"Discover a model": "Découvrir un modèle", "Discover a model": "Découvrir un modèle",
"Discover a prompt": "Découvrir une suggestion", "Discover a prompt": "Découvrir une suggestion",
@@ -188,6 +192,8 @@
"Dismissible": "Fermeture", "Dismissible": "Fermeture",
"Display Emoji in Call": "Afficher les emojis pendant l'appel", "Display Emoji in Call": "Afficher les emojis pendant l'appel",
"Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat", "Display the username instead of You in the Chat": "Afficher le nom d'utilisateur à la place de \"Vous\" dans le Chat",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Document", "Document": "Document",
"Document Settings": "Paramètres du document", "Document Settings": "Paramètres du document",
"Documentation": "Documentation", "Documentation": "Documentation",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe et garde vos données en sécurité sur votre serveur local.", "does not make any external connections, and your data stays securely on your locally hosted server.": "ne fait aucune connexion externe et garde vos données en sécurité sur votre serveur local.",
"Don't Allow": "Ne pas autoriser", "Don't Allow": "Ne pas autoriser",
"Don't have an account?": "Vous n'avez pas de compte ?", "Don't have an account?": "Vous n'avez pas de compte ?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "N'apprécie pas le style", "Don't like the style": "N'apprécie pas le style",
"Done": "Terminé", "Done": "Terminé",
"Download": "Télécharger", "Download": "Télécharger",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Activer le partage communautaire", "Enable Community Sharing": "Activer le partage communautaire",
"Enable New Sign Ups": "Activer les nouvelles inscriptions", "Enable New Sign Ups": "Activer les nouvelles inscriptions",
"Enable Web Search": "Activer la recherche web", "Enable Web Search": "Activer la recherche web",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Vérifiez que votre fichier CSV comprenne les 4 colonnes dans cet ordre : Name, Email, Password, Role.",
"Enter {{role}} message here": "Entrez le message {{role}} ici", "Enter {{role}} message here": "Entrez le message {{role}} ici",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Entrez la clé API Serply", "Enter Serply API Key": "Entrez la clé API Serply",
"Enter Serpstack API Key": "Entrez la clé API Serpstack", "Enter Serpstack API Key": "Entrez la clé API Serpstack",
"Enter stop sequence": "Entrez la séquence d'arrêt", "Enter stop sequence": "Entrez la séquence d'arrêt",
"Enter system prompt": "",
"Enter Tavily API Key": "Entrez la clé API Tavily", "Enter Tavily API Key": "Entrez la clé API Tavily",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Entrez les Top K", "Enter Top K": "Entrez les Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Entrez l'URL (par ex. http://localhost:11434)",
"Enter Your Email": "Entrez votre adresse e-mail", "Enter Your Email": "Entrez votre adresse e-mail",
"Enter Your Full Name": "Entrez votre nom complet", "Enter Your Full Name": "Entrez votre nom complet",
"Enter your message": "",
"Enter Your Password": "Entrez votre mot de passe", "Enter Your Password": "Entrez votre mot de passe",
"Enter Your Role": "Entrez votre rôle", "Enter Your Role": "Entrez votre rôle",
"Error": "Erreur", "Error": "Erreur",
@@ -266,6 +278,7 @@
"File": "Fichier", "File": "Fichier",
"File Mode": "Mode fichier", "File Mode": "Mode fichier",
"File not found.": "Fichier introuvable.", "File not found.": "Fichier introuvable.",
"Files": "",
"Filter is now globally disabled": "Le filtre est maintenant désactivé globalement", "Filter is now globally disabled": "Le filtre est maintenant désactivé globalement",
"Filter is now globally enabled": "Le filtre est désormais activé globalement", "Filter is now globally enabled": "Le filtre est désormais activé globalement",
"Filters": "Filtres", "Filters": "Filtres",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Pénalité de fréquence", "Frequency Penalty": "Pénalité de fréquence",
"Function created successfully": "La fonction a été créée avec succès", "Function created successfully": "La fonction a été créée avec succès",
"Function deleted successfully": "Fonction supprimée avec succès", "Function deleted successfully": "Fonction supprimée avec succès",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "La fonction a été mise à jour avec succès", "Function updated successfully": "La fonction a été mise à jour avec succès",
"Functions": "Fonctions", "Functions": "Fonctions",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "Fonctions importées avec succès", "Functions imported successfully": "Fonctions importées avec succès",
"General": "Général", "General": "Général",
"General Settings": "Paramètres Généraux", "General Settings": "Paramètres Généraux",
"Generate Image": "Générer une image", "Generate Image": "Générer une image",
"Generating search query": "Génération d'une requête de recherche", "Generating search query": "Génération d'une requête de recherche",
"Generation Info": "Informations sur la génération", "Generation Info": "Informations sur la génération",
"Get up and running with": "",
"Global": "Mondial", "Global": "Mondial",
"Good Response": "Bonne réponse", "Good Response": "Bonne réponse",
"Google PSE API Key": "Clé API Google PSE", "Google PSE API Key": "Clé API Google PSE",
@@ -298,6 +319,7 @@
"Hide Model": "Masquer le modèle", "Hide Model": "Masquer le modèle",
"How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?", "How can I help you today?": "Comment puis-je vous être utile aujourd'hui ?",
"Hybrid Search": "Recherche hybride", "Hybrid Search": "Recherche hybride",
"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.": "",
"Image Generation (Experimental)": "Génération d'images (expérimental)", "Image Generation (Experimental)": "Génération d'images (expérimental)",
"Image Generation Engine": "Moteur de génération d'images", "Image Generation Engine": "Moteur de génération d'images",
"Image Settings": "Paramètres de l'image", "Image Settings": "Paramètres de l'image",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Raccourcis clavier", "Keyboard shortcuts": "Raccourcis clavier",
"Knowledge": "Connaissance", "Knowledge": "Connaissance",
"Language": "Langue", "Language": "Langue",
"large language models, locally.": "",
"Last Active": "Dernière activité", "Last Active": "Dernière activité",
"Last Modified": "Dernière modification", "Last Modified": "Dernière modification",
"Light": "Lumineux", "Light": "Lumineux",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Vannes de Pipelines", "Pipelines Valves": "Vannes de Pipelines",
"Plain text (.txt)": "Texte simple (.txt)", "Plain text (.txt)": "Texte simple (.txt)",
"Playground": "Aire de jeux", "Playground": "Aire de jeux",
"Please carefully review the following warnings:": "",
"Positive attitude": "Attitude positive", "Positive attitude": "Attitude positive",
"Previous 30 days": "30 derniers jours", "Previous 30 days": "30 derniers jours",
"Previous 7 days": "7 derniers jours", "Previous 7 days": "7 derniers jours",
@@ -475,10 +499,12 @@
"Rosé Pine": "Pin rosé", "Rosé Pine": "Pin rosé",
"Rosé Pine Dawn": "Aube de Pin Rosé", "Rosé Pine Dawn": "Aube de Pin Rosé",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "Courir", "Running": "Courir",
"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é !",
@@ -559,6 +585,8 @@
"Success": "Réussite", "Success": "Réussite",
"Successfully updated.": "Mise à jour réussie.", "Successfully updated.": "Mise à jour réussie.",
"Suggested": "Sugéré", "Suggested": "Sugéré",
"Support": "",
"Support this plugin:": "",
"System": "Système", "System": "Système",
"System Prompt": "Prompt du système", "System Prompt": "Prompt du système",
"Tags": "Balises", "Tags": "Balises",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "Moteur de synthèse vocale", "Text-to-Speech Engine": "Moteur de synthèse vocale",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Merci pour vos commentaires !", "Thanks for your feedback!": "Merci pour vos commentaires !",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Le score doit être une valeur comprise entre 0,0 (0\u00a0%) et 1,0 (100\u00a0%).",
"Theme": "Thème", "Theme": "Thème",
"Thinking...": "En train de réfléchir...", "Thinking...": "En train de réfléchir...",
@@ -594,6 +623,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",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "Outil supprimé avec succès", "Tool deleted successfully": "Outil supprimé avec succès",
"Tool imported successfully": "Outil importé avec succès", "Tool imported successfully": "Outil importé avec succès",
"Tool updated successfully": "L'outil a été mis à jour avec succès", "Tool updated successfully": "L'outil a été mis à jour avec succès",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "Outils", "Tools": "Outils",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Rencontrez-vous des difficultés pour accéder à Ollama ?", "Trouble accessing Ollama?": "Rencontrez-vous des difficultés pour accéder à Ollama ?",
@@ -646,6 +682,7 @@
"Version": "Version améliorée", "Version": "Version améliorée",
"Voice": "Voix", "Voice": "Voix",
"Warning": "Avertissement !", "Warning": "Avertissement !",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'encodage, vous devrez réimporter tous les documents.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avertissement : Si vous mettez à jour ou modifiez votre modèle d'encodage, vous devrez réimporter tous les documents.",
"Web": "Web", "Web": "Web",
"Web API": "API Web", "Web API": "API Web",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "Vous êtes un assistant serviable.", "You're a helpful assistant.": "Vous êtes un assistant serviable.",
"You're now logged in.": "Vous êtes désormais connecté.", "You're now logged in.": "Vous êtes désormais connecté.",
"Your account status is currently pending activation.": "Votre statut de compte est actuellement en attente d'activation.", "Your account status is currently pending activation.": "Votre statut de compte est actuellement en attente d'activation.",
"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.": "",
"Youtube": "YouTube", "Youtube": "YouTube",
"Youtube Loader Settings": "Paramètres de l'outil de téléchargement YouTube" "Youtube Loader Settings": "Paramètres de l'outil de téléchargement YouTube"
} }
+39 -1
View File
@@ -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": "מחק את הקישור הזה",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "נמחק {{name}}", "Deleted {{name}}": "נמחק {{name}}",
"Description": "תיאור", "Description": "תיאור",
"Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא", "Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "גלה מודל", "Discover a model": "גלה מודל",
"Discover a prompt": "גלה פקודה", "Discover a prompt": "גלה פקודה",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "הצג את שם המשתמש במקום 'אתה' בצ'אט", "Display the username instead of You in the Chat": "הצג את שם המשתמש במקום 'אתה' בצ'אט",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "מסמך", "Document": "מסמך",
"Document Settings": "הגדרות מסמך", "Document Settings": "הגדרות מסמך",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "לא מבצע חיבורים חיצוניים, והנתונים שלך נשמרים באופן מאובטח בשרת המקומי שלך.", "does not make any external connections, and your data stays securely on your locally hosted server.": "לא מבצע חיבורים חיצוניים, והנתונים שלך נשמרים באופן מאובטח בשרת המקומי שלך.",
"Don't Allow": "אל תאפשר", "Don't Allow": "אל תאפשר",
"Don't have an account?": "אין לך חשבון?", "Don't have an account?": "אין לך חשבון?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "לא אוהב את הסגנון", "Don't like the style": "לא אוהב את הסגנון",
"Done": "", "Done": "",
"Download": "הורד", "Download": "הורד",
@@ -206,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": "מודל הטמעה",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "הפיכת שיתוף קהילה לזמין", "Enable Community Sharing": "הפיכת שיתוף קהילה לזמין",
"Enable New Sign Ups": "אפשר הרשמות חדשות", "Enable New Sign Ups": "אפשר הרשמות חדשות",
"Enable Web Search": "הפיכת חיפוש באינטרנט לזמין", "Enable Web Search": "הפיכת חיפוש באינטרנט לזמין",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.",
"Enter {{role}} message here": "הזן הודעת {{role}} כאן", "Enter {{role}} message here": "הזן הודעת {{role}} כאן",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "הזן מפתח API של Serpstack", "Enter Serpstack API Key": "הזן מפתח API של Serpstack",
"Enter stop sequence": "הזן רצף עצירה", "Enter stop sequence": "הזן רצף עצירה",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "הזן Top K", "Enter Top K": "הזן Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "הזן כתובת URL (למשל http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "הזן כתובת URL (למשל http://localhost:11434)",
"Enter Your Email": "הזן את דוא\"ל שלך", "Enter Your Email": "הזן את דוא\"ל שלך",
"Enter Your Full Name": "הזן את שמך המלא", "Enter Your Full Name": "הזן את שמך המלא",
"Enter your message": "",
"Enter Your Password": "הזן את הסיסמה שלך", "Enter Your Password": "הזן את הסיסמה שלך",
"Enter Your Role": "הזן את התפקיד שלך", "Enter Your Role": "הזן את התפקיד שלך",
"Error": "שגיאה", "Error": "שגיאה",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "מצב קובץ", "File Mode": "מצב קובץ",
"File not found.": "הקובץ לא נמצא.", "File not found.": "הקובץ לא נמצא.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "עונש תדירות", "Frequency Penalty": "עונש תדירות",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "כללי", "General": "כללי",
"General Settings": "הגדרות כלליות", "General Settings": "הגדרות כלליות",
"Generate Image": "", "Generate Image": "",
"Generating search query": "יצירת שאילתת חיפוש", "Generating search query": "יצירת שאילתת חיפוש",
"Generation Info": "מידע על היצירה", "Generation Info": "מידע על היצירה",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "תגובה טובה", "Good Response": "תגובה טובה",
"Google PSE API Key": "מפתח API של Google PSE", "Google PSE API Key": "מפתח API של Google PSE",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "כיצד אוכל לעזור לך היום?", "How can I help you today?": "כיצד אוכל לעזור לך היום?",
"Hybrid Search": "חיפוש היברידי", "Hybrid Search": "חיפוש היברידי",
"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.": "",
"Image Generation (Experimental)": "יצירת תמונות (ניסיוני)", "Image Generation (Experimental)": "יצירת תמונות (ניסיוני)",
"Image Generation Engine": "מנוע יצירת תמונות", "Image Generation Engine": "מנוע יצירת תמונות",
"Image Settings": "הגדרות תמונה", "Image Settings": "הגדרות תמונה",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "קיצורי מקלדת", "Keyboard shortcuts": "קיצורי מקלדת",
"Knowledge": "", "Knowledge": "",
"Language": "שפה", "Language": "שפה",
"large language models, locally.": "",
"Last Active": "פעיל לאחרונה", "Last Active": "פעיל לאחרונה",
"Last Modified": "", "Last Modified": "",
"Light": "בהיר", "Light": "בהיר",
@@ -341,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 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "צינורות שסתומים", "Pipelines Valves": "צינורות שסתומים",
"Plain text (.txt)": "טקסט פשוט (.txt)", "Plain text (.txt)": "טקסט פשוט (.txt)",
"Playground": "אזור משחקים", "Playground": "אזור משחקים",
"Please carefully review the following warnings:": "",
"Positive attitude": "גישה חיובית", "Positive attitude": "גישה חיובית",
"Previous 30 days": "30 הימים הקודמים", "Previous 30 days": "30 הימים הקודמים",
"Previous 7 days": "7 הימים הקודמים", "Previous 7 days": "7 הימים הקודמים",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!": "הסריקה הושלמה!",
@@ -559,6 +585,8 @@
"Success": "הצלחה", "Success": "הצלחה",
"Successfully updated.": "עדכון הצלחה.", "Successfully updated.": "עדכון הצלחה.",
"Suggested": "מומלץ", "Suggested": "מומלץ",
"Support": "",
"Support this plugin:": "",
"System": "מערכת", "System": "מערכת",
"System Prompt": "תגובת מערכת", "System Prompt": "תגובת מערכת",
"Tags": "תגיות", "Tags": "תגיות",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "מנוע טקסט לדיבור", "Text-to-Speech Engine": "מנוע טקסט לדיבור",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "תודה על המשוב שלך!", "Thanks for your feedback!": "תודה על המשוב שלך!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ציון צריך להיות ערך בין 0.0 (0%) ל-1.0 (100%)", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "ציון צריך להיות ערך בין 0.0 (0%) ל-1.0 (100%)",
"Theme": "נושא", "Theme": "נושא",
"Thinking...": "", "Thinking...": "",
@@ -594,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": "היום",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "קשה לגשת לOllama?", "Trouble accessing Ollama?": "קשה לגשת לOllama?",
@@ -646,6 +682,7 @@
"Version": "גרסה", "Version": "גרסה",
"Voice": "", "Voice": "",
"Warning": "אזהרה", "Warning": "אזהרה",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "אזהרה: אם תעדכן או תשנה את מודל ההטבעה שלך, יהיה עליך לייבא מחדש את כל המסמכים.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "אזהרה: אם תעדכן או תשנה את מודל ההטבעה שלך, יהיה עליך לייבא מחדש את כל המסמכים.",
"Web": "רשת", "Web": "רשת",
"Web API": "", "Web API": "",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "אתה עוזר מועיל.", "You're a helpful assistant.": "אתה עוזר מועיל.",
"You're now logged in.": "כעת אתה מחובר.", "You're now logged in.": "כעת אתה מחובר.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "הגדרות Youtube Loader" "Youtube Loader Settings": "הגדרות Youtube Loader"
} }
+39 -1
View File
@@ -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": "इस लिंक को हटाएं",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "{{name}} हटा दिया गया", "Deleted {{name}}": "{{name}} हटा दिया गया",
"Description": "विवरण", "Description": "विवरण",
"Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया", "Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "एक मॉडल की खोज करें", "Discover a model": "एक मॉडल की खोज करें",
"Discover a prompt": "प्रॉम्प्ट खोजें", "Discover a prompt": "प्रॉम्प्ट खोजें",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "चैट में 'आप' के स्थान पर उपयोगकर्ता नाम प्रदर्शित करें", "Display the username instead of You in the Chat": "चैट में 'आप' के स्थान पर उपयोगकर्ता नाम प्रदर्शित करें",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "दस्तावेज़", "Document": "दस्तावेज़",
"Document Settings": "दस्तावेज़ सेटिंग्स", "Document Settings": "दस्तावेज़ सेटिंग्स",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "कोई बाहरी कनेक्शन नहीं बनाता है, और आपका डेटा आपके स्थानीय रूप से होस्ट किए गए सर्वर पर सुरक्षित रूप से रहता है।", "does not make any external connections, and your data stays securely on your locally hosted server.": "कोई बाहरी कनेक्शन नहीं बनाता है, और आपका डेटा आपके स्थानीय रूप से होस्ट किए गए सर्वर पर सुरक्षित रूप से रहता है।",
"Don't Allow": "अनुमति न दें", "Don't Allow": "अनुमति न दें",
"Don't have an account?": "कोई खाता नहीं है?", "Don't have an account?": "कोई खाता नहीं है?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "शैली पसंद नहीं है", "Don't like the style": "शैली पसंद नहीं है",
"Done": "", "Done": "",
"Download": "डाउनलोड", "Download": "डाउनलोड",
@@ -206,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": "मॉडेल अनुकूलन",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "समुदाय साझाकरण सक्षम करें", "Enable Community Sharing": "समुदाय साझाकरण सक्षम करें",
"Enable New Sign Ups": "नए साइन अप सक्रिय करें", "Enable New Sign Ups": "नए साइन अप सक्रिय करें",
"Enable Web Search": "वेब खोज सक्षम करें", "Enable Web Search": "वेब खोज सक्षम करें",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।",
"Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें", "Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें", "Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें",
"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें", "Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "शीर्ष K दर्ज करें", "Enter Top K": "शीर्ष K दर्ज करें",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "यूआरएल दर्ज करें (उदा. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "यूआरएल दर्ज करें (उदा. http://localhost:11434)",
"Enter Your Email": "अपना ईमेल दर्ज करें", "Enter Your Email": "अपना ईमेल दर्ज करें",
"Enter Your Full Name": "अपना पूरा नाम भरें", "Enter Your Full Name": "अपना पूरा नाम भरें",
"Enter your message": "",
"Enter Your Password": "अपना पासवर्ड भरें", "Enter Your Password": "अपना पासवर्ड भरें",
"Enter Your Role": "अपनी भूमिका दर्ज करें", "Enter Your Role": "अपनी भूमिका दर्ज करें",
"Error": "चूक", "Error": "चूक",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "फ़ाइल मोड", "File Mode": "फ़ाइल मोड",
"File not found.": "फ़ाइल प्राप्त नहीं हुई।", "File not found.": "फ़ाइल प्राप्त नहीं हुई।",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "फ्रीक्वेंसी पेनल्टी", "Frequency Penalty": "फ्रीक्वेंसी पेनल्टी",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "सामान्य", "General": "सामान्य",
"General Settings": "सामान्य सेटिंग्स", "General Settings": "सामान्य सेटिंग्स",
"Generate Image": "", "Generate Image": "",
"Generating search query": "खोज क्वेरी जनरेट करना", "Generating search query": "खोज क्वेरी जनरेट करना",
"Generation Info": "जनरेशन की जानकारी", "Generation Info": "जनरेशन की जानकारी",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "अच्छी प्रतिक्रिया", "Good Response": "अच्छी प्रतिक्रिया",
"Google PSE API Key": "Google PSE API कुंजी", "Google PSE API Key": "Google PSE API कुंजी",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "आज मैं आपकी कैसे मदद कर सकता हूँ?", "How can I help you today?": "आज मैं आपकी कैसे मदद कर सकता हूँ?",
"Hybrid Search": "हाइब्रिड खोज", "Hybrid Search": "हाइब्रिड खोज",
"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.": "",
"Image Generation (Experimental)": "छवि निर्माण (प्रायोगिक)", "Image Generation (Experimental)": "छवि निर्माण (प्रायोगिक)",
"Image Generation Engine": "छवि निर्माण इंजन", "Image Generation Engine": "छवि निर्माण इंजन",
"Image Settings": "छवि सेटिंग्स", "Image Settings": "छवि सेटिंग्स",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "कीबोर्ड शॉर्टकट", "Keyboard shortcuts": "कीबोर्ड शॉर्टकट",
"Knowledge": "", "Knowledge": "",
"Language": "भाषा", "Language": "भाषा",
"large language models, locally.": "",
"Last Active": "पिछली बार सक्रिय", "Last Active": "पिछली बार सक्रिय",
"Last Modified": "", "Last Modified": "",
"Light": "सुन", "Light": "सुन",
@@ -341,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 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
@@ -353,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": "मिरोस्टा ईटा",
@@ -438,6 +461,7 @@
"Pipelines Valves": "पाइपलाइन वाल्व", "Pipelines Valves": "पाइपलाइन वाल्व",
"Plain text (.txt)": "सादा पाठ (.txt)", "Plain text (.txt)": "सादा पाठ (.txt)",
"Playground": "कार्यक्षेत्र", "Playground": "कार्यक्षेत्र",
"Please carefully review the following warnings:": "",
"Positive attitude": "सकारात्मक रवैया", "Positive attitude": "सकारात्मक रवैया",
"Previous 30 days": "पिछले 30 दिन", "Previous 30 days": "पिछले 30 दिन",
"Previous 7 days": "पिछले 7 दिन", "Previous 7 days": "पिछले 7 दिन",
@@ -475,10 +499,12 @@
"Rosé Pine": "रोसे पिन", "Rosé Pine": "रोसे पिन",
"Rosé Pine Dawn": "रोसे पिन डेन", "Rosé Pine Dawn": "रोसे पिन डेन",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!": "स्कैन पूरा हुआ!",
@@ -558,6 +584,8 @@
"Success": "संपन्न", "Success": "संपन्न",
"Successfully updated.": "सफलतापूर्वक उत्परिवर्तित।", "Successfully updated.": "सफलतापूर्वक उत्परिवर्तित।",
"Suggested": "सुझावी", "Suggested": "सुझावी",
"Support": "",
"Support this plugin:": "",
"System": "सिस्टम", "System": "सिस्टम",
"System Prompt": "सिस्टम प्रॉम्प्ट", "System Prompt": "सिस्टम प्रॉम्प्ट",
"Tags": "टैग", "Tags": "टैग",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "टेक्स्ट-टू-स्पीच इंजन", "Text-to-Speech Engine": "टेक्स्ट-टू-स्पीच इंजन",
"Tfs Z": "टफ्स Z", "Tfs Z": "टफ्स Z",
"Thanks for your feedback!": "आपकी प्रतिक्रिया के लिए धन्यवाद!", "Thanks for your feedback!": "आपकी प्रतिक्रिया के लिए धन्यवाद!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "स्कोर का मान 0.0 (0%) और 1.0 (100%) के बीच होना चाहिए।", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "स्कोर का मान 0.0 (0%) और 1.0 (100%) के बीच होना चाहिए।",
"Theme": "थीम", "Theme": "थीम",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "आज",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "शीर्ष K", "Top K": "शीर्ष K",
"Top P": "शीर्ष P", "Top P": "शीर्ष P",
"Trouble accessing Ollama?": "Ollama तक पहुँचने में परेशानी हो रही है?", "Trouble accessing Ollama?": "Ollama तक पहुँचने में परेशानी हो रही है?",
@@ -645,6 +681,7 @@
"Version": "संस्करण", "Version": "संस्करण",
"Voice": "", "Voice": "",
"Warning": "चेतावनी", "Warning": "चेतावनी",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "चेतावनी: यदि आप अपने एम्बेडिंग मॉडल को अपडेट या बदलते हैं, तो आपको सभी दस्तावेज़ों को फिर से आयात करने की आवश्यकता होगी।", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "चेतावनी: यदि आप अपने एम्बेडिंग मॉडल को अपडेट या बदलते हैं, तो आपको सभी दस्तावेज़ों को फिर से आयात करने की आवश्यकता होगी।",
"Web": "वेब", "Web": "वेब",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "आप एक सहायक सहायक हैं", "You're a helpful assistant.": "आप एक सहायक सहायक हैं",
"You're now logged in.": "अब आप लॉग इन हो गए हैं", "You're now logged in.": "अब आप लॉग इन हो गए हैं",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "यूट्यूब लोडर सेटिंग्स" "Youtube Loader Settings": "यूट्यूब लोडर सेटिंग्स"
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Izbrisano {{name}}", "Deleted {{name}}": "Izbrisano {{name}}",
"Description": "Opis", "Description": "Opis",
"Didn't fully follow instructions": "Nije u potpunosti slijedio upute", "Didn't fully follow instructions": "Nije u potpunosti slijedio upute",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "Otkrijte model", "Discover a model": "Otkrijte model",
"Discover a prompt": "Otkrijte prompt", "Discover a prompt": "Otkrijte prompt",
@@ -188,6 +192,8 @@
"Dismissible": "Odbaciti", "Dismissible": "Odbaciti",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru", "Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Dokument", "Document": "Dokument",
"Document Settings": "Postavke dokumenta", "Document Settings": "Postavke dokumenta",
"Documentation": "Dokumentacija", "Documentation": "Dokumentacija",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne uspostavlja vanjske veze, a vaši podaci ostaju sigurno na vašem lokalno hostiranom poslužitelju.", "does not make any external connections, and your data stays securely on your locally hosted server.": "ne uspostavlja vanjske veze, a vaši podaci ostaju sigurno na vašem lokalno hostiranom poslužitelju.",
"Don't Allow": "Ne dopuštaj", "Don't Allow": "Ne dopuštaj",
"Don't have an account?": "Nemate račun?", "Don't have an account?": "Nemate račun?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "Ne sviđa mi se stil", "Don't like the style": "Ne sviđa mi se stil",
"Done": "", "Done": "",
"Download": "Preuzimanje", "Download": "Preuzimanje",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Omogući zajedničko korištenje zajednice", "Enable Community Sharing": "Omogući zajedničko korištenje zajednice",
"Enable New Sign Ups": "Omogući nove prijave", "Enable New Sign Ups": "Omogući nove prijave",
"Enable Web Search": "Omogući pretraživanje weba", "Enable Web Search": "Omogući pretraživanje weba",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.",
"Enter {{role}} message here": "Unesite {{role}} poruku ovdje", "Enter {{role}} message here": "Unesite {{role}} poruku ovdje",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Unesite Serply API ključ", "Enter Serply API Key": "Unesite Serply API ključ",
"Enter Serpstack API Key": "Unesite Serpstack API ključ", "Enter Serpstack API Key": "Unesite Serpstack API ključ",
"Enter stop sequence": "Unesite sekvencu zaustavljanja", "Enter stop sequence": "Unesite sekvencu zaustavljanja",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Unesite Top K", "Enter Top K": "Unesite Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Unesite URL (npr. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Unesite URL (npr. http://localhost:11434)",
"Enter Your Email": "Unesite svoj email", "Enter Your Email": "Unesite svoj email",
"Enter Your Full Name": "Unesite svoje puno ime", "Enter Your Full Name": "Unesite svoje puno ime",
"Enter your message": "",
"Enter Your Password": "Unesite svoju lozinku", "Enter Your Password": "Unesite svoju lozinku",
"Enter Your Role": "Unesite svoju ulogu", "Enter Your Role": "Unesite svoju ulogu",
"Error": "Greška", "Error": "Greška",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "Način datoteke", "File Mode": "Način datoteke",
"File not found.": "Datoteka nije pronađena.", "File not found.": "Datoteka nije pronađena.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Kazna za učestalost", "Frequency Penalty": "Kazna za učestalost",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Općenito", "General": "Općenito",
"General Settings": "Opće postavke", "General Settings": "Opće postavke",
"Generate Image": "Gneriraj sliku", "Generate Image": "Gneriraj sliku",
"Generating search query": "Generiranje upita za pretraživanje", "Generating search query": "Generiranje upita za pretraživanje",
"Generation Info": "Informacije o generaciji", "Generation Info": "Informacije o generaciji",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "Dobar odgovor", "Good Response": "Dobar odgovor",
"Google PSE API Key": "Google PSE API ključ", "Google PSE API Key": "Google PSE API ključ",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "Kako vam mogu pomoći danas?", "How can I help you today?": "Kako vam mogu pomoći danas?",
"Hybrid Search": "Hibridna pretraga", "Hybrid Search": "Hibridna pretraga",
"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.": "",
"Image Generation (Experimental)": "Generiranje slika (eksperimentalno)", "Image Generation (Experimental)": "Generiranje slika (eksperimentalno)",
"Image Generation Engine": "Stroj za generiranje slika", "Image Generation Engine": "Stroj za generiranje slika",
"Image Settings": "Postavke slike", "Image Settings": "Postavke slike",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Tipkovnički prečaci", "Keyboard shortcuts": "Tipkovnički prečaci",
"Knowledge": "Znanje", "Knowledge": "Znanje",
"Language": "Jezik", "Language": "Jezik",
"large language models, locally.": "",
"Last Active": "Zadnja aktivnost", "Last Active": "Zadnja aktivnost",
"Last Modified": "", "Last Modified": "",
"Light": "Svijetlo", "Light": "Svijetlo",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Ventili za cjevovode", "Pipelines Valves": "Ventili za cjevovode",
"Plain text (.txt)": "Običan tekst (.txt)", "Plain text (.txt)": "Običan tekst (.txt)",
"Playground": "Igralište", "Playground": "Igralište",
"Please carefully review the following warnings:": "",
"Positive attitude": "Pozitivan stav", "Positive attitude": "Pozitivan stav",
"Previous 30 days": "Prethodnih 30 dana", "Previous 30 days": "Prethodnih 30 dana",
"Previous 7 days": "Prethodnih 7 dana", "Previous 7 days": "Prethodnih 7 dana",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "Pokrenuto", "Running": "Pokrenuto",
"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!",
@@ -559,6 +585,8 @@
"Success": "Uspjeh", "Success": "Uspjeh",
"Successfully updated.": "Uspješno ažurirano.", "Successfully updated.": "Uspješno ažurirano.",
"Suggested": "Predloženo", "Suggested": "Predloženo",
"Support": "",
"Support this plugin:": "",
"System": "Sustav", "System": "Sustav",
"System Prompt": "Sistemski prompt", "System Prompt": "Sistemski prompt",
"Tags": "Oznake", "Tags": "Oznake",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "Stroj za pretvorbu teksta u govor", "Text-to-Speech Engine": "Stroj za pretvorbu teksta u govor",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Hvala na povratnim informacijama!", "Thanks for your feedback!": "Hvala na povratnim informacijama!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Ocjena treba biti vrijednost između 0,0 (0%) i 1,0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Ocjena treba biti vrijednost između 0,0 (0%) i 1,0 (100%).",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "Razmišljam", "Thinking...": "Razmišljam",
@@ -594,6 +623,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",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "Alati", "Tools": "Alati",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problemi s pristupom Ollama?", "Trouble accessing Ollama?": "Problemi s pristupom Ollama?",
@@ -646,6 +682,7 @@
"Version": "Verzija", "Version": "Verzija",
"Voice": "", "Voice": "",
"Warning": "Upozorenje", "Warning": "Upozorenje",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Upozorenje: Ako ažurirate ili promijenite svoj model za umetanje, morat ćete ponovno uvesti sve dokumente.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Upozorenje: Ako ažurirate ili promijenite svoj model za umetanje, morat ćete ponovno uvesti sve dokumente.",
"Web": "Web", "Web": "Web",
"Web API": "Web API", "Web API": "Web API",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "Vi ste korisni asistent.", "You're a helpful assistant.": "Vi ste korisni asistent.",
"You're now logged in.": "Sada ste prijavljeni.", "You're now logged in.": "Sada ste prijavljeni.",
"Your account status is currently pending activation.": "Status vašeg računa trenutno čeka aktivaciju.", "Your account status is currently pending activation.": "Status vašeg računa trenutno čeka aktivaciju.",
"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.": "",
"Youtube": "YouTube", "Youtube": "YouTube",
"Youtube Loader Settings": "YouTube postavke učitavanja" "Youtube Loader Settings": "YouTube postavke učitavanja"
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Menghapus {{name}}", "Deleted {{name}}": "Menghapus {{name}}",
"Description": "Deskripsi", "Description": "Deskripsi",
"Didn't fully follow instructions": "Tidak sepenuhnya mengikuti instruksi", "Didn't fully follow instructions": "Tidak sepenuhnya mengikuti instruksi",
"Disabled": "",
"Discover a function": "Menemukan sebuah fungsi", "Discover a function": "Menemukan sebuah fungsi",
"Discover a model": "Menemukan sebuah model", "Discover a model": "Menemukan sebuah model",
"Discover a prompt": "Temukan petunjuk", "Discover a prompt": "Temukan petunjuk",
@@ -188,6 +192,8 @@
"Dismissible": "Tidak dapat digunakan", "Dismissible": "Tidak dapat digunakan",
"Display Emoji in Call": "Menampilkan Emoji dalam Panggilan", "Display Emoji in Call": "Menampilkan Emoji dalam Panggilan",
"Display the username instead of You in the Chat": "Menampilkan nama pengguna, bukan Anda di Obrolan", "Display the username instead of You in the Chat": "Menampilkan nama pengguna, bukan Anda di Obrolan",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Dokumen", "Document": "Dokumen",
"Document Settings": "Pengaturan Dokumen", "Document Settings": "Pengaturan Dokumen",
"Documentation": "Dokumentasi", "Documentation": "Dokumentasi",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "tidak membuat koneksi eksternal apa pun, dan data Anda tetap aman di server yang dihosting secara lokal.", "does not make any external connections, and your data stays securely on your locally hosted server.": "tidak membuat koneksi eksternal apa pun, dan data Anda tetap aman di server yang dihosting secara lokal.",
"Don't Allow": "Jangan Izinkan", "Don't Allow": "Jangan Izinkan",
"Don't have an account?": "Tidak memiliki akun?", "Don't have an account?": "Tidak memiliki akun?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "Tidak suka gayanya", "Don't like the style": "Tidak suka gayanya",
"Done": "Selesai", "Done": "Selesai",
"Download": "Unduh", "Download": "Unduh",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Aktifkan Berbagi Komunitas", "Enable Community Sharing": "Aktifkan Berbagi Komunitas",
"Enable New Sign Ups": "Aktifkan Pendaftaran Baru", "Enable New Sign Ups": "Aktifkan Pendaftaran Baru",
"Enable Web Search": "Aktifkan Pencarian Web", "Enable Web Search": "Aktifkan Pencarian Web",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Pastikan file CSV Anda menyertakan 4 kolom dengan urutan sebagai berikut: Nama, Email, Kata Sandi, Peran.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Pastikan file CSV Anda menyertakan 4 kolom dengan urutan sebagai berikut: Nama, Email, Kata Sandi, Peran.",
"Enter {{role}} message here": "Masukkan pesan {{role}} di sini", "Enter {{role}} message here": "Masukkan pesan {{role}} di sini",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Masukkan Kunci API Serply", "Enter Serply API Key": "Masukkan Kunci API Serply",
"Enter Serpstack API Key": "Masukkan Kunci API Serpstack", "Enter Serpstack API Key": "Masukkan Kunci API Serpstack",
"Enter stop sequence": "Masukkan urutan berhenti", "Enter stop sequence": "Masukkan urutan berhenti",
"Enter system prompt": "",
"Enter Tavily API Key": "Masukkan Kunci API Tavily", "Enter Tavily API Key": "Masukkan Kunci API Tavily",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Masukkan Top K", "Enter Top K": "Masukkan Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Masukkan URL (mis. http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Masukkan URL (mis. http://localhost:11434)",
"Enter Your Email": "Masukkan Email Anda", "Enter Your Email": "Masukkan Email Anda",
"Enter Your Full Name": "Masukkan Nama Lengkap Anda", "Enter Your Full Name": "Masukkan Nama Lengkap Anda",
"Enter your message": "",
"Enter Your Password": "Masukkan Kata Sandi Anda", "Enter Your Password": "Masukkan Kata Sandi Anda",
"Enter Your Role": "Masukkan Peran Anda", "Enter Your Role": "Masukkan Peran Anda",
"Error": "Kesalahan", "Error": "Kesalahan",
@@ -266,6 +278,7 @@
"File": "Berkas", "File": "Berkas",
"File Mode": "Mode File", "File Mode": "Mode File",
"File not found.": "File tidak ditemukan.", "File not found.": "File tidak ditemukan.",
"Files": "",
"Filter is now globally disabled": "Filter sekarang dinonaktifkan secara global", "Filter is now globally disabled": "Filter sekarang dinonaktifkan secara global",
"Filter is now globally enabled": "Filter sekarang diaktifkan secara global", "Filter is now globally enabled": "Filter sekarang diaktifkan secara global",
"Filters": "Filter", "Filters": "Filter",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Penalti Frekuensi", "Frequency Penalty": "Penalti Frekuensi",
"Function created successfully": "Fungsi berhasil dibuat", "Function created successfully": "Fungsi berhasil dibuat",
"Function deleted successfully": "Fungsi berhasil dihapus", "Function deleted successfully": "Fungsi berhasil dihapus",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "Fungsi berhasil diperbarui", "Function updated successfully": "Fungsi berhasil diperbarui",
"Functions": "Fungsi", "Functions": "Fungsi",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "Fungsi berhasil diimpor", "Functions imported successfully": "Fungsi berhasil diimpor",
"General": "Umum", "General": "Umum",
"General Settings": "Pengaturan Umum", "General Settings": "Pengaturan Umum",
"Generate Image": "Menghasilkan Gambar", "Generate Image": "Menghasilkan Gambar",
"Generating search query": "Membuat kueri penelusuran", "Generating search query": "Membuat kueri penelusuran",
"Generation Info": "Info Pembuatan", "Generation Info": "Info Pembuatan",
"Get up and running with": "",
"Global": "Global", "Global": "Global",
"Good Response": "Respons yang Baik", "Good Response": "Respons yang Baik",
"Google PSE API Key": "Kunci API Google PSE", "Google PSE API Key": "Kunci API Google PSE",
@@ -298,6 +319,7 @@
"Hide Model": "Sembunyikan Model", "Hide Model": "Sembunyikan Model",
"How can I help you today?": "Ada yang bisa saya bantu hari ini?", "How can I help you today?": "Ada yang bisa saya bantu hari ini?",
"Hybrid Search": "Pencarian Hibrida", "Hybrid Search": "Pencarian Hibrida",
"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.": "",
"Image Generation (Experimental)": "Pembuatan Gambar (Eksperimental)", "Image Generation (Experimental)": "Pembuatan Gambar (Eksperimental)",
"Image Generation Engine": "Mesin Pembuat Gambar", "Image Generation Engine": "Mesin Pembuat Gambar",
"Image Settings": "Pengaturan Gambar", "Image Settings": "Pengaturan Gambar",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Pintasan keyboard", "Keyboard shortcuts": "Pintasan keyboard",
"Knowledge": "Pengetahuan", "Knowledge": "Pengetahuan",
"Language": "Bahasa", "Language": "Bahasa",
"large language models, locally.": "",
"Last Active": "Terakhir Aktif", "Last Active": "Terakhir Aktif",
"Last Modified": "Terakhir Dimodifikasi", "Last Modified": "Terakhir Dimodifikasi",
"Light": "Cahaya", "Light": "Cahaya",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Katup Saluran Pipa", "Pipelines Valves": "Katup Saluran Pipa",
"Plain text (.txt)": "Teks biasa (.txt)", "Plain text (.txt)": "Teks biasa (.txt)",
"Playground": "Taman bermain", "Playground": "Taman bermain",
"Please carefully review the following warnings:": "",
"Positive attitude": "Sikap positif", "Positive attitude": "Sikap positif",
"Previous 30 days": "30 hari sebelumnya", "Previous 30 days": "30 hari sebelumnya",
"Previous 7 days": "7 hari sebelumnya", "Previous 7 days": "7 hari sebelumnya",
@@ -475,10 +499,12 @@
"Rosé Pine": "Pinus Rosé", "Rosé Pine": "Pinus Rosé",
"Rosé Pine Dawn": "Rosé Pine Fajar", "Rosé Pine Dawn": "Rosé Pine Fajar",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "Berjalan", "Running": "Berjalan",
"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!",
@@ -558,6 +584,8 @@
"Success": "Berhasil", "Success": "Berhasil",
"Successfully updated.": "Berhasil diperbarui.", "Successfully updated.": "Berhasil diperbarui.",
"Suggested": "Disarankan", "Suggested": "Disarankan",
"Support": "",
"Support this plugin:": "",
"System": "Sistem", "System": "Sistem",
"System Prompt": "Permintaan Sistem", "System Prompt": "Permintaan Sistem",
"Tags": "Tag", "Tags": "Tag",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "Mesin Teks-ke-Suara", "Text-to-Speech Engine": "Mesin Teks-ke-Suara",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Terima kasih atas umpan balik Anda!", "Thanks for your feedback!": "Terima kasih atas umpan balik Anda!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Nilai yang diberikan haruslah nilai antara 0,0 (0%) dan 1,0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Nilai yang diberikan haruslah nilai antara 0,0 (0%) dan 1,0 (100%).",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "Berpikir", "Thinking...": "Berpikir",
@@ -593,6 +622,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",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "Alat berhasil dihapus", "Tool deleted successfully": "Alat berhasil dihapus",
"Tool imported successfully": "Alat berhasil diimpor", "Tool imported successfully": "Alat berhasil diimpor",
"Tool updated successfully": "Alat berhasil diperbarui", "Tool updated successfully": "Alat berhasil diperbarui",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "Alat", "Tools": "Alat",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "K atas", "Top K": "K atas",
"Top P": "P Atas", "Top P": "P Atas",
"Trouble accessing Ollama?": "Kesulitan mengakses Ollama?", "Trouble accessing Ollama?": "Kesulitan mengakses Ollama?",
@@ -645,6 +681,7 @@
"Version": "Versi", "Version": "Versi",
"Voice": "Suara", "Voice": "Suara",
"Warning": "Peringatan", "Warning": "Peringatan",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Peringatan: Jika Anda memperbarui atau mengubah model penyematan, Anda harus mengimpor ulang semua dokumen.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Peringatan: Jika Anda memperbarui atau mengubah model penyematan, Anda harus mengimpor ulang semua dokumen.",
"Web": "Web", "Web": "Web",
"Web API": "API Web", "Web API": "API Web",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "Anda adalah asisten yang membantu.", "You're a helpful assistant.": "Anda adalah asisten yang membantu.",
"You're now logged in.": "Anda sekarang sudah masuk.", "You're now logged in.": "Anda sekarang sudah masuk.",
"Your account status is currently pending activation.": "Status akun Anda saat ini sedang menunggu aktivasi.", "Your account status is currently pending activation.": "Status akun Anda saat ini sedang menunggu aktivasi.",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Pengaturan Pemuat Youtube" "Youtube Loader Settings": "Pengaturan Pemuat Youtube"
} }
+39 -1
View File
@@ -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",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Eliminato {{name}}", "Deleted {{name}}": "Eliminato {{name}}",
"Description": "Descrizione", "Description": "Descrizione",
"Didn't fully follow instructions": "Non ha seguito completamente le istruzioni", "Didn't fully follow instructions": "Non ha seguito completamente le istruzioni",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "Scopri un modello", "Discover a model": "Scopri un modello",
"Discover a prompt": "Scopri un prompt", "Discover a prompt": "Scopri un prompt",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat", "Display the username instead of You in the Chat": "Visualizza il nome utente invece di Tu nella chat",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Documento", "Document": "Documento",
"Document Settings": "Impostazioni documento", "Document Settings": "Impostazioni documento",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "non effettua connessioni esterne e i tuoi dati rimangono al sicuro sul tuo server ospitato localmente.", "does not make any external connections, and your data stays securely on your locally hosted server.": "non effettua connessioni esterne e i tuoi dati rimangono al sicuro sul tuo server ospitato localmente.",
"Don't Allow": "Non consentire", "Don't Allow": "Non consentire",
"Don't have an account?": "Non hai un account?", "Don't have an account?": "Non hai un account?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "Non ti piace lo stile", "Don't like the style": "Non ti piace lo stile",
"Done": "", "Done": "",
"Download": "Scarica", "Download": "Scarica",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "Abilita la condivisione della community", "Enable Community Sharing": "Abilita la condivisione della community",
"Enable New Sign Ups": "Abilita nuove iscrizioni", "Enable New Sign Ups": "Abilita nuove iscrizioni",
"Enable Web Search": "Abilita ricerca Web", "Enable Web Search": "Abilita ricerca Web",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.",
"Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui", "Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Inserisci la chiave API Serpstack", "Enter Serpstack API Key": "Inserisci la chiave API Serpstack",
"Enter stop sequence": "Inserisci la sequenza di arresto", "Enter stop sequence": "Inserisci la sequenza di arresto",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Inserisci Top K", "Enter Top K": "Inserisci Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Inserisci URL (ad esempio http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "Inserisci URL (ad esempio http://localhost:11434)",
"Enter Your Email": "Inserisci la tua email", "Enter Your Email": "Inserisci la tua email",
"Enter Your Full Name": "Inserisci il tuo nome completo", "Enter Your Full Name": "Inserisci il tuo nome completo",
"Enter your message": "",
"Enter Your Password": "Inserisci la tua password", "Enter Your Password": "Inserisci la tua password",
"Enter Your Role": "Inserisci il tuo ruolo", "Enter Your Role": "Inserisci il tuo ruolo",
"Error": "Errore", "Error": "Errore",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "Modalità file", "File Mode": "Modalità file",
"File not found.": "File non trovato.", "File not found.": "File non trovato.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "Penalità di frequenza", "Frequency Penalty": "Penalità di frequenza",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Generale", "General": "Generale",
"General Settings": "Impostazioni generali", "General Settings": "Impostazioni generali",
"Generate Image": "", "Generate Image": "",
"Generating search query": "Generazione di query di ricerca", "Generating search query": "Generazione di query di ricerca",
"Generation Info": "Informazioni generazione", "Generation Info": "Informazioni generazione",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "Buona risposta", "Good Response": "Buona risposta",
"Google PSE API Key": "Chiave API PSE di Google", "Google PSE API Key": "Chiave API PSE di Google",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "Come posso aiutarti oggi?", "How can I help you today?": "Come posso aiutarti oggi?",
"Hybrid Search": "Ricerca ibrida", "Hybrid Search": "Ricerca ibrida",
"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.": "",
"Image Generation (Experimental)": "Generazione di immagini (sperimentale)", "Image Generation (Experimental)": "Generazione di immagini (sperimentale)",
"Image Generation Engine": "Motore di generazione immagini", "Image Generation Engine": "Motore di generazione immagini",
"Image Settings": "Impostazioni immagine", "Image Settings": "Impostazioni immagine",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Scorciatoie da tastiera", "Keyboard shortcuts": "Scorciatoie da tastiera",
"Knowledge": "", "Knowledge": "",
"Language": "Lingua", "Language": "Lingua",
"large language models, locally.": "",
"Last Active": "Ultima attività", "Last Active": "Ultima attività",
"Last Modified": "", "Last Modified": "",
"Light": "Chiaro", "Light": "Chiaro",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "Valvole per tubazioni", "Pipelines Valves": "Valvole per tubazioni",
"Plain text (.txt)": "Testo normale (.txt)", "Plain text (.txt)": "Testo normale (.txt)",
"Playground": "Terreno di gioco", "Playground": "Terreno di gioco",
"Please carefully review the following warnings:": "",
"Positive attitude": "Attitudine positiva", "Positive attitude": "Attitudine positiva",
"Previous 30 days": "Ultimi 30 giorni", "Previous 30 days": "Ultimi 30 giorni",
"Previous 7 days": "Ultimi 7 giorni", "Previous 7 days": "Ultimi 7 giorni",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!",
@@ -559,6 +585,8 @@
"Success": "Successo", "Success": "Successo",
"Successfully updated.": "Aggiornato con successo.", "Successfully updated.": "Aggiornato con successo.",
"Suggested": "Suggerito", "Suggested": "Suggerito",
"Support": "",
"Support this plugin:": "",
"System": "Sistema", "System": "Sistema",
"System Prompt": "Prompt di sistema", "System Prompt": "Prompt di sistema",
"Tags": "Tag", "Tags": "Tag",
@@ -571,6 +599,7 @@
"Text-to-Speech Engine": "Motore da testo a voce", "Text-to-Speech Engine": "Motore da testo a voce",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Grazie per il tuo feedback!", "Thanks for your feedback!": "Grazie per il tuo feedback!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Il punteggio dovrebbe essere un valore compreso tra 0.0 (0%) e 1.0 (100%).", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Il punteggio dovrebbe essere un valore compreso tra 0.0 (0%) e 1.0 (100%).",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "", "Thinking...": "",
@@ -594,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.": "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",
@@ -604,7 +634,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problemi di accesso a Ollama?", "Trouble accessing Ollama?": "Problemi di accesso a Ollama?",
@@ -646,6 +682,7 @@
"Version": "Versione", "Version": "Versione",
"Voice": "", "Voice": "",
"Warning": "Avvertimento", "Warning": "Avvertimento",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attenzione: se aggiorni o cambi il tuo modello di embedding, dovrai reimportare tutti i documenti.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Attenzione: se aggiorni o cambi il tuo modello di embedding, dovrai reimportare tutti i documenti.",
"Web": "Web", "Web": "Web",
"Web API": "", "Web API": "",
@@ -672,6 +709,7 @@
"You're a helpful assistant.": "Sei un assistente utile.", "You're a helpful assistant.": "Sei un assistente utile.",
"You're now logged in.": "Ora hai effettuato l'accesso.", "You're now logged in.": "Ora hai effettuato l'accesso.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Impostazioni del caricatore Youtube" "Youtube Loader Settings": "Impostazioni del caricatore Youtube"
} }
+39 -1
View File
@@ -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": "このリンクを削除します",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "{{name}}を削除しました", "Deleted {{name}}": "{{name}}を削除しました",
"Description": "説明", "Description": "説明",
"Didn't fully follow instructions": "説明に沿って操作していませんでした", "Didn't fully follow instructions": "説明に沿って操作していませんでした",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "モデルを検出する", "Discover a model": "モデルを検出する",
"Discover a prompt": "プロンプトを見つける", "Discover a prompt": "プロンプトを見つける",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示", "Display the username instead of You in the Chat": "チャットで「あなた」の代わりにユーザー名を表示",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "ドキュメント", "Document": "ドキュメント",
"Document Settings": "ドキュメント設定", "Document Settings": "ドキュメント設定",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "外部接続を行わず、データはローカルでホストされているサーバー上に安全に保持されます。", "does not make any external connections, and your data stays securely on your locally hosted server.": "外部接続を行わず、データはローカルでホストされているサーバー上に安全に保持されます。",
"Don't Allow": "許可しない", "Don't Allow": "許可しない",
"Don't have an account?": "アカウントをお持ちではありませんか?", "Don't have an account?": "アカウントをお持ちではありませんか?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "デザインが好きでない", "Don't like the style": "デザインが好きでない",
"Done": "", "Done": "",
"Download": "ダウンロードをキャンセルしました", "Download": "ダウンロードをキャンセルしました",
@@ -206,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": "埋め込みモデル",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "コミュニティ共有の有効化", "Enable Community Sharing": "コミュニティ共有の有効化",
"Enable New Sign Ups": "新規登録を有効化", "Enable New Sign Ups": "新規登録を有効化",
"Enable Web Search": "Web 検索を有効にする", "Enable Web Search": "Web 検索を有効にする",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSVファイルに4つの列が含まれていることを確認してください: Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSVファイルに4つの列が含まれていることを確認してください: Name, Email, Password, Role.",
"Enter {{role}} message here": "{{role}} メッセージをここに入力してください", "Enter {{role}} message here": "{{role}} メッセージをここに入力してください",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack APIキーの入力", "Enter Serpstack API Key": "Serpstack APIキーの入力",
"Enter stop sequence": "ストップシーケンスを入力してください", "Enter stop sequence": "ストップシーケンスを入力してください",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "トップ K を入力してください", "Enter Top K": "トップ K を入力してください",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "URL を入力してください (例: http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "URL を入力してください (例: http://localhost:11434)",
"Enter Your Email": "メールアドレスを入力してください", "Enter Your Email": "メールアドレスを入力してください",
"Enter Your Full Name": "フルネームを入力してください", "Enter Your Full Name": "フルネームを入力してください",
"Enter your message": "",
"Enter Your Password": "パスワードを入力してください", "Enter Your Password": "パスワードを入力してください",
"Enter Your Role": "ロールを入力してください", "Enter Your Role": "ロールを入力してください",
"Error": "エラー", "Error": "エラー",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "ファイルモード", "File Mode": "ファイルモード",
"File not found.": "ファイルが見つかりません。", "File not found.": "ファイルが見つかりません。",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "周波数ペナルティ", "Frequency Penalty": "周波数ペナルティ",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "一般", "General": "一般",
"General Settings": "一般設定", "General Settings": "一般設定",
"Generate Image": "", "Generate Image": "",
"Generating search query": "検索クエリの生成", "Generating search query": "検索クエリの生成",
"Generation Info": "生成情報", "Generation Info": "生成情報",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "良い応答", "Good Response": "良い応答",
"Google PSE API Key": "Google PSE APIキー", "Google PSE API Key": "Google PSE APIキー",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "今日はどのようにお手伝いしましょうか?", "How can I help you today?": "今日はどのようにお手伝いしましょうか?",
"Hybrid Search": "ブリッジ検索", "Hybrid Search": "ブリッジ検索",
"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.": "",
"Image Generation (Experimental)": "画像生成 (実験的)", "Image Generation (Experimental)": "画像生成 (実験的)",
"Image Generation Engine": "画像生成エンジン", "Image Generation Engine": "画像生成エンジン",
"Image Settings": "画像設定", "Image Settings": "画像設定",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "キーボードショートカット", "Keyboard shortcuts": "キーボードショートカット",
"Knowledge": "", "Knowledge": "",
"Language": "言語", "Language": "言語",
"large language models, locally.": "",
"Last Active": "最終アクティブ", "Last Active": "最終アクティブ",
"Last Modified": "", "Last Modified": "",
"Light": "ライト", "Light": "ライト",
@@ -341,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 つです。後でもう一度お試しください。",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "パイプラインバルブ", "Pipelines Valves": "パイプラインバルブ",
"Plain text (.txt)": "プレーンテキスト (.txt)", "Plain text (.txt)": "プレーンテキスト (.txt)",
"Playground": "プレイグラウンド", "Playground": "プレイグラウンド",
"Please carefully review the following warnings:": "",
"Positive attitude": "陽気な態度", "Positive attitude": "陽気な態度",
"Previous 30 days": "前の30日間", "Previous 30 days": "前の30日間",
"Previous 7 days": "前の7日間", "Previous 7 days": "前の7日間",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "", "Running": "",
"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!": "スキャン完了!",
@@ -557,6 +583,8 @@
"Success": "成功", "Success": "成功",
"Successfully updated.": "正常に更新されました。", "Successfully updated.": "正常に更新されました。",
"Suggested": "提案", "Suggested": "提案",
"Support": "",
"Support this plugin:": "",
"System": "システム", "System": "システム",
"System Prompt": "システムプロンプト", "System Prompt": "システムプロンプト",
"Tags": "タグ", "Tags": "タグ",
@@ -569,6 +597,7 @@
"Text-to-Speech Engine": "テキスト音声変換エンジン", "Text-to-Speech Engine": "テキスト音声変換エンジン",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "ご意見ありがとうございます!", "Thanks for your feedback!": "ご意見ありがとうございます!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "スコアは0.0(0%)から1.0(100%)の間の値にしてください。", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "スコアは0.0(0%)から1.0(100%)の間の値にしてください。",
"Theme": "テーマ", "Theme": "テーマ",
"Thinking...": "", "Thinking...": "",
@@ -592,6 +621,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": "今日",
@@ -602,7 +632,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "トップ K", "Top K": "トップ K",
"Top P": "トップ P", "Top P": "トップ P",
"Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?", "Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?",
@@ -644,6 +680,7 @@
"Version": "バージョン", "Version": "バージョン",
"Voice": "", "Voice": "",
"Warning": "警告", "Warning": "警告",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告: 埋め込みモデルを更新または変更した場合は、すべてのドキュメントを再インポートする必要があります。", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告: 埋め込みモデルを更新または変更した場合は、すべてのドキュメントを再インポートする必要があります。",
"Web": "ウェブ", "Web": "ウェブ",
"Web API": "", "Web API": "",
@@ -670,6 +707,7 @@
"You're a helpful assistant.": "あなたは役に立つアシスタントです。", "You're a helpful assistant.": "あなたは役に立つアシスタントです。",
"You're now logged in.": "ログインしました。", "You're now logged in.": "ログインしました。",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "YouTube", "Youtube": "YouTube",
"Youtube Loader Settings": "Youtubeローダー設定" "Youtube Loader Settings": "Youtubeローダー設定"
} }
+39 -1
View File
@@ -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": "ბმულის წაშლა",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "Deleted {{name}}", "Deleted {{name}}": "Deleted {{name}}",
"Description": "აღწერა", "Description": "აღწერა",
"Didn't fully follow instructions": "ვერ ყველა ინფორმაციისთვის ვერ ხელახლა ჩაწერე", "Didn't fully follow instructions": "ვერ ყველა ინფორმაციისთვის ვერ ხელახლა ჩაწერე",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "გაიგეთ მოდელი", "Discover a model": "გაიგეთ მოდელი",
"Discover a prompt": "აღმოაჩინეთ მოთხოვნა", "Discover a prompt": "აღმოაჩინეთ მოთხოვნა",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "ჩატში აჩვენე მომხმარებლის სახელი თქვენს ნაცვლად", "Display the username instead of You in the Chat": "ჩატში აჩვენე მომხმარებლის სახელი თქვენს ნაცვლად",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "დოკუმენტი", "Document": "დოკუმენტი",
"Document Settings": "დოკუმენტის პარამეტრები", "Document Settings": "დოკუმენტის პარამეტრები",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "არ ამყარებს გარე კავშირებს და თქვენი მონაცემები უსაფრთხოდ რჩება თქვენს ადგილობრივ სერვერზე.", "does not make any external connections, and your data stays securely on your locally hosted server.": "არ ამყარებს გარე კავშირებს და თქვენი მონაცემები უსაფრთხოდ რჩება თქვენს ადგილობრივ სერვერზე.",
"Don't Allow": "არ დაუშვა", "Don't Allow": "არ დაუშვა",
"Don't have an account?": "არ გაქვს ანგარიში?", "Don't have an account?": "არ გაქვს ანგარიში?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "არ ეთიკურია ფართოდ", "Don't like the style": "არ ეთიკურია ფართოდ",
"Done": "", "Done": "",
"Download": "ჩამოტვირთვა გაუქმებულია", "Download": "ჩამოტვირთვა გაუქმებულია",
@@ -206,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": "ჩასმის ძირითადი პროგრამა",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა", "Enable Community Sharing": "საზოგადოების გაზიარების ჩართვა",
"Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა", "Enable New Sign Ups": "ახალი რეგისტრაციების ჩართვა",
"Enable Web Search": "ვებ ძიების ჩართვა", "Enable Web Search": "ვებ ძიების ჩართვა",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "გთხოვთ, უზრუნველყოთ, რომთქვევის CSV-ფაილი შეიცავს 4 ველი, ჩაწერილი ორივე ველი უდრის პირველი ველით.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "გთხოვთ, უზრუნველყოთ, რომთქვევის CSV-ფაილი შეიცავს 4 ველი, ჩაწერილი ორივე ველი უდრის პირველი ველით.",
"Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ", "Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key", "Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key",
"Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა", "Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "შეიყვანეთ Top K", "Enter Top K": "შეიყვანეთ Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "შეიყვანეთ მისამართი (მაგალითად http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "შეიყვანეთ მისამართი (მაგალითად http://localhost:11434)",
"Enter Your Email": "შეიყვანეთ თქვენი ელ-ფოსტა", "Enter Your Email": "შეიყვანეთ თქვენი ელ-ფოსტა",
"Enter Your Full Name": "შეიყვანეთ თქვენი სრული სახელი", "Enter Your Full Name": "შეიყვანეთ თქვენი სრული სახელი",
"Enter your message": "",
"Enter Your Password": "შეიყვანეთ თქვენი პაროლი", "Enter Your Password": "შეიყვანეთ თქვენი პაროლი",
"Enter Your Role": "შეიყვანეთ თქვენი როლი", "Enter Your Role": "შეიყვანეთ თქვენი როლი",
"Error": "შეცდომა", "Error": "შეცდომა",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "ფაილური რეჟიმი", "File Mode": "ფაილური რეჟიმი",
"File not found.": "ფაილი ვერ მოიძებნა", "File not found.": "ფაილი ვერ მოიძებნა",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "სიხშირის ჯარიმა", "Frequency Penalty": "სიხშირის ჯარიმა",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "ზოგადი", "General": "ზოგადი",
"General Settings": "ზოგადი პარამეტრები", "General Settings": "ზოგადი პარამეტრები",
"Generate Image": "", "Generate Image": "",
"Generating search query": "საძიებო მოთხოვნის გენერირება", "Generating search query": "საძიებო მოთხოვნის გენერირება",
"Generation Info": "გენერაციის ინფორმაცია", "Generation Info": "გენერაციის ინფორმაცია",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "დიდი პასუხი", "Good Response": "დიდი პასუხი",
"Google PSE API Key": "Google PSE API გასაღები", "Google PSE API Key": "Google PSE API გასაღები",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "როგორ შემიძლია დაგეხმარო დღეს?", "How can I help you today?": "როგორ შემიძლია დაგეხმარო დღეს?",
"Hybrid Search": "ჰიბრიდური ძებნა", "Hybrid Search": "ჰიბრიდური ძებნა",
"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.": "",
"Image Generation (Experimental)": "სურათების გენერაცია (ექსპერიმენტული)", "Image Generation (Experimental)": "სურათების გენერაცია (ექსპერიმენტული)",
"Image Generation Engine": "სურათის გენერაციის ძრავა", "Image Generation Engine": "სურათის გენერაციის ძრავა",
"Image Settings": "სურათის პარამეტრები", "Image Settings": "სურათის პარამეტრები",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "კლავიატურის მალსახმობები", "Keyboard shortcuts": "კლავიატურის მალსახმობები",
"Knowledge": "", "Knowledge": "",
"Language": "ენა", "Language": "ენა",
"large language models, locally.": "",
"Last Active": "ბოლო აქტიური", "Last Active": "ბოლო აქტიური",
"Last Modified": "", "Last Modified": "",
"Light": "მსუბუქი", "Light": "მსუბუქი",
@@ -341,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 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
@@ -353,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": "მიროსტატი ეტა",
@@ -438,6 +461,7 @@
"Pipelines Valves": "მილსადენების სარქველები", "Pipelines Valves": "მილსადენების სარქველები",
"Plain text (.txt)": "ტექსტი (.txt)", "Plain text (.txt)": "ტექსტი (.txt)",
"Playground": "სათამაშო მოედანი", "Playground": "სათამაშო მოედანი",
"Please carefully review the following warnings:": "",
"Positive attitude": "პოზიტიური ანგარიში", "Positive attitude": "პოზიტიური ანგარიში",
"Previous 30 days": "უკან 30 დღე", "Previous 30 days": "უკან 30 დღე",
"Previous 7 days": "უკან 7 დღე", "Previous 7 days": "უკან 7 დღე",
@@ -475,10 +499,12 @@
"Rosé Pine": "ვარდისფერი ფიჭვის ხე", "Rosé Pine": "ვარდისფერი ფიჭვის ხე",
"Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი", "Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი",
"RTL": "RTL", "RTL": "RTL",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!": "სკანირება დასრულდა!",
@@ -558,6 +584,8 @@
"Success": "წარმატება", "Success": "წარმატება",
"Successfully updated.": "წარმატებით განახლდა", "Successfully updated.": "წარმატებით განახლდა",
"Suggested": "პირდაპირ პოპულარული", "Suggested": "პირდაპირ პოპულარული",
"Support": "",
"Support this plugin:": "",
"System": "სისტემა", "System": "სისტემა",
"System Prompt": "სისტემური მოთხოვნა", "System Prompt": "სისტემური მოთხოვნა",
"Tags": "ტეგები", "Tags": "ტეგები",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "ტექსტურ-ხმოვანი ძრავი", "Text-to-Speech Engine": "ტექსტურ-ხმოვანი ძრავი",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "მადლობა გამოხმაურებისთვის!", "Thanks for your feedback!": "მადლობა გამოხმაურებისთვის!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ქულა 0.0 (0%) და 1.0 (100%) ჩაშენებული უნდა იყოს.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "ქულა 0.0 (0%) და 1.0 (100%) ჩაშენებული უნდა იყოს.",
"Theme": "თემა", "Theme": "თემა",
"Thinking...": "", "Thinking...": "",
@@ -593,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": "დღეს",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "ტოპ K", "Top K": "ტოპ K",
"Top P": "ტოპ P", "Top P": "ტოპ P",
"Trouble accessing Ollama?": "Ollama-ს ვერ უკავშირდები?", "Trouble accessing Ollama?": "Ollama-ს ვერ უკავშირდები?",
@@ -645,6 +681,7 @@
"Version": "ვერსია", "Version": "ვერსია",
"Voice": "", "Voice": "",
"Warning": "გაფრთხილება", "Warning": "გაფრთხილება",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "გაფრთხილება: თუ განაახლებთ ან შეცვლით ჩანერგვის მოდელს, მოგიწევთ ყველა დოკუმენტის ხელახლა იმპორტი.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "გაფრთხილება: თუ განაახლებთ ან შეცვლით ჩანერგვის მოდელს, მოგიწევთ ყველა დოკუმენტის ხელახლა იმპორტი.",
"Web": "ვები", "Web": "ვები",
"Web API": "", "Web API": "",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "თქვენ სასარგებლო ასისტენტი ხართ.", "You're a helpful assistant.": "თქვენ სასარგებლო ასისტენტი ხართ.",
"You're now logged in.": "თქვენ შესული ხართ.", "You're now logged in.": "თქვენ შესული ხართ.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Youtube Loader Settings" "Youtube Loader Settings": "Youtube Loader Settings"
} }
+39 -1
View File
@@ -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": "이 링크를 삭제합니다.",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "{{name}}을(를) 삭제했습니다.", "Deleted {{name}}": "{{name}}을(를) 삭제했습니다.",
"Description": "설명", "Description": "설명",
"Didn't fully follow instructions": "완전히 지침을 따르지 않음", "Didn't fully follow instructions": "완전히 지침을 따르지 않음",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "모델 검색", "Discover a model": "모델 검색",
"Discover a prompt": "프롬프트 검색", "Discover a prompt": "프롬프트 검색",
@@ -188,6 +192,8 @@
"Dismissible": "제외가능", "Dismissible": "제외가능",
"Display Emoji in Call": "콜(call)에서 이모지 표시", "Display Emoji in Call": "콜(call)에서 이모지 표시",
"Display the username instead of You in the Chat": "채팅에서 '당신' 대신 사용자 이름 표시", "Display the username instead of You in the Chat": "채팅에서 '당신' 대신 사용자 이름 표시",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "문서", "Document": "문서",
"Document Settings": "문서 설정", "Document Settings": "문서 설정",
"Documentation": "문서 조사", "Documentation": "문서 조사",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "어떠한 외부 연결도 하지 않으며, 데이터는 로컬에서 호스팅되는 서버에 안전하게 유지됩니다.", "does not make any external connections, and your data stays securely on your locally hosted server.": "어떠한 외부 연결도 하지 않으며, 데이터는 로컬에서 호스팅되는 서버에 안전하게 유지됩니다.",
"Don't Allow": "허용 안 함", "Don't Allow": "허용 안 함",
"Don't have an account?": "계정이 없으신가요?", "Don't have an account?": "계정이 없으신가요?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "스타일을 좋아하지 않으세요?", "Don't like the style": "스타일을 좋아하지 않으세요?",
"Done": "", "Done": "",
"Download": "다운로드", "Download": "다운로드",
@@ -206,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": "임베딩 모델",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "커뮤니티 공유 활성화", "Enable Community Sharing": "커뮤니티 공유 활성화",
"Enable New Sign Ups": "새 회원가입 활성화", "Enable New Sign Ups": "새 회원가입 활성화",
"Enable Web Search": "웹 검색 활성화", "Enable Web Search": "웹 검색 활성화",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV 파일에 이름, 이메일, 비밀번호, 역할 4개의 컬럼이 순서대로 포함되어 있는지 확인하세요.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV 파일에 이름, 이메일, 비밀번호, 역할 4개의 컬럼이 순서대로 포함되어 있는지 확인하세요.",
"Enter {{role}} message here": "여기에 {{role}} 메시지 입력", "Enter {{role}} message here": "여기에 {{role}} 메시지 입력",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "Serply API 키 입력", "Enter Serply API Key": "Serply API 키 입력",
"Enter Serpstack API Key": "Serpstack API 키 입력", "Enter Serpstack API Key": "Serpstack API 키 입력",
"Enter stop sequence": "중지 시퀀스 입력", "Enter stop sequence": "중지 시퀀스 입력",
"Enter system prompt": "",
"Enter Tavily API Key": "Tavily API 키 입력", "Enter Tavily API Key": "Tavily API 키 입력",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Top K 입력", "Enter Top K": "Top K 입력",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "URL 입력(예: http://localhost:11434)", "Enter URL (e.g. http://localhost:11434)": "URL 입력(예: http://localhost:11434)",
"Enter Your Email": "이메일 입력", "Enter Your Email": "이메일 입력",
"Enter Your Full Name": "이름 입력", "Enter Your Full Name": "이름 입력",
"Enter your message": "",
"Enter Your Password": "비밀번호 입력", "Enter Your Password": "비밀번호 입력",
"Enter Your Role": "역할 입력", "Enter Your Role": "역할 입력",
"Error": "오류", "Error": "오류",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "파일 모드", "File Mode": "파일 모드",
"File not found.": "파일을 찾을 수 없습니다.", "File not found.": "파일을 찾을 수 없습니다.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "프리퀀시 페널티", "Frequency Penalty": "프리퀀시 페널티",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "일반", "General": "일반",
"General Settings": "일반 설정", "General Settings": "일반 설정",
"Generate Image": "이미지 생성", "Generate Image": "이미지 생성",
"Generating search query": "검색 쿼리 생성", "Generating search query": "검색 쿼리 생성",
"Generation Info": "생성 정보", "Generation Info": "생성 정보",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "좋은 응답", "Good Response": "좋은 응답",
"Google PSE API Key": "Google PSE API 키", "Google PSE API Key": "Google PSE API 키",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "오늘 어떻게 도와드릴까요?", "How can I help you today?": "오늘 어떻게 도와드릴까요?",
"Hybrid Search": "하이브리드 검색", "Hybrid Search": "하이브리드 검색",
"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.": "",
"Image Generation (Experimental)": "이미지 생성(실험적)", "Image Generation (Experimental)": "이미지 생성(실험적)",
"Image Generation Engine": "이미지 생성 엔진", "Image Generation Engine": "이미지 생성 엔진",
"Image Settings": "이미지 설정", "Image Settings": "이미지 설정",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "키보드 단축키", "Keyboard shortcuts": "키보드 단축키",
"Knowledge": "지식 기반", "Knowledge": "지식 기반",
"Language": "언어", "Language": "언어",
"large language models, locally.": "",
"Last Active": "최근 활동", "Last Active": "최근 활동",
"Last Modified": "마지막 수정", "Last Modified": "마지막 수정",
"Light": "Light", "Light": "Light",
@@ -341,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개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "파이프라인 밸브", "Pipelines Valves": "파이프라인 밸브",
"Plain text (.txt)": "일반 텍스트(.txt)", "Plain text (.txt)": "일반 텍스트(.txt)",
"Playground": "놀이터", "Playground": "놀이터",
"Please carefully review the following warnings:": "",
"Positive attitude": "긍정적인 자세", "Positive attitude": "긍정적인 자세",
"Previous 30 days": "이전 30일", "Previous 30 days": "이전 30일",
"Previous 7 days": "이전 7일", "Previous 7 days": "이전 7일",
@@ -475,10 +499,12 @@
"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.": "",
"Running": "실행 중", "Running": "실행 중",
"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!": "스캔 완료!",
@@ -558,6 +584,8 @@
"Success": "성공", "Success": "성공",
"Successfully updated.": "성공적으로 업데이트되었습니다.", "Successfully updated.": "성공적으로 업데이트되었습니다.",
"Suggested": "제안", "Suggested": "제안",
"Support": "",
"Support this plugin:": "",
"System": "시스템", "System": "시스템",
"System Prompt": "시스템 프롬프트", "System Prompt": "시스템 프롬프트",
"Tags": "태그", "Tags": "태그",
@@ -570,6 +598,7 @@
"Text-to-Speech Engine": "텍스트-음성 변환 엔진", "Text-to-Speech Engine": "텍스트-음성 변환 엔진",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "피드백 감사합니다!", "Thanks for your feedback!": "피드백 감사합니다!",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "점수는 0.0(0%)에서 1.0(100%) 사이의 값이어야 합니다.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "점수는 0.0(0%)에서 1.0(100%) 사이의 값이어야 합니다.",
"Theme": "테마", "Theme": "테마",
"Thinking...": "생각 중...", "Thinking...": "생각 중...",
@@ -593,6 +622,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": "오늘",
@@ -603,7 +633,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "도구", "Tools": "도구",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Ollama에 접근하는 데 문제가 있나요?", "Trouble accessing Ollama?": "Ollama에 접근하는 데 문제가 있나요?",
@@ -645,6 +681,7 @@
"Version": "버전", "Version": "버전",
"Voice": "음성", "Voice": "음성",
"Warning": "경고", "Warning": "경고",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "주의: 기존 임베딩 모델을 변경 또는 업데이트하는 경우, 모든 문서를 다시 가져와야 합니다.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "주의: 기존 임베딩 모델을 변경 또는 업데이트하는 경우, 모든 문서를 다시 가져와야 합니다.",
"Web": "웹", "Web": "웹",
"Web API": "웹 API", "Web API": "웹 API",
@@ -671,6 +708,7 @@
"You're a helpful assistant.": "당신은 유용한 어시스턴트입니다.", "You're a helpful assistant.": "당신은 유용한 어시스턴트입니다.",
"You're now logged in.": "로그인되었습니다.", "You're now logged in.": "로그인되었습니다.",
"Your account status is currently pending activation.": "현재 계정은 아직 활성화되지 않았습니다.", "Your account status is currently pending activation.": "현재 계정은 아직 활성화되지 않았습니다.",
"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.": "",
"Youtube": "유튜브", "Youtube": "유튜브",
"Youtube Loader Settings": "유튜브 로더 설정" "Youtube Loader Settings": "유튜브 로더 설정"
} }
+8
View File
@@ -111,6 +111,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 +127,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)"
+40 -2
View File
@@ -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ą",
@@ -177,6 +180,7 @@
"Deleted {{name}}": "", "Deleted {{name}}": "",
"Description": "Aprašymas", "Description": "Aprašymas",
"Didn't fully follow instructions": "Pilnai nesekė instrukcijų", "Didn't fully follow instructions": "Pilnai nesekė instrukcijų",
"Disabled": "",
"Discover a function": "", "Discover a function": "",
"Discover a model": "", "Discover a model": "",
"Discover a prompt": "Atrasti užklausas", "Discover a prompt": "Atrasti užklausas",
@@ -188,6 +192,8 @@
"Dismissible": "", "Dismissible": "",
"Display Emoji in Call": "", "Display Emoji in Call": "",
"Display the username instead of You in the Chat": "Rodyti naudotojo vardą vietoje žodžio Jūs pokalbyje", "Display the username instead of You in the Chat": "Rodyti naudotojo vardą vietoje žodžio Jūs pokalbyje",
"Do not install functions from sources you do not fully trust.": "",
"Do not install tools from sources you do not fully trust.": "",
"Document": "Dokumentas", "Document": "Dokumentas",
"Document Settings": "Dokumento nuostatos", "Document Settings": "Dokumento nuostatos",
"Documentation": "", "Documentation": "",
@@ -195,6 +201,8 @@
"does not make any external connections, and your data stays securely on your locally hosted server.": "neturi jokių išorinių ryšių ir duomenys lieka serveryje.", "does not make any external connections, and your data stays securely on your locally hosted server.": "neturi jokių išorinių ryšių ir duomenys lieka serveryje.",
"Don't Allow": "Neleisti", "Don't Allow": "Neleisti",
"Don't have an account?": "Neturite paskyros?", "Don't have an account?": "Neturite paskyros?",
"don't install random functions from sources you don't trust.": "",
"don't install random tools from sources you don't trust.": "",
"Don't like the style": "Nepatinka stilius", "Don't like the style": "Nepatinka stilius",
"Done": "", "Done": "",
"Download": "Parsisiųsti", "Download": "Parsisiųsti",
@@ -206,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",
@@ -215,6 +224,7 @@
"Enable Community Sharing": "", "Enable Community Sharing": "",
"Enable New Sign Ups": "Aktyvuoti naujas registracijas", "Enable New Sign Ups": "Aktyvuoti naujas registracijas",
"Enable Web Search": "", "Enable Web Search": "",
"Enabled": "",
"Engine": "", "Engine": "",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Įsitikinkite, kad CSV failas turi 4 kolonas šiuo eiliškumu: Name, Email, Password, Role.", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Įsitikinkite, kad CSV failas turi 4 kolonas šiuo eiliškumu: Name, Email, Password, Role.",
"Enter {{role}} message here": "Įveskite {{role}} žinutę čia", "Enter {{role}} message here": "Įveskite {{role}} žinutę čia",
@@ -236,6 +246,7 @@
"Enter Serply API Key": "", "Enter Serply API Key": "",
"Enter Serpstack API Key": "", "Enter Serpstack API Key": "",
"Enter stop sequence": "Įveskite pabaigos sekvenciją", "Enter stop sequence": "Įveskite pabaigos sekvenciją",
"Enter system prompt": "",
"Enter Tavily API Key": "", "Enter Tavily API Key": "",
"Enter Tika Server URL": "", "Enter Tika Server URL": "",
"Enter Top K": "Įveskite Top K", "Enter Top K": "Įveskite Top K",
@@ -243,6 +254,7 @@
"Enter URL (e.g. http://localhost:11434)": "Įveskite nuorododą (pvz. http://localhost:11434", "Enter URL (e.g. http://localhost:11434)": "Įveskite nuorododą (pvz. http://localhost:11434",
"Enter Your Email": "Įveskite el. pašto adresą", "Enter Your Email": "Įveskite el. pašto adresą",
"Enter Your Full Name": "Įveskite vardą bei pavardę", "Enter Your Full Name": "Įveskite vardą bei pavardę",
"Enter your message": "",
"Enter Your Password": "Įveskite slaptažodį", "Enter Your Password": "Įveskite slaptažodį",
"Enter Your Role": "Įveskite savo rolę", "Enter Your Role": "Įveskite savo rolę",
"Error": "", "Error": "",
@@ -266,6 +278,7 @@
"File": "", "File": "",
"File Mode": "Dokumentų rėžimas", "File Mode": "Dokumentų rėžimas",
"File not found.": "Failas nerastas.", "File not found.": "Failas nerastas.",
"Files": "",
"Filter is now globally disabled": "", "Filter is now globally disabled": "",
"Filter is now globally enabled": "", "Filter is now globally enabled": "",
"Filters": "", "Filters": "",
@@ -278,14 +291,22 @@
"Frequency Penalty": "", "Frequency Penalty": "",
"Function created successfully": "", "Function created successfully": "",
"Function deleted successfully": "", "Function deleted successfully": "",
"Function Description (e.g. A filter to remove profanity from text)": "",
"Function ID (e.g. my_filter)": "",
"Function is now globally disabled": "",
"Function is now globally enabled": "",
"Function Name (e.g. My Filter)": "",
"Function updated successfully": "", "Function updated successfully": "",
"Functions": "", "Functions": "",
"Functions allow arbitrary code execution": "",
"Functions allow arbitrary code execution.": "",
"Functions imported successfully": "", "Functions imported successfully": "",
"General": "Bendri", "General": "Bendri",
"General Settings": "Bendri nustatymai", "General Settings": "Bendri nustatymai",
"Generate Image": "", "Generate Image": "",
"Generating search query": "", "Generating search query": "",
"Generation Info": "Generavimo informacija", "Generation Info": "Generavimo informacija",
"Get up and running with": "",
"Global": "", "Global": "",
"Good Response": "Geras atsakymas", "Good Response": "Geras atsakymas",
"Google PSE API Key": "", "Google PSE API Key": "",
@@ -298,6 +319,7 @@
"Hide Model": "", "Hide Model": "",
"How can I help you today?": "Kuo galėčiau Jums padėti ?", "How can I help you today?": "Kuo galėčiau Jums padėti ?",
"Hybrid Search": "Hibridinė paieška", "Hybrid Search": "Hibridinė paieška",
"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.": "",
"Image Generation (Experimental)": "Vaizdų generavimas (eksperimentinis)", "Image Generation (Experimental)": "Vaizdų generavimas (eksperimentinis)",
"Image Generation Engine": "Vaizdų generavimo variklis", "Image Generation Engine": "Vaizdų generavimo variklis",
"Image Settings": "Vaizdų nustatymai", "Image Settings": "Vaizdų nustatymai",
@@ -328,6 +350,7 @@
"Keyboard shortcuts": "Klaviatūros trumpiniai", "Keyboard shortcuts": "Klaviatūros trumpiniai",
"Knowledge": "", "Knowledge": "",
"Language": "Kalba", "Language": "Kalba",
"large language models, locally.": "",
"Last Active": "Paskutinį kartą aktyvus", "Last Active": "Paskutinį kartą aktyvus",
"Last Modified": "", "Last Modified": "",
"Light": "Šviesus", "Light": "Šviesus",
@@ -341,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.",
@@ -353,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",
@@ -438,6 +461,7 @@
"Pipelines Valves": "", "Pipelines Valves": "",
"Plain text (.txt)": "Grynas tekstas (.txt)", "Plain text (.txt)": "Grynas tekstas (.txt)",
"Playground": "Eksperimentavimo erdvė", "Playground": "Eksperimentavimo erdvė",
"Please carefully review the following warnings:": "",
"Positive attitude": "Pozityvus elgesys", "Positive attitude": "Pozityvus elgesys",
"Previous 30 days": "Paskutinės 30 dienų", "Previous 30 days": "Paskutinės 30 dienų",
"Previous 7 days": "Paskutinės 7 dienos", "Previous 7 days": "Paskutinės 7 dienos",
@@ -475,10 +499,12 @@
"Rosé Pine": "Rosé Pine", "Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn", "Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "", "RTL": "",
"Run Llama 2, Code Llama, and other models. Customize and create your own.": "",
"Running": "", "Running": "",
"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!",
@@ -560,6 +586,8 @@
"Success": "Sėkmingai", "Success": "Sėkmingai",
"Successfully updated.": "Sėkmingai atnaujinta.", "Successfully updated.": "Sėkmingai atnaujinta.",
"Suggested": "Siūloma", "Suggested": "Siūloma",
"Support": "",
"Support this plugin:": "",
"System": "Sistema", "System": "Sistema",
"System Prompt": "Sistemos užklausa", "System Prompt": "Sistemos užklausa",
"Tags": "Žymos", "Tags": "Žymos",
@@ -572,6 +600,7 @@
"Text-to-Speech Engine": "Balso sintezės modelis", "Text-to-Speech Engine": "Balso sintezės modelis",
"Tfs Z": "Tfs Z", "Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Ačiū už atsiliepimus", "Thanks for your feedback!": "Ačiū už atsiliepimus",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Rezultatas turėtų būti tarp 0.0 (0%) ir 1.0 (100%)", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Rezultatas turėtų būti tarp 0.0 (0%) ir 1.0 (100%)",
"Theme": "Tema", "Theme": "Tema",
"Thinking...": "", "Thinking...": "",
@@ -589,12 +618,13 @@
"Title Auto-Generation": "Automatinis pavadinimų generavimas", "Title Auto-Generation": "Automatinis pavadinimų generavimas",
"Title cannot be an empty string.": "Pavadinimas negali būti tuščias", "Title cannot be an empty string.": "Pavadinimas negali būti tuščias",
"Title Generation Prompt": "Pavadinimo generavimo užklausa", "Title Generation Prompt": "Pavadinimo generavimo užklausa",
"to": "kam", "to": "➡️",
"To access the available model names for downloading,": "Tam, kad prieiti prie galimų parsisiųsti modelių", "To access the available model names for downloading,": "Tam, kad prieiti prie galimų parsisiųsti modelių",
"To access the GGUF models available for downloading,": "Tam, kad prieiti prie galimų parsisiųsti GGUF,", "To access the GGUF models available for downloading,": "Tam, kad prieiti prie galimų parsisiųsti GGUF,",
"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",
@@ -605,7 +635,13 @@
"Tool deleted successfully": "", "Tool deleted successfully": "",
"Tool imported successfully": "", "Tool imported successfully": "",
"Tool updated successfully": "", "Tool updated successfully": "",
"Toolkit Description (e.g. A toolkit for performing various operations)": "",
"Toolkit ID (e.g. my_toolkit)": "",
"Toolkit Name (e.g. My ToolKit)": "",
"Tools": "", "Tools": "",
"Tools are a function calling system with arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution": "",
"Tools have a function calling system that allows arbitrary code execution.": "",
"Top K": "Top K", "Top K": "Top K",
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problemos prieinant prie Ollama?", "Trouble accessing Ollama?": "Problemos prieinant prie Ollama?",
@@ -647,6 +683,7 @@
"Version": "Versija", "Version": "Versija",
"Voice": "", "Voice": "",
"Warning": "", "Warning": "",
"Warning:": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Jei pakeisite embedding modelį, turėsite reimportuoti visus dokumentus", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Jei pakeisite embedding modelį, turėsite reimportuoti visus dokumentus",
"Web": "Web", "Web": "Web",
"Web API": "", "Web API": "",
@@ -673,6 +710,7 @@
"You're a helpful assistant.": "Esi asistentas.", "You're a helpful assistant.": "Esi asistentas.",
"You're now logged in.": "Esate prisijungę.", "You're now logged in.": "Esate prisijungę.",
"Your account status is currently pending activation.": "", "Your account status is currently pending activation.": "",
"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.": "",
"Youtube": "Youtube", "Youtube": "Youtube",
"Youtube Loader Settings": "Youtube krovimo nustatymai" "Youtube Loader Settings": "Youtube krovimo nustatymai"
} }

Some files were not shown because too many files have changed in this diff Show More