Compare commits

...

153 Commits

Author SHA1 Message Date
Timothy Jaeryang Baek 8f3c9b391b Merge pull request #3093 from open-webui/dev
Create and publish Docker images with specific build args / build-main-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-main-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / merge-main-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-cuda-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-ollama-images (push) Blocked by required conditions
fix
2024-06-12 11:21:44 -07:00
Timothy J. Baek 5a9d883a93 fix 2024-06-12 11:21:23 -07:00
Timothy Jaeryang Baek c2e8af5ed1 Merge pull request #3090 from open-webui/dev
0.3.4
2024-06-12 11:13:41 -07:00
Timothy J. Baek 70a85d6111 doc: changelog 2024-06-12 11:13:24 -07:00
Timothy J. Baek 1163745a03 revert 2024-06-12 11:08:05 -07:00
Timothy J. Baek 529fcaa5c9 fix: document query save 2024-06-12 11:07:04 -07:00
Timothy J. Baek 681fd4ff3b fix: tools api 2024-06-12 10:55:26 -07:00
Timothy Jaeryang Baek 0917fa6f4a Merge pull request #3056 from open-webui/dev
refac
2024-06-12 03:15:25 -07:00
Timothy J. Baek c7d3969a53 refac 2024-06-12 03:13:59 -07:00
Timothy Jaeryang Baek c41b33c9c0 Merge pull request #3013 from open-webui/dev
Create and publish Docker images with specific build args / build-main-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-main-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / merge-main-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-cuda-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-ollama-images (push) Blocked by required conditions
0.3.3
2024-06-12 02:14:37 -07:00
Timothy J. Baek 7131ac24a7 chore: format 2024-06-12 02:12:39 -07:00
Timothy J. Baek 501cd2071c fix: fr translation 2024-06-12 02:10:38 -07:00
Timothy J. Baek 85a1233733 refac: styling 2024-06-12 02:09:00 -07:00
Timothy J. Baek 670fa83e2c doc: changelog 2024-06-12 02:05:12 -07:00
Timothy J. Baek d03a53e755 doc: changelog 2024-06-12 01:58:38 -07:00
Timothy J. Baek 2ec416bd6b doc: readme 2024-06-12 01:49:13 -07:00
Timothy J. Baek b1a391ca5d doc: readme 2024-06-12 01:46:28 -07:00
Timothy J. Baek c0ca447041 chore: format 2024-06-12 01:37:53 -07:00
Timothy Jaeryang Baek 5d3db15eca Merge pull request #3049 from que-nguyen/dev
Refactor URL validation function
2024-06-12 01:36:34 -07:00
Timothy J. Baek eead69068c fix: type casting 2024-06-12 01:35:42 -07:00
Timothy J. Baek edae1ca4c7 chore: format 2024-06-12 01:32:22 -07:00
Timothy J. Baek 0c9cc2baa3 refac: message 2024-06-12 01:28:30 -07:00
Timothy J. Baek 326ac41422 refac: bypass confirm dialog for edit 2024-06-12 01:22:52 -07:00
Timothy J. Baek dd2941bb43 feat: import confim dialog 2024-06-12 01:20:12 -07:00
Timothy J. Baek a691ee08d8 feat: confirm dialog 2024-06-12 01:17:46 -07:00
Timothy J. Baek e8fc522eba chore: format 2024-06-12 00:18:22 -07:00
Timothy J. Baek 482a41e49b fix 2024-06-12 00:16:54 -07:00
Timothy J. Baek ae3d8ce0c0 refac 2024-06-12 00:15:45 -07:00
Timothy J. Baek a2e30ace02 refac: her 2024-06-12 00:13:35 -07:00
Timothy J. Baek cde9672a09 enh: her 2024-06-12 00:05:20 -07:00
Timothy J. Baek db6ca856de Update requirements-dev.lock 2024-06-11 19:16:06 -07:00
Timothy J. Baek bb5e615841 chore: python requirements 2024-06-11 19:14:47 -07:00
Timothy J. Baek 48ac4d9f2a fix 2024-06-11 18:23:42 -07:00
Que Nguyen eb7bba81fe Refactor URL validation function
- The check for private IP addresses often did not yield the expected results, especially with errors like: `[Errno -2] Name or service not known`.
- Removed the check for private IP addresses in the URL validation process.
- Simplified the `validate_url` function to focus on validating the URL format and checking the existence of the URL using a HEAD request.
2024-06-12 08:15:04 +07:00
Timothy J. Baek a43cb1eb25 refac: styling 2024-06-11 17:09:10 -07:00
Timothy J. Baek e2d8872060 fix: e2e 2024-06-11 17:03:49 -07:00
Timothy J. Baek ede584320f refac: tools edit 2024-06-11 16:54:21 -07:00
Timothy J. Baek bc458d3ee0 refac 2024-06-11 16:15:54 -07:00
Timothy J. Baek 0d1f7265c4 refac 2024-06-11 16:15:19 -07:00
Timothy J. Baek 539201a032 chore: format 2024-06-11 15:44:36 -07:00
Timothy J. Baek 50ad2aa215 chore: format 2024-06-11 15:44:27 -07:00
Timothy J. Baek 5cd28c04b8 feat: model tools assignment 2024-06-11 15:29:46 -07:00
Timothy J. Baek c3ce4d7f6a refac 2024-06-11 14:36:46 -07:00
Timothy J. Baek 9bd054490f refac 2024-06-11 14:32:01 -07:00
Timothy J. Baek 2be14d57bf fix 2024-06-11 14:30:18 -07:00
Timothy J. Baek 61e0a85aed feat: export tool 2024-06-11 12:24:36 -07:00
Timothy J. Baek e483c6b598 refac: styling 2024-06-11 12:18:30 -07:00
Timothy J. Baek db3b075796 refac: input menu tools 2024-06-11 12:16:11 -07:00
Timothy J. Baek 0bb26ae504 refac: tools 2024-06-11 11:31:14 -07:00
Timothy J. Baek 9d16dd997a refac 2024-06-11 11:15:43 -07:00
Timothy J. Baek e4fe1fff97 feat: tool __user__ email 2024-06-11 10:54:11 -07:00
Timothy J. Baek 37ed31b0e2 feat: tools warning 2024-06-11 10:47:46 -07:00
Timothy J. Baek dc82e681dd refac 2024-06-11 10:43:36 -07:00
Timothy J. Baek 4944824544 enh: __user__ example 2024-06-11 10:36:35 -07:00
Timothy J. Baek 67cd9b76ae refac: __user__ param 2024-06-11 10:35:13 -07:00
Timothy J. Baek 8a86f32700 feat: user hook 2024-06-11 10:19:59 -07:00
Timothy Jaeryang Baek f62b15d8da Merge pull request #3042 from sime2408/fit/translations-croatian
Updated Croatian translation for user interface text
2024-06-11 09:55:17 -07:00
Timothy Jaeryang Baek d709038b5b Merge pull request #3029 from Yash-1511/main
feat: add DuckDuckGo search functionality using duckduckgo_search library
2024-06-11 09:53:26 -07:00
Timothy Jaeryang Baek a2631ed38e Merge pull request #3041 from cocktailpeanut/main
feat: custom HOST env variable on windows
2024-06-11 09:52:45 -07:00
Timothy Jaeryang Baek 8ffd8c3505 Merge pull request #3035 from ClassicOldSong/main
Fix frontend stops responding when backend throws error
2024-06-11 09:52:26 -07:00
sime2408 f74df0433b Updated Croatian translation for user interface text
Refined Croatian locale translations to improve understanding and clarity for Croatian users. Adjustments made include improving command descriptions, correcting grammar, and adapting the terminology to better fit the software context.
2024-06-11 18:52:08 +02:00
Timothy Jaeryang Baek 93fa98245b Merge pull request #3033 from que-nguyen/dev
Fixed the issue where a single URL error disrupts the Web Search
2024-06-11 09:52:07 -07:00
Timothy Jaeryang Baek e7727aea9e Merge pull request #3024 from KarlLee830/translate
Update Chinese Translation
2024-06-11 09:51:34 -07:00
cocktailpeanut 884eb9f7ee update 2024-06-11 12:32:29 -04:00
Yukino Song 912b75f8ac Fix frontend stops responding when backend throw error 2024-06-11 23:25:07 +08:00
Que Nguyen 3bec60b80c Fixed the issue where a single URL error disrupts the data loading process in Web Search mode
To address the unresolved issue in the LangChain library where a single URL error disrupts the data loading process, the lazy_load method in the WebBaseLoader class has been modified. The enhanced method now handles exceptions appropriately, logging errors and continuing with the remaining URLs.
2024-06-11 22:06:14 +07:00
Yash-1511 07b08ef67e add: duckduckgo-search dependencies added in requirements.txt 2024-06-11 19:53:57 +05:30
Yash-1511 83f9475584 feat: add DuckDuckGo search functionality using duckduckgo_search library 2024-06-11 19:49:08 +05:30
Karl Lee 1ad5456fe0 Update Chinese Translation 2024-06-11 20:46:15 +08:00
Timothy J. Baek bf1936de34 refac 2024-06-11 02:12:24 -07:00
Timothy J. Baek 827dd1b044 refac 2024-06-11 01:58:26 -07:00
Timothy J. Baek b2028d187d chore: format 2024-06-11 01:34:29 -07:00
Timothy J. Baek 1e1b372d07 fix 2024-06-11 01:18:05 -07:00
Timothy J. Baek bd5a8567ef refac: tools & rag 2024-06-11 01:10:24 -07:00
Timothy J. Baek fc46532955 fix 2024-06-11 00:58:52 -07:00
Timothy Jaeryang Baek 5f29a9edf4 Merge pull request #2998 from que-nguyen/dev
Completed Vietnamese translation
2024-06-11 00:52:15 -07:00
Timothy J. Baek 91bc65c7da fix 2024-06-11 00:50:30 -07:00
Timothy J. Baek a91db7f7a6 refac 2024-06-11 00:43:42 -07:00
Timothy Jaeryang Baek e6fe3ada57 Merge pull request #3006 from open-webui/tools
feat: tools
2024-06-11 00:37:53 -07:00
Timothy J. Baek 354683296b refac 2024-06-11 00:37:31 -07:00
Timothy J. Baek 5237439e29 feat: tool desc 2024-06-11 00:32:16 -07:00
Timothy J. Baek 049b3136e8 refac 2024-06-11 00:24:25 -07:00
Timothy J. Baek 3d6f5f418d feat: tools full integration 2024-06-11 00:18:45 -07:00
Timothy J. Baek a27175d672 feat: fc integration 2024-06-10 23:40:27 -07:00
Timothy J. Baek ff1cd306d8 refac 2024-06-10 22:38:48 -07:00
Timothy J. Baek aa7d25600f refac 2024-06-10 22:33:25 -07:00
Timothy J. Baek 0bae7ca615 feat: tool selector input menu 2024-06-10 22:29:24 -07:00
Timothy J. Baek 3578b5e337 refac: clone 2024-06-10 22:16:49 -07:00
Timothy J. Baek 8464b30485 refac 2024-06-10 22:10:53 -07:00
Timothy J. Baek c961964647 enh: tool id validation 2024-06-10 21:59:06 -07:00
Timothy J. Baek dd7ac4c53a refac: search 2024-06-10 21:55:34 -07:00
Timothy J. Baek 4601a0246f fix: tool edit 2024-06-10 21:53:51 -07:00
Timothy J. Baek 25c0eca414 feat: edit tool spinner 2024-06-10 21:47:25 -07:00
Timothy J. Baek ca8be1ee4a feat: import tools 2024-06-10 21:38:29 -07:00
Timothy J. Baek 1611a3aa70 feat: export tools 2024-06-10 21:36:13 -07:00
Timothy J. Baek b434ebf3ad feat: tools integration 2024-06-10 21:33:46 -07:00
Timothy Jaeryang Baek d2ed99e201 Merge pull request #3008 from open-webui/main
dev
2024-06-10 21:07:35 -07:00
Timothy Jaeryang Baek 06976c4551 Merge pull request #3007 from open-webui/fix
fix
2024-06-10 21:07:13 -07:00
Timothy J. Baek 626643104e fix 2024-06-10 21:06:46 -07:00
Timothy J. Baek c5683dd24c refac 2024-06-10 21:05:06 -07:00
Timothy J. Baek 6589464ddf refac 2024-06-10 20:58:47 -07:00
Timothy J. Baek e27c264081 feat: tools apis 2024-06-10 20:43:11 -07:00
Timothy J. Baek 3a96e1f109 feat: tools backend 2024-06-10 20:39:55 -07:00
Timothy J. Baek c4629c8c2d refac: tools 2024-06-10 19:30:48 -07:00
Timothy J. Baek adea3af8d7 refac 2024-06-10 19:19:53 -07:00
Timothy Jaeryang Baek ec516e95fa Merge pull request #3001 from open-webui/main
dev
2024-06-10 18:56:21 -07:00
Timothy Jaeryang Baek 481fd9f88a Merge pull request #3000 from open-webui/fix
fix
2024-06-10 18:56:01 -07:00
Timothy J. Baek 2bbaf1234c fix 2024-06-10 18:55:45 -07:00
Timothy Jaeryang Baek 690c25215d Merge pull request #2999 from open-webui/fix
fix
2024-06-10 18:55:18 -07:00
Timothy J. Baek b72243c166 fix 2024-06-10 18:54:52 -07:00
Timothy J. Baek 8f2e799615 fix 2024-06-10 18:53:33 -07:00
Que Nguyen 8ecf262457 Completed Vietnamese translation 2024-06-11 08:49:06 +07:00
Timothy Jaeryang Baek 7fb785901e Merge pull request #2997 from open-webui/main
dev
2024-06-10 18:02:06 -07:00
Timothy Jaeryang Baek 5dc9b93916 Merge pull request #2996 from open-webui/fix
fix: regeneration
2024-06-10 17:58:42 -07:00
Timothy J. Baek 1241bc3e89 fix: regeneration 2024-06-10 17:58:07 -07:00
Timothy J. Baek c5ed3452d2 refac 2024-06-10 17:52:12 -07:00
Timothy J. Baek c2e6e44714 refac 2024-06-10 17:33:40 -07:00
Timothy J. Baek 6e7e575a18 refac 2024-06-10 17:30:07 -07:00
Timothy J. Baek f43b545bdd refac 2024-06-10 17:24:42 -07:00
Timothy J. Baek 12a04b118f refac: styling 2024-06-10 17:22:44 -07:00
Timothy J. Baek 8b1e2ce279 feat: code format 2024-06-10 17:12:48 -07:00
Timothy J. Baek fb0f106afe refac: styling 2024-06-10 16:37:33 -07:00
Timothy J. Baek dd423f43de feat: default tools template 2024-06-10 16:35:42 -07:00
Timothy J. Baek f2bd3fdf19 chore: rm console log 2024-06-10 16:16:08 -07:00
Timothy J. Baek 8ad52f0fcc feat: code editor 2024-06-10 16:02:23 -07:00
Timothy J. Baek 5a3736f1ee feat: tools page 2024-06-10 15:24:26 -07:00
Timothy J. Baek 54bbfa5e89 chore: npm 2024-06-10 14:49:03 -07:00
Timothy Jaeryang Baek 3933db2c91 Merge pull request #2992 from open-webui/dev
Create and publish Docker images with specific build args / build-main-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-main-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-cuda-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/amd64) (push) Waiting to run
Create and publish Docker images with specific build args / build-ollama-image (linux/arm64) (push) Waiting to run
Create and publish Docker images with specific build args / merge-main-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-cuda-images (push) Blocked by required conditions
Create and publish Docker images with specific build args / merge-ollama-images (push) Blocked by required conditions
0.3.2
2024-06-10 13:53:56 -07:00
Timothy J. Baek dc8f0987e1 doc: changelog 2024-06-10 13:53:47 -07:00
Timothy J. Baek 644f0fe6c3 chore: version bump 2024-06-10 13:52:35 -07:00
Timothy J. Baek 87b04b0fc3 fix: params 2024-06-10 13:41:13 -07:00
Timothy J. Baek 455403a4a4 fix 2024-06-10 13:29:28 -07:00
Timothy J. Baek 547b990041 refac: params 2024-06-10 13:29:09 -07:00
Timothy Jaeryang Baek fcf8f2a704 Merge pull request #2952 from arkohut/tolerant-readonly-filesystem
fix: tolerant readonly filesystem for copy favicon to static dir
2024-06-10 11:59:06 -07:00
Timothy Jaeryang Baek 496e798cc7 Merge pull request #2973 from KarlLee830/translate
i18n: Add some missing i18n keys and update Chinese translation
2024-06-10 11:58:47 -07:00
Timothy Jaeryang Baek e01b3569d5 Merge pull request #2983 from pedrosilva/ptPTtranslation
pt-PT translation
2024-06-10 11:58:34 -07:00
Timothy J. Baek a75b68c19c refac: message status history 2024-06-10 11:40:58 -07:00
Timothy J. Baek 34f04c53fc fix: audio 2024-06-10 11:04:00 -07:00
Pedro Silva 2b87ab32ff Updated pt-PT translation 2024-06-10 15:27:06 +01:00
arkohut d20f6cb45b fix: use Exception to handle all errors 2024-06-10 21:27:35 +08:00
Karl Lee 48c9fb0ddf Update Chinese translation 2024-06-10 18:02:52 +08:00
Timothy Jaeryang Baek c609cc23eb Merge pull request #2964 from googio/dev
feat: adding Serply as another web search provider
2024-06-10 01:50:04 -07:00
Timothy Jaeryang Baek 3566002b0b doc 2024-06-10 03:49:23 -05:00
Timothy J. Baek 140d7ff721 refac 2024-06-10 01:07:24 -07:00
Timothy J. Baek 7349e1d8c8 refac 2024-06-10 00:56:13 -07:00
Timothy J. Baek bf5a62298c refac 2024-06-10 00:15:46 -07:00
Timothy J. Baek 2972774d87 refac 2024-06-10 00:07:47 -07:00
teampen 14eb667fc8 add changes to web search in admin settings 2024-06-09 21:52:08 -04:00
teampen 79bf8d6dd3 undo changes to deprecated web search params 2024-06-09 21:43:13 -04:00
teampen 14d33f0fcc Merge branch 'add-serply' into dev 2024-06-09 21:40:50 -04:00
teampen 4dcec4855e adding Serply as an alternative web search 2024-06-09 21:39:46 -04:00
teampen efb4a710c8 adding Serply as an alternative web search 2024-06-09 20:44:34 -04:00
arkohut 8e9e429a91 fix: tolerant readonly filesystem for copy favicon to static dir 2024-06-09 23:23:28 +08:00
104 changed files with 4335 additions and 988 deletions
+36
View File
@@ -5,6 +5,42 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.3.4] - 2024-06-12
### Fixed
- **🔒 Mixed Content with HTTPS Issue**: Resolved a problem where mixed content (HTTP and HTTPS) was causing security warnings and blocking resources on HTTPS sites.
- **🔍 Web Search Issue**: Addressed the problem where web search functionality was not working correctly. The 'ENABLE_RAG_LOCAL_WEB_FETCH' option has been reintroduced to restore proper web searching capabilities.
- **💾 RAG Template Not Being Saved**: Fixed an issue where the RAG template was not being saved correctly, ensuring your custom templates are now preserved as expected.
## [0.3.3] - 2024-06-12
### Added
- **🛠️ Native Python Function Calling**: Introducing native Python function calling within Open WebUI. Weve also included a built-in code editor to seamlessly develop and integrate function code within the 'Tools' workspace. With this, you can significantly enhance your LLMs capabilities by creating custom RAG pipelines, web search tools, and even agent-like features such as sending Discord messages.
- **🌐 DuckDuckGo Integration**: Added DuckDuckGo as a web search provider, giving you more search options.
- **🌏 Enhanced Translations**: Improved translations for Vietnamese and Chinese languages, making the interface more accessible.
### Fixed
- **🔗 Web Search URL Error Handling**: Fixed the issue where a single URL error would disrupt the data loading process in Web Search mode. Now, such errors will be handled gracefully to ensure uninterrupted data loading.
- **🖥️ Frontend Responsiveness**: Resolved the problem where the frontend would stop responding if the backend encounters an error while downloading a model. Improved error handling to maintain frontend stability.
- **🔧 Dependency Issues in pip**: Fixed issues related to pip installations, ensuring all dependencies are correctly managed to prevent installation errors.
## [0.3.2] - 2024-06-10
### Added
- **🔍 Web Search Query Status**: The web search query will now persist in the results section to aid in easier debugging and tracking of search queries.
- **🌐 New Web Search Provider**: We have added Serply as a new option for web search providers, giving you more choices for your search needs.
- **🌏 Improved Translations**: We've enhanced translations for Chinese and Portuguese.
### Fixed
- **🎤 Audio File Upload Issue**: The bug that prevented audio files from being uploaded in chat input has been fixed, ensuring smooth communication.
- **💬 Message Input Handling**: Improved the handling of message inputs by instantly clearing images and text after sending, along with immediate visual indications when a response message is loading, enhancing user feedback.
- **⚙️ Parameter Registration and Validation**: Fixed the issue where parameters were not registering in certain cases and addressed the problem where users were unable to save due to invalid input errors.
## [0.3.1] - 2024-06-09
### Fixed
+5 -1
View File
@@ -29,11 +29,15 @@ Open WebUI is an [extensible](https://github.com/open-webui/pipelines), feature-
- ✒️🔢 **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction.
- 🎤📹 **Hands-Free Voice/Video Call**: Experience seamless communication with integrated hands-free voice and video call features, allowing for a more dynamic and interactive chat environment.
- 🛠️ **Model Builder**: Easily create Ollama models via the Web UI. Create and add custom characters/agents, customize chat elements, and import models effortlessly through [Open WebUI Community](https://openwebui.com/) integration.
- 🐍 **Native Python Function Calling Tool**: Enhance your LLMs with built-in code editor support in the tools workspace. Bring Your Own Function (BYOF) by simply adding your pure Python functions, enabling seamless integration with LLMs.
- 📚 **Local RAG Integration**: Dive into the future of chat interactions with groundbreaking Retrieval Augmented Generation (RAG) support. This feature seamlessly integrates document interactions into your chat experience. You can load documents directly into the chat or add files to your document library, effortlessly accessing them using the `#` command before a query.
- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, and `serper`, and inject the results directly into your chat experience.
- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, `serper`, and `Serply` and inject the results directly into your chat experience.
- 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by a URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions.
+54 -3
View File
@@ -8,13 +8,15 @@ from fastapi import (
Form,
)
from fastapi.middleware.cors import CORSMiddleware
import requests
import os, shutil, logging, re
from datetime import datetime
from pathlib import Path
from typing import List, Union, Sequence
from typing import List, Union, Sequence, Iterator, Any
from chromadb.utils.batch_utils import create_batches
from langchain_core.documents import Document
from langchain_community.document_loaders import (
WebBaseLoader,
@@ -69,7 +71,8 @@ from apps.rag.search.main import SearchResult
from apps.rag.search.searxng import search_searxng
from apps.rag.search.serper import search_serper
from apps.rag.search.serpstack import search_serpstack
from apps.rag.search.serply import search_serply
from apps.rag.search.duckduckgo import search_duckduckgo
from utils.misc import (
calculate_sha256,
@@ -115,6 +118,7 @@ from config import (
SERPSTACK_API_KEY,
SERPSTACK_HTTPS,
SERPER_API_KEY,
SERPLY_API_KEY,
RAG_WEB_SEARCH_RESULT_COUNT,
RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
RAG_EMBEDDING_OPENAI_BATCH_SIZE,
@@ -167,6 +171,7 @@ app.state.config.BRAVE_SEARCH_API_KEY = BRAVE_SEARCH_API_KEY
app.state.config.SERPSTACK_API_KEY = SERPSTACK_API_KEY
app.state.config.SERPSTACK_HTTPS = SERPSTACK_HTTPS
app.state.config.SERPER_API_KEY = SERPER_API_KEY
app.state.config.SERPLY_API_KEY = SERPLY_API_KEY
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT
app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS
@@ -394,6 +399,7 @@ async def get_rag_config(user=Depends(get_admin_user)):
"serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
"serpstack_https": app.state.config.SERPSTACK_HTTPS,
"serper_api_key": app.state.config.SERPER_API_KEY,
"serply_api_key": app.state.config.SERPLY_API_KEY,
"result_count": app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
"concurrent_requests": app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
},
@@ -421,6 +427,7 @@ class WebSearchConfig(BaseModel):
serpstack_api_key: Optional[str] = None
serpstack_https: Optional[bool] = None
serper_api_key: Optional[str] = None
serply_api_key: Optional[str] = None
result_count: Optional[int] = None
concurrent_requests: Optional[int] = None
@@ -471,6 +478,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
app.state.config.SERPSTACK_API_KEY = form_data.web.search.serpstack_api_key
app.state.config.SERPSTACK_HTTPS = form_data.web.search.serpstack_https
app.state.config.SERPER_API_KEY = form_data.web.search.serper_api_key
app.state.config.SERPLY_API_KEY = form_data.web.search.serply_api_key
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = form_data.web.search.result_count
app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = (
form_data.web.search.concurrent_requests
@@ -499,6 +507,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
"serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
"serpstack_https": app.state.config.SERPSTACK_HTTPS,
"serper_api_key": app.state.config.SERPER_API_KEY,
"serply_api_key": app.state.config.SERPLY_API_KEY,
"result_count": app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
"concurrent_requests": app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
},
@@ -695,7 +704,7 @@ def get_web_loader(url: Union[str, Sequence[str]], verify_ssl: bool = True):
# Check if the URL is valid
if not validate_url(url):
raise ValueError(ERROR_MESSAGES.INVALID_URL)
return WebBaseLoader(
return SafeWebBaseLoader(
url,
verify_ssl=verify_ssl,
requests_per_second=RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
@@ -746,6 +755,7 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
- BRAVE_SEARCH_API_KEY
- SERPSTACK_API_KEY
- SERPER_API_KEY
- SERPLY_API_KEY
Args:
query (str): The query to search for
@@ -804,6 +814,17 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
)
else:
raise Exception("No SERPER_API_KEY found in environment variables")
elif engine == "serply":
if app.state.config.SERPLY_API_KEY:
return search_serply(
app.state.config.SERPLY_API_KEY,
query,
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
)
else:
raise Exception("No SERPLY_API_KEY found in environment variables")
elif engine == "duckduckgo":
return search_duckduckgo(query, app.state.config.RAG_WEB_SEARCH_RESULT_COUNT)
else:
raise Exception("No search engine API key found in environment variables")
@@ -811,6 +832,9 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
@app.post("/web/search")
def store_web_search(form_data: SearchForm, user=Depends(get_current_user)):
try:
logging.info(
f"trying to web search with {app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query}"
)
web_results = search_web(
app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query
)
@@ -1221,6 +1245,33 @@ def reset(user=Depends(get_admin_user)) -> bool:
return True
class SafeWebBaseLoader(WebBaseLoader):
"""WebBaseLoader with enhanced error handling for URLs."""
def lazy_load(self) -> Iterator[Document]:
"""Lazy load text from the url(s) in web_path with error handling."""
for path in self.web_paths:
try:
soup = self._scrape(path, bs_kwargs=self.bs_kwargs)
text = soup.get_text(**self.bs_get_text_kwargs)
# Build metadata
metadata = {"source": path}
if title := soup.find("title"):
metadata["title"] = title.get_text()
if description := soup.find("meta", attrs={"name": "description"}):
metadata["description"] = description.get(
"content", "No description found."
)
if html := soup.find("html"):
metadata["language"] = html.get("lang", "No language found.")
yield Document(page_content=text, metadata=metadata)
except Exception as e:
# Log the error and continue with the next URL
log.error(f"Error loading {path}: {e}")
if ENV == "dev":
@app.get("/ef")
+46
View File
@@ -0,0 +1,46 @@
import logging
from apps.rag.search.main import SearchResult
from duckduckgo_search import DDGS
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["RAG"])
def search_duckduckgo(query: str, count: int) -> list[SearchResult]:
"""
Search using DuckDuckGo's Search API and return the results as a list of SearchResult objects.
Args:
query (str): The query to search for
count (int): The number of results to return
Returns:
List[SearchResult]: A list of search results
"""
# Use the DDGS context manager to create a DDGS object
with DDGS() as ddgs:
# Use the ddgs.text() method to perform the search
ddgs_gen = ddgs.text(
query, safesearch="moderate", max_results=count, backend="api"
)
# Check if there are search results
if ddgs_gen:
# Convert the search results into a list
search_results = [r for r in ddgs_gen]
# Create an empty list to store the SearchResult objects
results = []
# Iterate over each search result
for result in search_results:
# Create a SearchResult object and append it to the results list
results.append(
SearchResult(
link=result["href"],
title=result.get("title"),
snippet=result.get("body"),
)
)
print(results)
# Return the list of search results
return results
+68
View File
@@ -0,0 +1,68 @@
import json
import logging
import requests
from urllib.parse import urlencode
from apps.rag.search.main import SearchResult
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["RAG"])
def search_serply(
api_key: str,
query: str,
count: int,
hl: str = "us",
limit: int = 10,
device_type: str = "desktop",
proxy_location: str = "US",
) -> list[SearchResult]:
"""Search using serper.dev's API and return the results as a list of SearchResult objects.
Args:
api_key (str): A serply.io API key
query (str): The query to search for
hl (str): Host Language code to display results in (reference https://developers.google.com/custom-search/docs/xml_results?hl=en#wsInterfaceLanguages)
limit (int): The maximum number of results to return [10-100, defaults to 10]
"""
log.info("Searching with Serply")
url = "https://api.serply.io/v1/search/"
query_payload = {
"q": query,
"language": "en",
"num": limit,
"gl": proxy_location.upper(),
"hl": hl.lower(),
}
url = f"{url}{urlencode(query_payload)}"
headers = {
"X-API-KEY": api_key,
"X-User-Agent": device_type,
"User-Agent": "open-webui",
"X-Proxy-Location": proxy_location,
}
response = requests.request("GET", url, headers=headers)
response.raise_for_status()
json_response = response.json()
log.info(f"results from serply search: {json_response}")
results = sorted(
json_response.get("results", []), key=lambda x: x.get("realPosition", 0)
)
return [
SearchResult(
link=result["link"],
title=result.get("title"),
snippet=result.get("description"),
)
for result in results[:count]
]
+206
View File
@@ -0,0 +1,206 @@
{
"ads": [],
"ads_count": 0,
"answers": [],
"results": [
{
"title": "Apple",
"link": "https://www.apple.com/",
"description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...",
"additional_links": [
{
"text": "AppleApplehttps://www.apple.com",
"href": "https://www.apple.com/"
}
],
"cite": {},
"subdomains": [
{
"title": "Support",
"link": "https://support.apple.com/",
"description": "SupportContact - iPhone Support - Billing and Subscriptions - Apple Repair"
},
{
"title": "Store",
"link": "https://www.apple.com/store",
"description": "StoreShop iPhone - Shop iPad - App Store - Shop Mac - ..."
},
{
"title": "Mac",
"link": "https://www.apple.com/mac/",
"description": "MacMacBook Air - MacBook Pro - iMac - Compare Mac models - Mac mini"
},
{
"title": "iPad",
"link": "https://www.apple.com/ipad/",
"description": "iPadShop iPad - iPad Pro - iPad Air - Compare iPad models - ..."
},
{
"title": "Watch",
"link": "https://www.apple.com/watch/",
"description": "WatchShop Apple Watch - Series 9 - SE - Ultra 2 - Nike - Hermès - ..."
}
],
"realPosition": 1
},
{
"title": "Apple",
"link": "https://www.apple.com/",
"description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...",
"additional_links": [
{
"text": "AppleApplehttps://www.apple.com",
"href": "https://www.apple.com/"
}
],
"cite": {},
"realPosition": 2
},
{
"title": "Apple Inc.",
"link": "https://en.wikipedia.org/wiki/Apple_Inc.",
"description": "Apple Inc. (formerly Apple Computer, Inc.) is an American multinational corporation and technology company headquartered in Cupertino, California, ...",
"additional_links": [
{
"text": "Apple Inc.Wikipediahttps://en.wikipedia.org wiki Apple_Inc",
"href": "https://en.wikipedia.org/wiki/Apple_Inc."
},
{
"text": "",
"href": "https://en.wikipedia.org/wiki/Apple_Inc."
},
{
"text": "History",
"href": "https://en.wikipedia.org/wiki/History_of_Apple_Inc."
},
{
"text": "List of Apple products",
"href": "https://en.wikipedia.org/wiki/List_of_Apple_products"
},
{
"text": "Litigation involving Apple Inc.",
"href": "https://en.wikipedia.org/wiki/Litigation_involving_Apple_Inc."
},
{
"text": "Apple Park",
"href": "https://en.wikipedia.org/wiki/Apple_Park"
}
],
"cite": {
"domain": "https://en.wikipedia.org wiki Apple_Inc",
"span": " wiki Apple_Inc"
},
"realPosition": 3
},
{
"title": "Apple Inc. (AAPL) Company Profile & Facts",
"link": "https://finance.yahoo.com/quote/AAPL/profile/",
"description": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide. The company offers iPhone, a line ...",
"additional_links": [
{
"text": "Apple Inc. (AAPL) Company Profile & FactsYahoo Financehttps://finance.yahoo.com quote AAPL profile",
"href": "https://finance.yahoo.com/quote/AAPL/profile/"
}
],
"cite": {
"domain": "https://finance.yahoo.com quote AAPL profile",
"span": " quote AAPL profile"
},
"realPosition": 4
},
{
"title": "Apple Inc - Company Profile and News",
"link": "https://www.bloomberg.com/profile/company/AAPL:US",
"description": "Apple Inc. Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables and accessories, and sells a variety of related ...",
"additional_links": [
{
"text": "Apple Inc - Company Profile and NewsBloomberghttps://www.bloomberg.com company AAPL:US",
"href": "https://www.bloomberg.com/profile/company/AAPL:US"
},
{
"text": "",
"href": "https://www.bloomberg.com/profile/company/AAPL:US"
}
],
"cite": {
"domain": "https://www.bloomberg.com company AAPL:US",
"span": " company AAPL:US"
},
"realPosition": 5
},
{
"title": "Apple Inc. | History, Products, Headquarters, & Facts",
"link": "https://www.britannica.com/money/Apple-Inc",
"description": "May 22, 2024 — Apple Inc. is an American multinational technology company that revolutionized the technology sector through its innovation of computer ...",
"additional_links": [
{
"text": "Apple Inc. | History, Products, Headquarters, & FactsBritannicahttps://www.britannica.com money Apple-Inc",
"href": "https://www.britannica.com/money/Apple-Inc"
},
{
"text": "",
"href": "https://www.britannica.com/money/Apple-Inc"
}
],
"cite": {
"domain": "https://www.britannica.com money Apple-Inc",
"span": " money Apple-Inc"
},
"realPosition": 6
}
],
"shopping_ads": [],
"places": [
{
"title": "Apple Inc."
},
{
"title": "Apple Inc"
},
{
"title": "Apple Inc"
}
],
"related_searches": {
"images": [],
"text": [
{
"title": "apple inc full form",
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+full+form&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhPEAE"
},
{
"title": "apple company history",
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+company+history&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhOEAE"
},
{
"title": "apple store",
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Store&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhQEAE"
},
{
"title": "apple id",
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+id&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhSEAE"
},
{
"title": "apple inc industry",
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+industry&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhREAE"
},
{
"title": "apple login",
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+login&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhTEAE"
}
]
},
"image_results": [],
"carousel": [],
"total": 2450000000,
"knowledge_graph": "",
"related_questions": [
"What does the Apple Inc do?",
"Why did Apple change to Apple Inc?",
"Who owns Apple Inc.?",
"What is Apple Inc best known for?"
],
"carousel_count": 0,
"ts": 2.491065263748169,
"device_type": null
}
+2 -12
View File
@@ -236,10 +236,9 @@ def get_embedding_function(
return lambda query: generate_multiple(query, func)
def rag_messages(
def get_rag_context(
docs,
messages,
template,
embedding_function,
k,
reranking_function,
@@ -318,16 +317,7 @@ def rag_messages(
context_string = context_string.strip()
ra_content = rag_template(
template=template,
context=context_string,
query=query,
)
log.debug(f"ra_content: {ra_content}")
messages = add_or_update_system_message(ra_content, messages)
return messages, citations
return context_string, citations
def get_model_path(model: str, update_model: bool = False):
-12
View File
@@ -19,8 +19,6 @@ TIMEOUT_DURATION = 3
@sio.event
async def connect(sid, environ, auth):
print("connect ", sid)
user = None
if auth and "token" in auth:
data = decode_token(auth["token"])
@@ -37,7 +35,6 @@ async def connect(sid, environ, auth):
print(f"user {user.name}({user.id}) connected with session ID {sid}")
print(len(set(USER_POOL)))
await sio.emit("user-count", {"count": len(set(USER_POOL))})
await sio.emit("usage", {"models": get_models_in_use()})
@@ -64,13 +61,11 @@ async def user_join(sid, data):
print(f"user {user.name}({user.id}) connected with session ID {sid}")
print(len(set(USER_POOL)))
await sio.emit("user-count", {"count": len(set(USER_POOL))})
@sio.on("user-count")
async def user_count(sid):
print("user-count", sid)
await sio.emit("user-count", {"count": len(set(USER_POOL))})
@@ -79,14 +74,12 @@ def get_models_in_use():
models_in_use = []
for model_id, data in USAGE_POOL.items():
models_in_use.append(model_id)
print(f"Models in use: {models_in_use}")
return models_in_use
@sio.on("usage")
async def usage(sid, data):
print(f'Received "usage" event from {sid}: {data}')
model_id = data["model"]
@@ -114,7 +107,6 @@ async def usage(sid, data):
async def remove_after_timeout(sid, model_id):
try:
print("remove_after_timeout", sid, model_id)
await asyncio.sleep(TIMEOUT_DURATION)
if model_id in USAGE_POOL:
print(USAGE_POOL[model_id]["sids"])
@@ -124,7 +116,6 @@ async def remove_after_timeout(sid, model_id):
if len(USAGE_POOL[model_id]["sids"]) == 0:
del USAGE_POOL[model_id]
print(f"Removed usage data for {model_id} due to timeout")
# Broadcast the usage data to all clients
await sio.emit("usage", {"models": get_models_in_use()})
except asyncio.CancelledError:
@@ -143,9 +134,6 @@ async def disconnect(sid):
if len(USER_POOL[user_id]) == 0:
del USER_POOL[user_id]
print(f"user {user_id} disconnected with session ID {sid}")
print(USER_POOL)
await sio.emit("user-count", {"count": len(USER_POOL)})
else:
print(f"Unknown session ID {sid} disconnected")
@@ -0,0 +1,61 @@
"""Peewee migrations -- 009_add_models.py.
Some examples (model - class or model name)::
> Model = migrator.orm['table_name'] # Return model in current state by name
> Model = migrator.ModelClass # Return model in current state by name
> migrator.sql(sql) # Run custom SQL
> migrator.run(func, *args, **kwargs) # Run python function with the given args
> migrator.create_model(Model) # Create a model (could be used as decorator)
> migrator.remove_model(model, cascade=True) # Remove a model
> migrator.add_fields(model, **fields) # Add fields to a model
> migrator.change_fields(model, **fields) # Change fields
> migrator.remove_fields(model, *field_names, cascade=True)
> migrator.rename_field(model, old_field_name, new_field_name)
> migrator.rename_table(model, new_table_name)
> migrator.add_index(model, *col_names, unique=False)
> migrator.add_not_null(model, *field_names)
> migrator.add_default(model, field_name, default)
> migrator.add_constraint(model, name, sql)
> migrator.drop_index(model, *col_names)
> migrator.drop_not_null(model, *field_names)
> migrator.drop_constraints(model, *constraints)
"""
from contextlib import suppress
import peewee as pw
from peewee_migrate import Migrator
with suppress(ImportError):
import playhouse.postgres_ext as pw_pext
def migrate(migrator: Migrator, database: pw.Database, *, fake=False):
"""Write your migrations here."""
@migrator.create_model
class Tool(pw.Model):
id = pw.TextField(unique=True)
user_id = pw.TextField()
name = pw.TextField()
content = pw.TextField()
specs = pw.TextField()
meta = pw.TextField()
created_at = pw.BigIntegerField(null=False)
updated_at = pw.BigIntegerField(null=False)
class Meta:
table_name = "tool"
def rollback(migrator: Migrator, database: pw.Database, *, fake=False):
"""Write your rollback migrations here."""
migrator.remove_model("tool")
+5 -2
View File
@@ -6,6 +6,7 @@ from apps.webui.routers import (
users,
chats,
documents,
tools,
models,
prompts,
configs,
@@ -26,8 +27,8 @@ from config import (
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
JWT_EXPIRES_IN,
WEBUI_BANNERS,
AppConfig,
ENABLE_COMMUNITY_SHARING,
AppConfig,
)
app = FastAPI()
@@ -38,6 +39,7 @@ app.state.config = AppConfig()
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
app.state.config.SHOW_ADMIN_DETAILS = SHOW_ADMIN_DETAILS
@@ -54,7 +56,7 @@ app.state.config.BANNERS = WEBUI_BANNERS
app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING
app.state.MODELS = {}
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
app.state.TOOLS = {}
app.add_middleware(
@@ -70,6 +72,7 @@ app.include_router(users.router, prefix="/users", tags=["users"])
app.include_router(chats.router, prefix="/chats", tags=["chats"])
app.include_router(documents.router, prefix="/documents", tags=["documents"])
app.include_router(tools.router, prefix="/tools", tags=["tools"])
app.include_router(models.router, prefix="/models", tags=["models"])
app.include_router(prompts.router, prefix="/prompts", tags=["prompts"])
app.include_router(memories.router, prefix="/memories", tags=["memories"])
+132
View File
@@ -0,0 +1,132 @@
from pydantic import BaseModel
from peewee import *
from playhouse.shortcuts import model_to_dict
from typing import List, Union, Optional
import time
import logging
from apps.webui.internal.db import DB, JSONField
import json
from config import SRC_LOG_LEVELS
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
####################
# Tools DB Schema
####################
class Tool(Model):
id = CharField(unique=True)
user_id = CharField()
name = TextField()
content = TextField()
specs = JSONField()
meta = JSONField()
updated_at = BigIntegerField()
created_at = BigIntegerField()
class Meta:
database = DB
class ToolMeta(BaseModel):
description: Optional[str] = None
class ToolModel(BaseModel):
id: str
user_id: str
name: str
content: str
specs: List[dict]
meta: ToolMeta
updated_at: int # timestamp in epoch
created_at: int # timestamp in epoch
####################
# Forms
####################
class ToolResponse(BaseModel):
id: str
user_id: str
name: str
meta: ToolMeta
updated_at: int # timestamp in epoch
created_at: int # timestamp in epoch
class ToolForm(BaseModel):
id: str
name: str
content: str
meta: ToolMeta
class ToolsTable:
def __init__(self, db):
self.db = db
self.db.create_tables([Tool])
def insert_new_tool(
self, user_id: str, form_data: ToolForm, specs: List[dict]
) -> Optional[ToolModel]:
tool = ToolModel(
**{
**form_data.model_dump(),
"specs": specs,
"user_id": user_id,
"updated_at": int(time.time()),
"created_at": int(time.time()),
}
)
try:
result = Tool.create(**tool.model_dump())
if result:
return tool
else:
return None
except Exception as e:
print(f"Error creating tool: {e}")
return None
def get_tool_by_id(self, id: str) -> Optional[ToolModel]:
try:
tool = Tool.get(Tool.id == id)
return ToolModel(**model_to_dict(tool))
except:
return None
def get_tools(self) -> List[ToolModel]:
return [ToolModel(**model_to_dict(tool)) for tool in Tool.select()]
def update_tool_by_id(self, id: str, updated: dict) -> Optional[ToolModel]:
try:
query = Tool.update(
**updated,
updated_at=int(time.time()),
).where(Tool.id == id)
query.execute()
tool = Tool.get(Tool.id == id)
return ToolModel(**model_to_dict(tool))
except:
return None
def delete_tool_by_id(self, id: str) -> bool:
try:
query = Tool.delete().where((Tool.id == id))
query.execute() # Remove the rows, return number of rows removed.
return True
except:
return False
Tools = ToolsTable(DB)
+1 -1
View File
@@ -161,7 +161,7 @@ async def get_archived_session_user_chat_list(
############################
@router.post("/archive/all", response_model=List[ChatTitleIdResponse])
@router.post("/archive/all", response_model=bool)
async def archive_all_chats(user=Depends(get_current_user)):
return Chats.archive_all_chats_by_user_id(user.id)
+183
View File
@@ -0,0 +1,183 @@
from fastapi import Depends, FastAPI, HTTPException, status, Request
from datetime import datetime, timedelta
from typing import List, Union, Optional
from fastapi import APIRouter
from pydantic import BaseModel
import json
from apps.webui.models.tools import Tools, ToolForm, ToolModel, ToolResponse
from apps.webui.utils import load_toolkit_module_by_id
from utils.utils import get_current_user, get_admin_user
from utils.tools import get_tools_specs
from constants import ERROR_MESSAGES
from importlib import util
import os
from config import DATA_DIR
TOOLS_DIR = f"{DATA_DIR}/tools"
os.makedirs(TOOLS_DIR, exist_ok=True)
router = APIRouter()
############################
# GetToolkits
############################
@router.get("/", response_model=List[ToolResponse])
async def get_toolkits(user=Depends(get_current_user)):
toolkits = [toolkit for toolkit in Tools.get_tools()]
return toolkits
############################
# ExportToolKits
############################
@router.get("/export", response_model=List[ToolModel])
async def get_toolkits(user=Depends(get_admin_user)):
toolkits = [toolkit for toolkit in Tools.get_tools()]
return toolkits
############################
# CreateNewToolKit
############################
@router.post("/create", response_model=Optional[ToolResponse])
async def create_new_toolkit(
request: Request, form_data: ToolForm, user=Depends(get_admin_user)
):
if not form_data.id.isidentifier():
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Only alphanumeric characters and underscores are allowed in the id",
)
form_data.id = form_data.id.lower()
toolkit = Tools.get_tool_by_id(form_data.id)
if toolkit == None:
toolkit_path = os.path.join(TOOLS_DIR, f"{form_data.id}.py")
try:
with open(toolkit_path, "w") as tool_file:
tool_file.write(form_data.content)
toolkit_module = load_toolkit_module_by_id(form_data.id)
TOOLS = request.app.state.TOOLS
TOOLS[form_data.id] = toolkit_module
specs = get_tools_specs(TOOLS[form_data.id])
toolkit = Tools.insert_new_tool(user.id, form_data, specs)
if toolkit:
return toolkit
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT("Error creating toolkit"),
)
except Exception as e:
print(e)
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e),
)
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.ID_TAKEN,
)
############################
# GetToolkitById
############################
@router.get("/id/{id}", response_model=Optional[ToolModel])
async def get_toolkit_by_id(id: str, user=Depends(get_admin_user)):
toolkit = Tools.get_tool_by_id(id)
if toolkit:
return toolkit
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.NOT_FOUND,
)
############################
# UpdateToolkitById
############################
@router.post("/id/{id}/update", response_model=Optional[ToolModel])
async def update_toolkit_by_id(
request: Request, id: str, form_data: ToolForm, user=Depends(get_admin_user)
):
toolkit_path = os.path.join(TOOLS_DIR, f"{id}.py")
try:
with open(toolkit_path, "w") as tool_file:
tool_file.write(form_data.content)
toolkit_module = load_toolkit_module_by_id(id)
TOOLS = request.app.state.TOOLS
TOOLS[id] = toolkit_module
specs = get_tools_specs(TOOLS[id])
updated = {
**form_data.model_dump(exclude={"id"}),
"specs": specs,
}
print(updated)
toolkit = Tools.update_tool_by_id(id, updated)
if toolkit:
return toolkit
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT("Error updating toolkit"),
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e),
)
############################
# DeleteToolkitById
############################
@router.delete("/id/{id}/delete", response_model=bool)
async def delete_toolkit_by_id(request: Request, id: str, user=Depends(get_admin_user)):
result = Tools.delete_tool_by_id(id)
if result:
TOOLS = request.app.state.TOOLS
if id in TOOLS:
del TOOLS[id]
# delete the toolkit file
toolkit_path = os.path.join(TOOLS_DIR, f"{id}.py")
os.remove(toolkit_path)
return result
+17
View File
@@ -7,6 +7,8 @@ from pydantic import BaseModel
from fpdf import FPDF
import markdown
import black
from apps.webui.internal.db import DB
from utils.utils import get_admin_user
@@ -26,6 +28,21 @@ async def get_gravatar(
return get_gravatar_url(email)
class CodeFormatRequest(BaseModel):
code: str
@router.post("/code/format")
async def format_code(request: CodeFormatRequest):
try:
formatted_code = black.format_str(request.code, mode=black.Mode())
return {"code": formatted_code}
except black.NothingChanged:
return {"code": request.code}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
class MarkdownForm(BaseModel):
md: str
+23
View File
@@ -0,0 +1,23 @@
from importlib import util
import os
from config import TOOLS_DIR
def load_toolkit_module_by_id(toolkit_id):
toolkit_path = os.path.join(TOOLS_DIR, f"{toolkit_id}.py")
spec = util.spec_from_file_location(toolkit_id, toolkit_path)
module = util.module_from_spec(spec)
try:
spec.loader.exec_module(module)
print(f"Loaded module: {module.__name__}")
if hasattr(module, "Tools"):
return module.Tools()
else:
raise Exception("No Tools class found")
except Exception as e:
print(f"Error loading module: {toolkit_id}")
# Move the file to the error folder
os.rename(toolkit_path, f"{toolkit_path}.error")
raise e
+33 -6
View File
@@ -308,8 +308,9 @@ frontend_favicon = FRONTEND_BUILD_DIR / "favicon.png"
if frontend_favicon.exists():
try:
shutil.copyfile(frontend_favicon, STATIC_DIR / "favicon.png")
except PermissionError:
logging.error(f"No write permission to {STATIC_DIR / 'favicon.png'}")
except Exception as e:
logging.error(f"An error occurred: {e}")
else:
logging.warning(f"Frontend favicon not found at {frontend_favicon}")
@@ -367,6 +368,14 @@ DOCS_DIR = os.getenv("DOCS_DIR", f"{DATA_DIR}/docs")
Path(DOCS_DIR).mkdir(parents=True, exist_ok=True)
####################################
# Tools DIR
####################################
TOOLS_DIR = os.getenv("TOOLS_DIR", f"{DATA_DIR}/tools")
Path(TOOLS_DIR).mkdir(parents=True, exist_ok=True)
####################################
# LITELLM_CONFIG
####################################
@@ -668,16 +677,28 @@ Question:
),
)
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD = PersistentConfig(
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD",
"task.search.prompt_length_threshold",
os.environ.get(
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD",
100,
int(
os.environ.get(
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD",
100,
)
),
)
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig(
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
"task.tools.prompt_template",
os.environ.get(
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
"""Tools: {{TOOLS}}
If a function tool doesn't match the query, return an empty string. Else, pick a function tool, fill in the parameters from the function tool's schema, and return it in the format { "name": \"functionName\", "parameters": { "key": "value" } }. Only pick a function if the user asks. Only return the object. Do not return any other text.""",
),
)
####################################
# WEBUI_SECRET_KEY
####################################
@@ -915,6 +936,12 @@ SERPER_API_KEY = PersistentConfig(
os.getenv("SERPER_API_KEY", ""),
)
SERPLY_API_KEY = PersistentConfig(
"SERPLY_API_KEY",
"rag.web.search.serply_api_key",
os.getenv("SERPLY_API_KEY", ""),
)
RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig(
"RAG_WEB_SEARCH_RESULT_COUNT",
+1
View File
@@ -32,6 +32,7 @@ class ERROR_MESSAGES(str, Enum):
COMMAND_TAKEN = "Uh-oh! This command is already registered. Please choose another command string."
FILE_EXISTS = "Uh-oh! This file is already registered. Please choose another file."
ID_TAKEN = "Uh-oh! This id is already registered. Please choose another id string."
MODEL_ID_TAKEN = "Uh-oh! This model id is already registered. Please choose another model id string."
NAME_TAG_TAKEN = "Uh-oh! This name tag is already registered. Please choose another name tag string."
+223 -21
View File
@@ -11,6 +11,7 @@ import requests
import mimetypes
import shutil
import os
import inspect
import asyncio
from fastapi import FastAPI, Request, Depends, status, UploadFile, File, Form
@@ -47,15 +48,24 @@ from pydantic import BaseModel
from typing import List, Optional
from apps.webui.models.models import Models, ModelModel
from apps.webui.models.tools import Tools
from apps.webui.utils import load_toolkit_module_by_id
from utils.utils import (
get_admin_user,
get_verified_user,
get_current_user,
get_http_authorization_cred,
)
from utils.task import title_generation_template, search_query_generation_template
from utils.task import (
title_generation_template,
search_query_generation_template,
tools_function_calling_generation_template,
)
from utils.misc import get_last_user_message, add_or_update_system_message
from apps.rag.utils import rag_messages
from apps.rag.utils import get_rag_context, rag_template
from config import (
CONFIG_DATA,
@@ -82,6 +92,7 @@ from config import (
TITLE_GENERATION_PROMPT_TEMPLATE,
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD,
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
AppConfig,
)
from constants import ERROR_MESSAGES
@@ -148,24 +159,117 @@ app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE = (
app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD = (
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD
)
app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
)
app.state.MODELS = {}
origins = ["*"]
# Custom middleware to add security headers
# class SecurityHeadersMiddleware(BaseHTTPMiddleware):
# async def dispatch(self, request: Request, call_next):
# response: Response = await call_next(request)
# response.headers["Cross-Origin-Opener-Policy"] = "same-origin"
# response.headers["Cross-Origin-Embedder-Policy"] = "require-corp"
# return response
async def get_function_call_response(messages, tool_id, template, task_model_id, user):
tool = Tools.get_tool_by_id(tool_id)
tools_specs = json.dumps(tool.specs, indent=2)
content = tools_function_calling_generation_template(template, tools_specs)
user_message = get_last_user_message(messages)
prompt = (
"History:\n"
+ "\n".join(
[
f"{message['role'].upper()}: \"\"\"{message['content']}\"\"\""
for message in messages[::-1][:4]
]
)
+ f"\nQuery: {user_message}"
)
print(prompt)
payload = {
"model": task_model_id,
"messages": [
{"role": "system", "content": content},
{"role": "user", "content": f"Query: {prompt}"},
],
"stream": False,
}
payload = filter_pipeline(payload, user)
model = app.state.MODELS[task_model_id]
response = None
try:
if model["owned_by"] == "ollama":
response = await generate_ollama_chat_completion(
OpenAIChatCompletionForm(**payload), user=user
)
else:
response = await generate_openai_chat_completion(payload, user=user)
content = None
if hasattr(response, "body_iterator"):
async for chunk in response.body_iterator:
data = json.loads(chunk.decode("utf-8"))
content = data["choices"][0]["message"]["content"]
# Cleanup any remaining background tasks if necessary
if response.background is not None:
await response.background()
else:
content = response["choices"][0]["message"]["content"]
# Parse the function response
if content is not None:
print(f"content: {content}")
result = json.loads(content)
print(result)
# Call the function
if "name" in result:
if tool_id in webui_app.state.TOOLS:
toolkit_module = webui_app.state.TOOLS[tool_id]
else:
toolkit_module = load_toolkit_module_by_id(tool_id)
webui_app.state.TOOLS[tool_id] = toolkit_module
function = getattr(toolkit_module, result["name"])
function_result = None
try:
# Get the signature of the function
sig = inspect.signature(function)
# Check if '__user__' is a parameter of the function
if "__user__" in sig.parameters:
# Call the function with the '__user__' parameter included
function_result = function(
**{
**result["parameters"],
"__user__": {
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
},
}
)
else:
# Call the function without modifying the parameters
function_result = function(**result["parameters"])
except Exception as e:
print(e)
# Add the function result to the system prompt
if function_result:
return function_result
except Exception as e:
print(f"Error: {e}")
return None
# app.add_middleware(SecurityHeadersMiddleware)
class RAGMiddleware(BaseHTTPMiddleware):
class ChatCompletionMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
return_citations = False
@@ -182,35 +286,95 @@ class RAGMiddleware(BaseHTTPMiddleware):
# Parse string to JSON
data = json.loads(body_str) if body_str else {}
user = get_current_user(
get_http_authorization_cred(request.headers.get("Authorization"))
)
# Remove the citations from the body
return_citations = data.get("citations", False)
if "citations" in data:
del data["citations"]
# Example: Add a new key-value pair or modify existing ones
# data["modified"] = True # Example modification
# Set the task model
task_model_id = data["model"]
if task_model_id not in app.state.MODELS:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Model not found",
)
# Check if the user has a custom task model
# If the user has a custom task model, use that model
if app.state.MODELS[task_model_id]["owned_by"] == "ollama":
if (
app.state.config.TASK_MODEL
and app.state.config.TASK_MODEL in app.state.MODELS
):
task_model_id = app.state.config.TASK_MODEL
else:
if (
app.state.config.TASK_MODEL_EXTERNAL
and app.state.config.TASK_MODEL_EXTERNAL in app.state.MODELS
):
task_model_id = app.state.config.TASK_MODEL_EXTERNAL
prompt = get_last_user_message(data["messages"])
context = ""
# If tool_ids field is present, call the functions
if "tool_ids" in data:
print(data["tool_ids"])
for tool_id in data["tool_ids"]:
print(tool_id)
response = await get_function_call_response(
messages=data["messages"],
tool_id=tool_id,
template=app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
task_model_id=task_model_id,
user=user,
)
if response:
context += ("\n" if context != "" else "") + response
del data["tool_ids"]
print(f"tool_context: {context}")
# If docs field is present, generate RAG completions
if "docs" in data:
data = {**data}
data["messages"], citations = rag_messages(
rag_context, citations = get_rag_context(
docs=data["docs"],
messages=data["messages"],
template=rag_app.state.config.RAG_TEMPLATE,
embedding_function=rag_app.state.EMBEDDING_FUNCTION,
k=rag_app.state.config.TOP_K,
reranking_function=rag_app.state.sentence_transformer_rf,
r=rag_app.state.config.RELEVANCE_THRESHOLD,
hybrid_search=rag_app.state.config.ENABLE_RAG_HYBRID_SEARCH,
)
if rag_context:
context += ("\n" if context != "" else "") + rag_context
del data["docs"]
log.debug(
f"data['messages']: {data['messages']}, citations: {citations}"
log.debug(f"rag_context: {rag_context}, citations: {citations}")
if context != "":
system_prompt = rag_template(
rag_app.state.config.RAG_TEMPLATE, context, prompt
)
print(system_prompt)
data["messages"] = add_or_update_system_message(
f"\n{system_prompt}", data["messages"]
)
modified_body_bytes = json.dumps(data).encode("utf-8")
# Replace the request body with the modified one
request._body = modified_body_bytes
# Set custom header to ensure content-length matches new body length
request.headers.__dict__["_list"] = [
(b"content-length", str(len(modified_body_bytes)).encode("utf-8")),
@@ -253,7 +417,7 @@ class RAGMiddleware(BaseHTTPMiddleware):
yield data
app.add_middleware(RAGMiddleware)
app.add_middleware(ChatCompletionMiddleware)
def filter_pipeline(payload, user):
@@ -515,6 +679,7 @@ async def get_task_config(user=Depends(get_verified_user)):
"TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD": app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD,
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
}
@@ -524,6 +689,7 @@ class TaskConfigForm(BaseModel):
TITLE_GENERATION_PROMPT_TEMPLATE: str
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE: str
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD: int
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: str
@app.post("/api/task/config/update")
@@ -539,6 +705,9 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD = (
form_data.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD
)
app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
form_data.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
)
return {
"TASK_MODEL": app.state.config.TASK_MODEL,
@@ -546,6 +715,7 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
"TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD": app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD,
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
}
@@ -659,6 +829,38 @@ async def generate_search_query(form_data: dict, user=Depends(get_verified_user)
return await generate_openai_chat_completion(payload, user=user)
@app.post("/api/task/tools/completions")
async def get_tools_function_calling(form_data: dict, user=Depends(get_verified_user)):
print("get_tools_function_calling")
model_id = form_data["model"]
if model_id not in app.state.MODELS:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Model not found",
)
# Check if the user has a custom task model
# If the user has a custom task model, use that model
if app.state.MODELS[model_id]["owned_by"] == "ollama":
if app.state.config.TASK_MODEL:
task_model_id = app.state.config.TASK_MODEL
if task_model_id in app.state.MODELS:
model_id = task_model_id
else:
if app.state.config.TASK_MODEL_EXTERNAL:
task_model_id = app.state.config.TASK_MODEL_EXTERNAL
if task_model_id in app.state.MODELS:
model_id = task_model_id
print(model_id)
template = app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
return await get_function_call_response(
form_data["messages"], form_data["tool_id"], template, model_id, user
)
@app.post("/api/chat/completions")
async def generate_chat_completions(form_data: dict, user=Depends(get_verified_user)):
model_id = form_data["model"]
+2 -1
View File
@@ -59,4 +59,5 @@ youtube-transcript-api==0.6.2
pytube==15.0.0
extract_msg
pydub
pydub
duckduckgo-search~=6.1.5
+2 -1
View File
@@ -8,6 +8,7 @@ cd /d "%SCRIPT_DIR%" || exit /b
SET "KEY_FILE=.webui_secret_key"
IF "%PORT%"=="" SET PORT=8080
IF "%HOST%"=="" SET HOST=0.0.0.0
SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%"
SET "WEBUI_JWT_SECRET_KEY=%WEBUI_JWT_SECRET_KEY%"
@@ -29,4 +30,4 @@ IF "%WEBUI_SECRET_KEY%%WEBUI_JWT_SECRET_KEY%" == " " (
:: Execute uvicorn
SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%"
uvicorn main:app --host 0.0.0.0 --port "%PORT%" --forwarded-allow-ips '*'
uvicorn main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*'
+5
View File
@@ -110,3 +110,8 @@ def search_query_generation_template(
),
)
return template
def tools_function_calling_generation_template(template: str, tools_specs: str) -> str:
template = template.replace("{{TOOLS}}", tools_specs)
return template
+73
View File
@@ -0,0 +1,73 @@
import inspect
from typing import get_type_hints, List, Dict, Any
def doc_to_dict(docstring):
lines = docstring.split("\n")
description = lines[1].strip()
param_dict = {}
for line in lines:
if ":param" in line:
line = line.replace(":param", "").strip()
param, desc = line.split(":", 1)
param_dict[param.strip()] = desc.strip()
ret_dict = {"description": description, "params": param_dict}
return ret_dict
def get_tools_specs(tools) -> List[dict]:
function_list = [
{"name": func, "function": getattr(tools, func)}
for func in dir(tools)
if callable(getattr(tools, func)) and not func.startswith("__")
]
specs = []
for function_item in function_list:
function_name = function_item["name"]
function = function_item["function"]
function_doc = doc_to_dict(function.__doc__ or function_name)
specs.append(
{
"name": function_name,
# TODO: multi-line desc?
"description": function_doc.get("description", function_name),
"parameters": {
"type": "object",
"properties": {
param_name: {
"type": param_annotation.__name__.lower(),
**(
{
"enum": (
str(param_annotation.__args__)
if hasattr(param_annotation, "__args__")
else None
)
}
if hasattr(param_annotation, "__args__")
else {}
),
"description": function_doc.get("params", {}).get(
param_name, param_name
),
}
for param_name, param_annotation in get_type_hints(
function
).items()
if param_name != "return" and param_name != "__user__"
},
"required": [
name
for name, param in inspect.signature(
function
).parameters.items()
if param.default is param.empty
],
},
}
)
return specs
-21
View File
@@ -28,19 +28,6 @@ describe('Settings', () => {
});
});
context('Connections', () => {
it('user can open the Connections modal and hit save', () => {
cy.get('button').contains('Connections').click();
cy.get('button').contains('Save').click();
});
});
context('Models', () => {
it('user can open the Models modal', () => {
cy.get('button').contains('Models').click();
});
});
context('Interface', () => {
it('user can open the Interface modal and hit save', () => {
cy.get('button').contains('Interface').click();
@@ -55,14 +42,6 @@ describe('Settings', () => {
});
});
context('Images', () => {
it('user can open the Images modal and hit save', () => {
cy.get('button').contains('Images').click();
// Currently fails because the backend requires a valid URL
// cy.get('button').contains('Save').click();
});
});
context('Chats', () => {
it('user can open the Chats modal', () => {
cy.get('button').contains('Chats').click();
+196 -9
View File
@@ -1,17 +1,21 @@
{
"name": "open-webui",
"version": "0.3.1",
"version": "0.3.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "open-webui",
"version": "0.3.1",
"version": "0.3.4",
"dependencies": {
"@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-python": "^6.1.6",
"@codemirror/theme-one-dark": "^6.1.2",
"@pyscript/core": "^0.4.32",
"@sveltejs/adapter-node": "^1.3.1",
"async": "^3.2.5",
"bits-ui": "^0.19.7",
"codemirror": "^6.0.1",
"dayjs": "^1.11.10",
"eventsource-parser": "^1.1.2",
"file-saver": "^2.0.5",
@@ -108,6 +112,119 @@
"resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz",
"integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A=="
},
"node_modules/@codemirror/autocomplete": {
"version": "6.16.2",
"resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.2.tgz",
"integrity": "sha512-MjfDrHy0gHKlPWsvSsikhO1+BOh+eBHNgfH1OXs1+DAf30IonQldgMM3kxLDTG9ktE7kDLaA1j/l7KMPA4KNfw==",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.17.0",
"@lezer/common": "^1.0.0"
},
"peerDependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0",
"@lezer/common": "^1.0.0"
}
},
"node_modules/@codemirror/commands": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.0.tgz",
"integrity": "sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.4.0",
"@codemirror/view": "^6.27.0",
"@lezer/common": "^1.1.0"
}
},
"node_modules/@codemirror/lang-javascript": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz",
"integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/language": "^6.6.0",
"@codemirror/lint": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.17.0",
"@lezer/common": "^1.0.0",
"@lezer/javascript": "^1.0.0"
}
},
"node_modules/@codemirror/lang-python": {
"version": "6.1.6",
"resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.1.6.tgz",
"integrity": "sha512-ai+01WfZhWqM92UqjnvorkxosZ2aq2u28kHvr+N3gu012XqY2CThD67JPMHnGceRfXPDBmn1HnyqowdpF57bNg==",
"dependencies": {
"@codemirror/autocomplete": "^6.3.2",
"@codemirror/language": "^6.8.0",
"@codemirror/state": "^6.0.0",
"@lezer/common": "^1.2.1",
"@lezer/python": "^1.1.4"
}
},
"node_modules/@codemirror/language": {
"version": "6.10.2",
"resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
"integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
"dependencies": {
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.23.0",
"@lezer/common": "^1.1.0",
"@lezer/highlight": "^1.0.0",
"@lezer/lr": "^1.0.0",
"style-mod": "^4.0.0"
}
},
"node_modules/@codemirror/lint": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.0.tgz",
"integrity": "sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==",
"dependencies": {
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0",
"crelt": "^1.0.5"
}
},
"node_modules/@codemirror/search": {
"version": "6.5.6",
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz",
"integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==",
"dependencies": {
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0",
"crelt": "^1.0.5"
}
},
"node_modules/@codemirror/state": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
"integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A=="
},
"node_modules/@codemirror/theme-one-dark": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz",
"integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0",
"@lezer/highlight": "^1.0.0"
}
},
"node_modules/@codemirror/view": {
"version": "6.28.0",
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.0.tgz",
"integrity": "sha512-fo7CelaUDKWIyemw4b+J57cWuRkOu4SWCCPfNDkPvfWkGjM9D5racHQXr4EQeYCD6zEBIBxGCeaKkQo+ysl0gA==",
"dependencies": {
"@codemirror/state": "^6.4.0",
"style-mod": "^4.1.0",
"w3c-keyname": "^2.2.4"
}
},
"node_modules/@colors/colors": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
@@ -825,6 +942,47 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@lezer/common": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
"integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ=="
},
"node_modules/@lezer/highlight": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz",
"integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==",
"dependencies": {
"@lezer/common": "^1.0.0"
}
},
"node_modules/@lezer/javascript": {
"version": "1.4.16",
"resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.16.tgz",
"integrity": "sha512-84UXR3N7s11MPQHWgMnjb9571fr19MmXnr5zTv2XX0gHXXUvW3uPJ8GCjKrfTXmSdfktjRK0ayKklw+A13rk4g==",
"dependencies": {
"@lezer/common": "^1.2.0",
"@lezer/highlight": "^1.1.3",
"@lezer/lr": "^1.3.0"
}
},
"node_modules/@lezer/lr": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz",
"integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==",
"dependencies": {
"@lezer/common": "^1.0.0"
}
},
"node_modules/@lezer/python": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.14.tgz",
"integrity": "sha512-ykDOb2Ti24n76PJsSa4ZoDF0zH12BSw1LGfQXCYJhJyOGiFTfGaX0Du66Ze72R+u/P35U+O6I9m8TFXov1JzsA==",
"dependencies": {
"@lezer/common": "^1.2.0",
"@lezer/highlight": "^1.0.0",
"@lezer/lr": "^1.0.0"
}
},
"node_modules/@melt-ui/svelte": {
"version": "0.76.0",
"resolved": "https://registry.npmjs.org/@melt-ui/svelte/-/svelte-0.76.0.tgz",
@@ -2224,12 +2382,12 @@
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"dependencies": {
"fill-range": "^7.0.1"
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
@@ -2769,6 +2927,20 @@
"plain-tag": "^0.1.3"
}
},
"node_modules/codemirror": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
"integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/commands": "^6.0.0",
"@codemirror/language": "^6.0.0",
"@codemirror/lint": "^6.0.0",
"@codemirror/search": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0"
}
},
"node_modules/coincident": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/coincident/-/coincident-1.2.3.tgz",
@@ -2891,6 +3063,11 @@
"layout-base": "^1.0.0"
}
},
"node_modules/crelt": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -4429,9 +4606,9 @@
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -8278,6 +8455,11 @@
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/style-mod": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
"integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="
},
"node_modules/stylis": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
@@ -10022,6 +10204,11 @@
"he": "^1.2.0"
}
},
"node_modules/w3c-keyname": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
"integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
},
"node_modules/walk-sync": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz",
+7 -3
View File
@@ -1,6 +1,6 @@
{
"name": "open-webui",
"version": "0.3.1",
"version": "0.3.4",
"private": true,
"scripts": {
"dev": "npm run pyodide:fetch && vite dev --host",
@@ -16,7 +16,7 @@
"format:backend": "black . --exclude \".venv/|/venv/\"",
"i18n:parse": "i18next --config i18next-parser.config.ts && prettier --write \"src/lib/i18n/**/*.{js,json}\"",
"cy:open": "cypress open",
"test:frontend": "vitest",
"test:frontend": "vitest --passWithNoTests",
"pyodide:fetch": "node scripts/prepare-pyodide.js"
},
"devDependencies": {
@@ -48,10 +48,14 @@
},
"type": "module",
"dependencies": {
"@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-python": "^6.1.6",
"@codemirror/theme-one-dark": "^6.1.2",
"@pyscript/core": "^0.4.32",
"@sveltejs/adapter-node": "^1.3.1",
"async": "^3.2.5",
"bits-ui": "^0.19.7",
"codemirror": "^6.0.1",
"dayjs": "^1.11.10",
"eventsource-parser": "^1.1.2",
"file-saver": "^2.0.5",
@@ -71,4 +75,4 @@
"tippy.js": "^6.3.7",
"uuid": "^9.0.1"
}
}
}
+4 -2
View File
@@ -26,8 +26,6 @@ dependencies = [
"PyMySQL==1.1.0",
"bcrypt==4.1.3",
"litellm[proxy]==1.37.20",
"boto3==1.34.110",
"argon2-cffi==23.1.0",
@@ -66,6 +64,10 @@ dependencies = [
"langfuse==2.33.0",
"youtube-transcript-api==0.6.2",
"pytube==15.0.0",
"extract_msg",
"pydub",
"duckduckgo-search~=6.1.5"
]
readme = "README.md"
requires-python = ">= 3.11, < 3.12.0a1"
+40 -48
View File
@@ -12,7 +12,6 @@
aiohttp==3.9.5
# via langchain
# via langchain-community
# via litellm
# via open-webui
aiosignal==1.3.1
# via aiohttp
@@ -20,11 +19,9 @@ annotated-types==0.6.0
# via pydantic
anyio==4.3.0
# via httpx
# via openai
# via starlette
# via watchfiles
apscheduler==3.10.4
# via litellm
# via open-webui
argon2-cffi==23.1.0
# via open-webui
@@ -38,7 +35,6 @@ av==11.0.0
# via faster-whisper
backoff==2.2.1
# via langfuse
# via litellm
# via posthog
# via unstructured
bcrypt==4.1.3
@@ -46,6 +42,7 @@ bcrypt==4.1.3
# via open-webui
# via passlib
beautifulsoup4==4.12.3
# via extract-msg
# via unstructured
bidict==0.23.1
# via python-socketio
@@ -83,17 +80,20 @@ chromadb==0.5.0
# via open-webui
click==8.1.7
# via black
# via duckduckgo-search
# via flask
# via litellm
# via nltk
# via peewee-migrate
# via rq
# via typer
# via uvicorn
colorclass==2.2.2
# via oletools
coloredlogs==15.0.1
# via onnxruntime
compressed-rtf==1.0.6
# via extract-msg
cryptography==42.0.7
# via litellm
# via msoffcrypto-tool
# via pyjwt
ctranslate2==4.2.1
# via faster-whisper
@@ -109,33 +109,34 @@ defusedxml==0.7.1
deprecated==1.2.14
# via opentelemetry-api
# via opentelemetry-exporter-otlp-proto-grpc
distro==1.9.0
# via openai
dnspython==2.6.1
# via email-validator
docx2txt==0.8
# via open-webui
duckduckgo-search==6.1.5
# via open-webui
easygui==0.98.3
# via oletools
ebcdic==1.1.1
# via extract-msg
ecdsa==0.19.0
# via python-jose
email-validator==2.1.1
# via fastapi
# via pydantic
emoji==2.11.1
# via unstructured
et-xmlfile==1.1.0
# via openpyxl
extract-msg==0.48.5
# via open-webui
fake-useragent==1.5.1
# via open-webui
fastapi==0.111.0
# via chromadb
# via fastapi-sso
# via langchain-chroma
# via litellm
# via open-webui
fastapi-cli==0.0.4
# via fastapi
fastapi-sso==0.10.0
# via litellm
faster-whisper==1.0.2
# via open-webui
filelock==3.14.0
@@ -191,8 +192,6 @@ grpcio==1.63.0
# via opentelemetry-exporter-otlp-proto-grpc
grpcio-status==1.62.2
# via google-api-core
gunicorn==22.0.0
# via litellm
h11==0.14.0
# via httpcore
# via uvicorn
@@ -206,9 +205,7 @@ httptools==0.6.1
# via uvicorn
httpx==0.27.0
# via fastapi
# via fastapi-sso
# via langfuse
# via openai
huggingface-hub==0.23.0
# via faster-whisper
# via sentence-transformers
@@ -225,7 +222,6 @@ idna==3.7
# via unstructured-client
# via yarl
importlib-metadata==7.0.0
# via litellm
# via opentelemetry-api
importlib-resources==6.4.0
# via chromadb
@@ -234,7 +230,6 @@ itsdangerous==2.2.0
jinja2==3.1.4
# via fastapi
# via flask
# via litellm
# via torch
jmespath==1.0.1
# via boto3
@@ -272,8 +267,8 @@ langsmith==0.1.57
# via langchain
# via langchain-community
# via langchain-core
litellm==1.37.20
# via open-webui
lark==1.1.8
# via rtfde
lxml==5.2.2
# via unstructured
markdown==3.6
@@ -294,6 +289,8 @@ monotonic==1.6
# via posthog
mpmath==1.3.0
# via sympy
msoffcrypto-tool==5.4.1
# via oletools
multidict==6.0.5
# via aiohttp
# via yarl
@@ -325,15 +322,19 @@ numpy==1.26.4
# via transformers
# via unstructured
oauthlib==3.2.2
# via fastapi-sso
# via kubernetes
# via requests-oauthlib
olefile==0.47
# via extract-msg
# via msoffcrypto-tool
# via oletools
oletools==0.60.1
# via pcodedmp
# via rtfde
onnxruntime==1.17.3
# via chromadb
# via faster-whisper
# via rapidocr-onnxruntime
openai==1.28.1
# via litellm
opencv-python==4.9.0.80
# via rapidocr-onnxruntime
opencv-python-headless==4.9.0.80
@@ -375,15 +376,14 @@ ordered-set==4.1.0
# via deepdiff
orjson==3.10.3
# via chromadb
# via duckduckgo-search
# via fastapi
# via langsmith
# via litellm
overrides==7.7.0
# via chromadb
packaging==23.2
# via black
# via build
# via gunicorn
# via huggingface-hub
# via langchain-core
# via langfuse
@@ -397,6 +397,8 @@ passlib==1.7.4
# via open-webui
pathspec==0.12.1
# via black
pcodedmp==1.2.6
# via oletools
peewee==3.17.5
# via open-webui
# via peewee-migrate
@@ -437,27 +439,27 @@ pycparser==2.22
pydantic==2.7.1
# via chromadb
# via fastapi
# via fastapi-sso
# via google-generativeai
# via langchain
# via langchain-core
# via langfuse
# via langsmith
# via open-webui
# via openai
pydantic-core==2.18.2
# via pydantic
pydub==0.25.1
# via open-webui
pygments==2.18.0
# via rich
pyjwt==2.8.0
# via litellm
# via open-webui
pymysql==1.1.0
# via open-webui
pypandoc==1.13
# via open-webui
pyparsing==3.1.2
pyparsing==2.4.7
# via httplib2
# via oletools
pypdf==4.2.0
# via open-webui
# via unstructured-client
@@ -465,6 +467,8 @@ pypika==0.48.9
# via chromadb
pyproject-hooks==1.1.0
# via build
pyreqwest-impersonate==0.4.7
# via duckduckgo-search
python-dateutil==2.9.0.post0
# via botocore
# via kubernetes
@@ -472,7 +476,6 @@ python-dateutil==2.9.0.post0
# via posthog
# via unstructured-client
python-dotenv==1.0.1
# via litellm
# via uvicorn
python-engineio==4.9.0
# via python-socketio
@@ -484,7 +487,6 @@ python-magic==0.4.27
# via unstructured
python-multipart==0.0.9
# via fastapi
# via litellm
# via open-webui
python-socketio==5.11.2
# via open-webui
@@ -503,7 +505,6 @@ pyyaml==6.0.1
# via langchain
# via langchain-community
# via langchain-core
# via litellm
# via rapidocr-onnxruntime
# via transformers
# via uvicorn
@@ -513,11 +514,10 @@ rapidfuzz==3.9.0
# via unstructured
rapidocr-onnxruntime==1.3.22
# via open-webui
redis==5.0.4
# via rq
red-black-tree-mod==1.20
# via extract-msg
regex==2024.5.10
# via nltk
# via tiktoken
# via transformers
requests==2.32.2
# via chromadb
@@ -527,11 +527,9 @@ requests==2.32.2
# via langchain
# via langchain-community
# via langsmith
# via litellm
# via open-webui
# via posthog
# via requests-oauthlib
# via tiktoken
# via transformers
# via unstructured
# via unstructured-client
@@ -540,11 +538,11 @@ requests-oauthlib==2.0.0
# via kubernetes
rich==13.7.1
# via typer
rq==1.16.2
# via litellm
rsa==4.9
# via google-auth
# via python-jose
rtfde==0.1.1
# via extract-msg
s3transfer==0.10.1
# via boto3
safetensors==0.4.3
@@ -577,7 +575,6 @@ six==1.16.0
sniffio==1.3.1
# via anyio
# via httpx
# via openai
soupsieve==2.5
# via beautifulsoup4
sqlalchemy==2.0.30
@@ -597,12 +594,9 @@ tenacity==8.3.0
# via langchain-core
threadpoolctl==3.5.0
# via scikit-learn
tiktoken==0.6.0
# via litellm
tokenizers==0.15.2
# via chromadb
# via faster-whisper
# via litellm
# via transformers
torch==2.3.0
# via sentence-transformers
@@ -611,7 +605,6 @@ tqdm==4.66.4
# via google-generativeai
# via huggingface-hub
# via nltk
# via openai
# via sentence-transformers
# via transformers
transformers==4.39.3
@@ -624,7 +617,6 @@ typing-extensions==4.11.0
# via fastapi
# via google-generativeai
# via huggingface-hub
# via openai
# via opentelemetry-sdk
# via pydantic
# via pydantic-core
@@ -641,6 +633,7 @@ tzdata==2024.1
# via pandas
tzlocal==5.2
# via apscheduler
# via extract-msg
ujson==5.10.0
# via fastapi
unstructured==0.14.0
@@ -657,7 +650,6 @@ urllib3==2.2.1
uvicorn==0.22.0
# via chromadb
# via fastapi
# via litellm
# via open-webui
uvloop==0.19.0
# via uvicorn
+40 -48
View File
@@ -12,7 +12,6 @@
aiohttp==3.9.5
# via langchain
# via langchain-community
# via litellm
# via open-webui
aiosignal==1.3.1
# via aiohttp
@@ -20,11 +19,9 @@ annotated-types==0.6.0
# via pydantic
anyio==4.3.0
# via httpx
# via openai
# via starlette
# via watchfiles
apscheduler==3.10.4
# via litellm
# via open-webui
argon2-cffi==23.1.0
# via open-webui
@@ -38,7 +35,6 @@ av==11.0.0
# via faster-whisper
backoff==2.2.1
# via langfuse
# via litellm
# via posthog
# via unstructured
bcrypt==4.1.3
@@ -46,6 +42,7 @@ bcrypt==4.1.3
# via open-webui
# via passlib
beautifulsoup4==4.12.3
# via extract-msg
# via unstructured
bidict==0.23.1
# via python-socketio
@@ -83,17 +80,20 @@ chromadb==0.5.0
# via open-webui
click==8.1.7
# via black
# via duckduckgo-search
# via flask
# via litellm
# via nltk
# via peewee-migrate
# via rq
# via typer
# via uvicorn
colorclass==2.2.2
# via oletools
coloredlogs==15.0.1
# via onnxruntime
compressed-rtf==1.0.6
# via extract-msg
cryptography==42.0.7
# via litellm
# via msoffcrypto-tool
# via pyjwt
ctranslate2==4.2.1
# via faster-whisper
@@ -109,33 +109,34 @@ defusedxml==0.7.1
deprecated==1.2.14
# via opentelemetry-api
# via opentelemetry-exporter-otlp-proto-grpc
distro==1.9.0
# via openai
dnspython==2.6.1
# via email-validator
docx2txt==0.8
# via open-webui
duckduckgo-search==6.1.5
# via open-webui
easygui==0.98.3
# via oletools
ebcdic==1.1.1
# via extract-msg
ecdsa==0.19.0
# via python-jose
email-validator==2.1.1
# via fastapi
# via pydantic
emoji==2.11.1
# via unstructured
et-xmlfile==1.1.0
# via openpyxl
extract-msg==0.48.5
# via open-webui
fake-useragent==1.5.1
# via open-webui
fastapi==0.111.0
# via chromadb
# via fastapi-sso
# via langchain-chroma
# via litellm
# via open-webui
fastapi-cli==0.0.4
# via fastapi
fastapi-sso==0.10.0
# via litellm
faster-whisper==1.0.2
# via open-webui
filelock==3.14.0
@@ -191,8 +192,6 @@ grpcio==1.63.0
# via opentelemetry-exporter-otlp-proto-grpc
grpcio-status==1.62.2
# via google-api-core
gunicorn==22.0.0
# via litellm
h11==0.14.0
# via httpcore
# via uvicorn
@@ -206,9 +205,7 @@ httptools==0.6.1
# via uvicorn
httpx==0.27.0
# via fastapi
# via fastapi-sso
# via langfuse
# via openai
huggingface-hub==0.23.0
# via faster-whisper
# via sentence-transformers
@@ -225,7 +222,6 @@ idna==3.7
# via unstructured-client
# via yarl
importlib-metadata==7.0.0
# via litellm
# via opentelemetry-api
importlib-resources==6.4.0
# via chromadb
@@ -234,7 +230,6 @@ itsdangerous==2.2.0
jinja2==3.1.4
# via fastapi
# via flask
# via litellm
# via torch
jmespath==1.0.1
# via boto3
@@ -272,8 +267,8 @@ langsmith==0.1.57
# via langchain
# via langchain-community
# via langchain-core
litellm==1.37.20
# via open-webui
lark==1.1.8
# via rtfde
lxml==5.2.2
# via unstructured
markdown==3.6
@@ -294,6 +289,8 @@ monotonic==1.6
# via posthog
mpmath==1.3.0
# via sympy
msoffcrypto-tool==5.4.1
# via oletools
multidict==6.0.5
# via aiohttp
# via yarl
@@ -325,15 +322,19 @@ numpy==1.26.4
# via transformers
# via unstructured
oauthlib==3.2.2
# via fastapi-sso
# via kubernetes
# via requests-oauthlib
olefile==0.47
# via extract-msg
# via msoffcrypto-tool
# via oletools
oletools==0.60.1
# via pcodedmp
# via rtfde
onnxruntime==1.17.3
# via chromadb
# via faster-whisper
# via rapidocr-onnxruntime
openai==1.28.1
# via litellm
opencv-python==4.9.0.80
# via rapidocr-onnxruntime
opencv-python-headless==4.9.0.80
@@ -375,15 +376,14 @@ ordered-set==4.1.0
# via deepdiff
orjson==3.10.3
# via chromadb
# via duckduckgo-search
# via fastapi
# via langsmith
# via litellm
overrides==7.7.0
# via chromadb
packaging==23.2
# via black
# via build
# via gunicorn
# via huggingface-hub
# via langchain-core
# via langfuse
@@ -397,6 +397,8 @@ passlib==1.7.4
# via open-webui
pathspec==0.12.1
# via black
pcodedmp==1.2.6
# via oletools
peewee==3.17.5
# via open-webui
# via peewee-migrate
@@ -437,27 +439,27 @@ pycparser==2.22
pydantic==2.7.1
# via chromadb
# via fastapi
# via fastapi-sso
# via google-generativeai
# via langchain
# via langchain-core
# via langfuse
# via langsmith
# via open-webui
# via openai
pydantic-core==2.18.2
# via pydantic
pydub==0.25.1
# via open-webui
pygments==2.18.0
# via rich
pyjwt==2.8.0
# via litellm
# via open-webui
pymysql==1.1.0
# via open-webui
pypandoc==1.13
# via open-webui
pyparsing==3.1.2
pyparsing==2.4.7
# via httplib2
# via oletools
pypdf==4.2.0
# via open-webui
# via unstructured-client
@@ -465,6 +467,8 @@ pypika==0.48.9
# via chromadb
pyproject-hooks==1.1.0
# via build
pyreqwest-impersonate==0.4.7
# via duckduckgo-search
python-dateutil==2.9.0.post0
# via botocore
# via kubernetes
@@ -472,7 +476,6 @@ python-dateutil==2.9.0.post0
# via posthog
# via unstructured-client
python-dotenv==1.0.1
# via litellm
# via uvicorn
python-engineio==4.9.0
# via python-socketio
@@ -484,7 +487,6 @@ python-magic==0.4.27
# via unstructured
python-multipart==0.0.9
# via fastapi
# via litellm
# via open-webui
python-socketio==5.11.2
# via open-webui
@@ -503,7 +505,6 @@ pyyaml==6.0.1
# via langchain
# via langchain-community
# via langchain-core
# via litellm
# via rapidocr-onnxruntime
# via transformers
# via uvicorn
@@ -513,11 +514,10 @@ rapidfuzz==3.9.0
# via unstructured
rapidocr-onnxruntime==1.3.22
# via open-webui
redis==5.0.4
# via rq
red-black-tree-mod==1.20
# via extract-msg
regex==2024.5.10
# via nltk
# via tiktoken
# via transformers
requests==2.32.2
# via chromadb
@@ -527,11 +527,9 @@ requests==2.32.2
# via langchain
# via langchain-community
# via langsmith
# via litellm
# via open-webui
# via posthog
# via requests-oauthlib
# via tiktoken
# via transformers
# via unstructured
# via unstructured-client
@@ -540,11 +538,11 @@ requests-oauthlib==2.0.0
# via kubernetes
rich==13.7.1
# via typer
rq==1.16.2
# via litellm
rsa==4.9
# via google-auth
# via python-jose
rtfde==0.1.1
# via extract-msg
s3transfer==0.10.1
# via boto3
safetensors==0.4.3
@@ -577,7 +575,6 @@ six==1.16.0
sniffio==1.3.1
# via anyio
# via httpx
# via openai
soupsieve==2.5
# via beautifulsoup4
sqlalchemy==2.0.30
@@ -597,12 +594,9 @@ tenacity==8.3.0
# via langchain-core
threadpoolctl==3.5.0
# via scikit-learn
tiktoken==0.6.0
# via litellm
tokenizers==0.15.2
# via chromadb
# via faster-whisper
# via litellm
# via transformers
torch==2.3.0
# via sentence-transformers
@@ -611,7 +605,6 @@ tqdm==4.66.4
# via google-generativeai
# via huggingface-hub
# via nltk
# via openai
# via sentence-transformers
# via transformers
transformers==4.39.3
@@ -624,7 +617,6 @@ typing-extensions==4.11.0
# via fastapi
# via google-generativeai
# via huggingface-hub
# via openai
# via opentelemetry-sdk
# via pydantic
# via pydantic-core
@@ -641,6 +633,7 @@ tzdata==2024.1
# via pandas
tzlocal==5.2
# via apscheduler
# via extract-msg
ujson==5.10.0
# via fastapi
unstructured==0.14.0
@@ -657,7 +650,6 @@ urllib3==2.2.1
uvicorn==0.22.0
# via chromadb
# via fastapi
# via litellm
# via open-webui
uvloop==0.19.0
# via uvicorn
+21
View File
@@ -92,10 +92,18 @@ select {
visibility: hidden;
}
.scrollbar-hidden::-webkit-scrollbar-corner {
display: none;
}
.scrollbar-none::-webkit-scrollbar {
display: none; /* for Chrome, Safari and Opera */
}
.scrollbar-none::-webkit-scrollbar-corner {
display: none;
}
.scrollbar-none {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
@@ -111,3 +119,16 @@ input::-webkit-inner-spin-button {
input[type='number'] {
-moz-appearance: textfield; /* Firefox */
}
.cm-editor {
height: 100%;
width: 100%;
}
.cm-scroller {
@apply scrollbar-hidden;
}
.cm-editor.cm-focused {
outline: none;
}
+106 -2
View File
@@ -32,6 +32,9 @@
} else if (localStorage.theme && localStorage.theme === 'system') {
systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches;
document.documentElement.classList.add(systemTheme ? 'dark' : 'light');
} else if (localStorage.theme && localStorage.theme === 'her') {
document.documentElement.classList.add('dark');
document.documentElement.classList.add('her');
} else {
document.documentElement.classList.add('dark');
}
@@ -68,17 +71,66 @@
</style>
<img
id="logo"
style="
position: absolute;
width: 6rem;
height: 6rem;
top: 46%;
top: 41%;
left: 50%;
margin: -40px 0 0 -40px;
margin-left: -3rem;
"
src="/logo.svg"
/>
<div
style="
position: absolute;
top: 33%;
left: 50%;
width: 24rem;
margin-left: -12rem;
display: flex;
flex-direction: column;
align-items: center;
"
>
<img
id="logo-her"
style="width: 13rem; height: 13rem"
src="/logo.svg"
class="animate-pulse-fast"
/>
<div style="position: relative; width: 24rem; margin-top: 0.5rem">
<div
id="progress-background"
style="
position: absolute;
width: 100%;
height: 0.75rem;
border-radius: 9999px;
background-color: #fafafa9a;
"
></div>
<div
id="progress-bar"
style="
position: absolute;
width: 0%;
height: 0.75rem;
border-radius: 9999px;
background-color: #fff;
"
class="bg-white"
></div>
</div>
</div>
<!-- <span style="position: absolute; bottom: 32px; left: 50%; margin: -36px 0 0 -36px">
Footer content
</span> -->
@@ -101,4 +153,56 @@
html.dark #splash-screen img {
filter: invert(1);
}
html.her #splash-screen {
background: #983724;
}
#logo-her {
display: none;
}
#progress-background {
display: none;
}
#progress-bar {
display: none;
}
html.her #logo {
display: none;
}
html.her #logo-her {
display: block;
filter: invert(1);
}
html.her #progress-background {
display: block;
}
html.her #progress-bar {
display: block;
}
@media (max-width: 24rem) {
html.her #progress-background {
display: none;
}
html.her #progress-bar {
display: none;
}
}
@keyframes pulse {
50% {
opacity: 0.65;
}
}
.animate-pulse-fast {
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
</style>
+193
View File
@@ -0,0 +1,193 @@
import { WEBUI_API_BASE_URL } from '$lib/constants';
export const createNewTool = async (token: string, tool: object) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/create`, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
authorization: `Bearer ${token}`
},
body: JSON.stringify({
...tool
})
})
.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 getTools = async (token: string = '') => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/`, {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.then((json) => {
return json;
})
.catch((err) => {
error = err.detail;
console.log(err);
return null;
});
if (error) {
throw error;
}
return res;
};
export const exportTools = async (token: string = '') => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/export`, {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.then((json) => {
return json;
})
.catch((err) => {
error = err.detail;
console.log(err);
return null;
});
if (error) {
throw error;
}
return res;
};
export const getToolById = async (token: string, id: string) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}`, {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.then((json) => {
return json;
})
.catch((err) => {
error = err.detail;
console.log(err);
return null;
});
if (error) {
throw error;
}
return res;
};
export const updateToolById = async (token: string, id: string, tool: object) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}/update`, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
authorization: `Bearer ${token}`
},
body: JSON.stringify({
...tool
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.then((json) => {
return json;
})
.catch((err) => {
error = err.detail;
console.log(err);
return null;
});
if (error) {
throw error;
}
return res;
};
export const deleteToolById = async (token: string, id: string) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}/delete`, {
method: 'DELETE',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.then((json) => {
return json;
})
.catch((err) => {
error = err.detail;
console.log(err);
return null;
});
if (error) {
throw error;
}
return res;
};
+33
View File
@@ -22,6 +22,39 @@ export const getGravatarUrl = async (email: string) => {
return res;
};
export const formatPythonCode = async (code: string) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/utils/code/format`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
code: code
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
error = err;
if (err.detail) {
error = err.detail;
}
return null;
});
if (error) {
throw error;
}
return res;
};
export const downloadChatAsPDF = async (chat: object) => {
let error = null;
@@ -166,6 +166,8 @@
chunk_size: chunkSize
}
});
await updateQuerySettings(localStorage.token, querySettings);
};
const setEmbeddingConfig = async () => {
@@ -11,7 +11,15 @@
export let saveHandler: Function;
let webConfig = null;
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
let webSearchEngines = [
'searxng',
'google_pse',
'brave',
'serpstack',
'serper',
'serply',
'duckduckgo'
];
let youtubeLanguage = 'en';
let youtubeTranslation = null;
@@ -188,6 +196,24 @@
</div>
</div>
</div>
{:else if webConfig.search.engine === 'serply'}
<div>
<div class=" self-center text-xs font-medium mb-1">
{$i18n.t('Serply API Key')}
</div>
<div class="flex w-full">
<div class="flex-1">
<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={$i18n.t('Enter Serply API Key')}
bind:value={webConfig.search.serply_api_key}
autocomplete="off"
/>
</div>
</div>
</div>
{/if}
</div>
{/if}
+117 -84
View File
@@ -24,7 +24,8 @@
banners,
user,
socket,
showCallOverlay
showCallOverlay,
tools
} from '$lib/stores';
import {
convertMessagesToHistory,
@@ -73,6 +74,10 @@
let selectedModels = [''];
let atSelectedModel: Model | undefined;
let selectedModelIds = [];
$: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels;
let selectedToolIds = [];
let webSearchEnabled = false;
let chat = null;
@@ -327,6 +332,9 @@
chatTextAreaElement.style.height = '';
}
const _files = JSON.parse(JSON.stringify(files));
files = [];
prompt = '';
// Create user message
@@ -338,7 +346,7 @@
role: 'user',
user: _user ?? undefined,
content: userPrompt,
files: files.length > 0 ? files : undefined,
files: _files.length > 0 ? _files : undefined,
timestamp: Math.floor(Date.now() / 1000), // Unix epoch
models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
};
@@ -355,32 +363,6 @@
// Wait until history/message have been updated
await tick();
// Create new chat if only one message in messages
if (messages.length == 1) {
if ($settings.saveChatHistory ?? true) {
chat = await createNewChat(localStorage.token, {
id: $chatId,
title: $i18n.t('New Chat'),
models: selectedModels,
system: $settings.system ?? undefined,
options: {
...($settings.params ?? {})
},
messages: messages,
history: history,
tags: [],
timestamp: Date.now()
});
await chats.set(await getChatList(localStorage.token));
await chatId.set(chat.id);
} else {
await chatId.set('local');
}
await tick();
}
files = [];
// Send prompt
_responses = await sendPrompt(userPrompt, userMessageId);
}
@@ -388,17 +370,80 @@
return _responses;
};
const sendPrompt = async (prompt, parentId, modelId = null) => {
const sendPrompt = async (prompt, parentId, modelId = null, newChat = true) => {
let _responses = [];
// If modelId is provided, use it, else use selected model
let selectedModelIds = modelId
? [modelId]
: atSelectedModel !== undefined
? [atSelectedModel.id]
: selectedModels;
// Create response messages for each selected model
const responseMessageIds = {};
for (const modelId of selectedModelIds) {
const model = $models.filter((m) => m.id === modelId).at(0);
if (model) {
let responseMessageId = uuidv4();
let responseMessage = {
parentId: parentId,
id: responseMessageId,
childrenIds: [],
role: 'assistant',
content: '',
model: model.id,
modelName: model.name ?? model.id,
userContext: null,
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
};
// Add message to history and Set currentId to messageId
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
// Append messageId to childrenIds of parent message
if (parentId !== null) {
history.messages[parentId].childrenIds = [
...history.messages[parentId].childrenIds,
responseMessageId
];
}
responseMessageIds[modelId] = responseMessageId;
}
}
await tick();
// Create new chat if only one message in messages
if (newChat && messages.length == 2) {
if ($settings.saveChatHistory ?? true) {
chat = await createNewChat(localStorage.token, {
id: $chatId,
title: $i18n.t('New Chat'),
models: selectedModels,
system: $settings.system ?? undefined,
options: {
...($settings.params ?? {})
},
messages: messages,
history: history,
tags: [],
timestamp: Date.now()
});
await chats.set(await getChatList(localStorage.token));
await chatId.set(chat.id);
} else {
await chatId.set('local');
}
await tick();
}
const _chatId = JSON.parse(JSON.stringify($chatId));
await Promise.all(
(modelId
? [modelId]
: atSelectedModel !== undefined
? [atSelectedModel.id]
: selectedModels
).map(async (modelId) => {
selectedModelIds.map(async (modelId) => {
console.log('modelId', modelId);
const model = $models.filter((m) => m.id === modelId).at(0);
@@ -416,33 +461,8 @@
);
}
// Create response message
let responseMessageId = uuidv4();
let responseMessage = {
parentId: parentId,
id: responseMessageId,
childrenIds: [],
role: 'assistant',
content: '',
model: model.id,
modelName: model.name ?? model.id,
userContext: null,
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
};
// Add message to history and Set currentId to messageId
history.messages[responseMessageId] = responseMessage;
history.currentId = responseMessageId;
// Append messageId to childrenIds of parent message
if (parentId !== null) {
history.messages[parentId].childrenIds = [
...history.messages[parentId].childrenIds,
responseMessageId
];
}
await tick();
let responseMessageId = responseMessageIds[modelId];
let responseMessage = history.messages[responseMessageId];
let userContext = null;
if ($settings?.memory ?? false) {
@@ -451,7 +471,6 @@
toast.error(error);
return null;
});
if (res) {
if (res.documents[0].length > 0) {
userContext = res.documents.reduce((acc, doc, index) => {
@@ -477,7 +496,6 @@
}
let _response = null;
if (model?.owned_by === 'openai') {
_response = await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
} else if (model) {
@@ -502,11 +520,13 @@
const getWebSearchResults = async (model: string, parentId: string, responseId: string) => {
const responseMessage = history.messages[responseId];
responseMessage.status = {
done: false,
action: 'web_search',
description: $i18n.t('Generating search query')
};
responseMessage.statusHistory = [
{
done: false,
action: 'web_search',
description: $i18n.t('Generating search query')
}
];
messages = messages;
const prompt = history.messages[parentId].content;
@@ -519,19 +539,21 @@
if (!searchQuery) {
toast.warning($i18n.t('No search query generated'));
responseMessage.status = {
...responseMessage.status,
responseMessage.statusHistory.push({
done: true,
error: true,
action: 'web_search',
description: 'No search query generated'
};
});
messages = messages;
}
responseMessage.status = {
...responseMessage.status,
description: $i18n.t("Searching the web for '{{searchQuery}}'", { searchQuery })
};
responseMessage.statusHistory.push({
done: false,
action: 'web_search',
description: $i18n.t(`Searching "{{searchQuery}}"`, { searchQuery })
});
messages = messages;
const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => {
@@ -542,12 +564,13 @@
});
if (results) {
responseMessage.status = {
...responseMessage.status,
responseMessage.statusHistory.push({
done: true,
action: 'web_search',
description: $i18n.t('Searched {{count}} sites', { count: results.filenames.length }),
query: searchQuery,
urls: results.filenames
};
});
if (responseMessage?.files ?? undefined === undefined) {
responseMessage.files = [];
@@ -562,12 +585,12 @@
messages = messages;
} else {
responseMessage.status = {
...responseMessage.status,
responseMessage.statusHistory.push({
done: true,
error: true,
action: 'web_search',
description: 'No search results found'
};
});
messages = messages;
}
};
@@ -669,6 +692,7 @@
},
format: $settings.requestFormat ?? undefined,
keep_alive: $settings.keepAlive ?? undefined,
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
docs: docs.length > 0 ? docs : undefined,
citations: docs.length > 0,
chat_id: $chatId
@@ -930,6 +954,7 @@
top_p: $settings?.params?.top_p ?? undefined,
frequency_penalty: $settings?.params?.frequency_penalty ?? undefined,
max_tokens: $settings?.params?.max_tokens ?? undefined,
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
docs: docs.length > 0 ? docs : undefined,
citations: docs.length > 0,
chat_id: $chatId
@@ -1098,9 +1123,9 @@
let userPrompt = userMessage.content;
if ((userMessage?.models ?? [...selectedModels]).length == 1) {
await sendPrompt(userPrompt, userMessage.id);
await sendPrompt(userPrompt, userMessage.id, undefined, false);
} else {
await sendPrompt(userPrompt, userMessage.id, message.model);
await sendPrompt(userPrompt, userMessage.id, message.model, false);
}
}
};
@@ -1256,8 +1281,16 @@
bind:files
bind:prompt
bind:autoScroll
bind:selectedToolIds
bind:webSearchEnabled
bind:atSelectedModel
availableToolIds={selectedModelIds.reduce((a, e, i, arr) => {
const model = $models.find((m) => m.id === e);
if (model?.info?.meta?.toolIds ?? false) {
return [...new Set([...a, ...model.info.meta.toolIds])];
}
return a;
}, [])}
{selectedModels}
{messages}
{submitPrompt}
+17 -1
View File
@@ -8,7 +8,9 @@
showSidebar,
models,
config,
showCallOverlay
showCallOverlay,
tools,
user as _user
} from '$lib/stores';
import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
@@ -29,6 +31,7 @@
import InputMenu from './MessageInput/InputMenu.svelte';
import Headphone from '../icons/Headphone.svelte';
import VoiceRecording from './MessageInput/VoiceRecording.svelte';
import { transcribeAudio } from '$lib/apis/audio';
const i18n = getContext('i18n');
@@ -57,6 +60,8 @@
export let files = [];
export let availableToolIds = [];
export let selectedToolIds = [];
export let webSearchEnabled = false;
export let prompt = '';
@@ -652,6 +657,17 @@
<div class=" ml-0.5 self-end mb-1.5 flex space-x-1">
<InputMenu
bind:webSearchEnabled
bind:selectedToolIds
tools={$tools.reduce((a, e, i, arr) => {
if (availableToolIds.includes(e.id) || ($_user?.role ?? 'user') === 'admin') {
a[e.id] = {
name: e.name,
description: e.meta.description,
enabled: false
};
}
return a;
}, {})}
uploadFilesHandler={() => {
filesInputElement.click();
}}
@@ -205,7 +205,7 @@
if (_responses.at(0)) {
const content = _responses[0];
if (content) {
if ((content ?? '').trim() !== '') {
assistantSpeakingHandler(content);
}
}
@@ -4,24 +4,33 @@
import { getContext } from 'svelte';
import Dropdown from '$lib/components/common/Dropdown.svelte';
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
import Pencil from '$lib/components/icons/Pencil.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Tags from '$lib/components/chat/Tags.svelte';
import Share from '$lib/components/icons/Share.svelte';
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
import DocumentArrowUpSolid from '$lib/components/icons/DocumentArrowUpSolid.svelte';
import Switch from '$lib/components/common/Switch.svelte';
import GlobeAltSolid from '$lib/components/icons/GlobeAltSolid.svelte';
import { config } from '$lib/stores';
import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte';
const i18n = getContext('i18n');
export let uploadFilesHandler: Function;
export let selectedToolIds: string[] = [];
export let webSearchEnabled: boolean;
export let tools = {};
export let onClose: Function;
$: tools = Object.fromEntries(
Object.keys(tools).map((toolId) => [
toolId,
{
...tools[toolId],
enabled: selectedToolIds.includes(toolId)
}
])
);
let show = false;
</script>
@@ -39,20 +48,48 @@
<div slot="content">
<DropdownMenu.Content
class="w-full max-w-[190px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
class="w-full max-w-[200px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
sideOffset={15}
alignOffset={-8}
side="top"
align="start"
transition={flyAndScale}
>
{#if Object.keys(tools).length > 0}
<div class=" max-h-28 overflow-y-auto scrollbar-hidden">
{#each Object.keys(tools) as toolId}
<div
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
>
<div class="flex-1 flex items-center gap-2">
<WrenchSolid />
<Tooltip content={tools[toolId]?.description ?? ''} className="flex-1">
<div class=" line-clamp-1">{tools[toolId].name}</div>
</Tooltip>
</div>
<Switch
bind:state={tools[toolId].enabled}
on:change={(e) => {
selectedToolIds = e.detail
? [...selectedToolIds, toolId]
: selectedToolIds.filter((id) => id !== toolId);
}}
/>
</div>
{/each}
</div>
<hr class="border-gray-100 dark:border-gray-800 my-1" />
{/if}
{#if $config?.features?.enable_web_search}
<div
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
>
<div class="flex-1 flex items-center gap-2">
<GlobeAltSolid />
<div class="flex items-center">{$i18n.t('Web Search')}</div>
<div class=" line-clamp-1">{$i18n.t('Web Search')}</div>
</div>
<Switch bind:state={webSearchEnabled} />
@@ -68,7 +105,7 @@
}}
>
<DocumentArrowUpSolid />
<div class="flex items-center">{$i18n.t('Upload Files')}</div>
<div class=" line-clamp-1">{$i18n.t('Upload Files')}</div>
</DropdownMenu.Item>
</DropdownMenu.Content>
</div>
+1 -1
View File
@@ -79,7 +79,7 @@
history.currentId = userMessageId;
await tick();
await sendPrompt(userPrompt, userMessageId);
await sendPrompt(userPrompt, userMessageId, undefined, false);
};
const updateChatMessages = async () => {
@@ -29,7 +29,7 @@
</script>
{#key mounted}
<div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-16">
<div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-10">
<div class="flex justify-start">
<div class="flex -space-x-4 mb-1" in:fade={{ duration: 200 }}>
{#each models as model, modelIdx}
@@ -85,7 +85,7 @@
</div>
{/if}
{:else}
<div class=" font-medium text-gray-400 dark:text-gray-500">
<div class=" font-medium text-gray-400 dark:text-gray-500 line-clamp-1">
{$i18n.t('How can I help you today?')}
</div>
{/if}
@@ -46,8 +46,8 @@
}
onMount(() => {
selectedReason = message.annotation.reason;
comment = message.annotation.comment;
selectedReason = message?.annotation?.reason ?? '';
comment = message?.annotation?.comment ?? '';
loadReasons();
});
@@ -211,93 +211,98 @@
speaking = null;
speakingIdx = null;
} else {
speaking = true;
if ((message?.content ?? '').trim() !== '') {
speaking = true;
if ($config.audio.tts.engine === 'openai') {
loadingSpeech = true;
if ($config.audio.tts.engine === 'openai') {
loadingSpeech = true;
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
const lastIndex = mergedTexts.length - 1;
if (lastIndex >= 0) {
const previousText = mergedTexts[lastIndex];
const wordCount = previousText.split(/\s+/).length;
if (wordCount < 2) {
mergedTexts[lastIndex] = previousText + ' ' + currentText;
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
const lastIndex = mergedTexts.length - 1;
if (lastIndex >= 0) {
const previousText = mergedTexts[lastIndex];
const wordCount = previousText.split(/\s+/).length;
if (wordCount < 2) {
mergedTexts[lastIndex] = previousText + ' ' + currentText;
} else {
mergedTexts.push(currentText);
}
} else {
mergedTexts.push(currentText);
}
} else {
mergedTexts.push(currentText);
return mergedTexts;
}, []);
console.log(sentences);
sentencesAudio = sentences.reduce((a, e, i, arr) => {
a[i] = null;
return a;
}, {});
let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
for (const [idx, sentence] of sentences.entries()) {
const res = await synthesizeOpenAISpeech(
localStorage.token,
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
sentence
).catch((error) => {
toast.error(error);
speaking = null;
loadingSpeech = false;
return null;
});
if (res) {
const blob = await res.blob();
const blobUrl = URL.createObjectURL(blob);
const audio = new Audio(blobUrl);
sentencesAudio[idx] = audio;
loadingSpeech = false;
lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
}
}
return mergedTexts;
}, []);
} else {
let voices = [];
const getVoicesLoop = setInterval(async () => {
voices = await speechSynthesis.getVoices();
if (voices.length > 0) {
clearInterval(getVoicesLoop);
console.log(sentences);
const voice =
voices
?.filter(
(v) =>
v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
)
?.at(0) ?? undefined;
sentencesAudio = sentences.reduce((a, e, i, arr) => {
a[i] = null;
return a;
}, {});
console.log(voice);
let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
const speak = new SpeechSynthesisUtterance(message.content);
for (const [idx, sentence] of sentences.entries()) {
const res = await synthesizeOpenAISpeech(
localStorage.token,
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
sentence
).catch((error) => {
toast.error(error);
console.log(speak);
speaking = null;
loadingSpeech = false;
speak.onend = () => {
speaking = null;
if ($settings.conversationMode) {
document.getElementById('voice-input-button')?.click();
}
};
return null;
});
if (voice) {
speak.voice = voice;
}
if (res) {
const blob = await res.blob();
const blobUrl = URL.createObjectURL(blob);
const audio = new Audio(blobUrl);
sentencesAudio[idx] = audio;
loadingSpeech = false;
lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
}
speechSynthesis.speak(speak);
}
}, 100);
}
} else {
let voices = [];
const getVoicesLoop = setInterval(async () => {
voices = await speechSynthesis.getVoices();
if (voices.length > 0) {
clearInterval(getVoicesLoop);
const voice =
voices
?.filter(
(v) => v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
)
?.at(0) ?? undefined;
console.log(voice);
const speak = new SpeechSynthesisUtterance(message.content);
console.log(speak);
speak.onend = () => {
speaking = null;
if ($settings.conversationMode) {
document.getElementById('voice-input-button')?.click();
}
};
if (voice) {
speak.voice = voice;
}
speechSynthesis.speak(speak);
}
}, 100);
toast.error('No content to speak');
}
}
};
@@ -415,26 +420,29 @@
class="prose chat-{message.role} w-full max-w-full dark:prose-invert prose-headings:my-0 prose-headings:-mb-4 prose-p:m-0 prose-p:-mb-6 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-img:my-0 prose-ul:-my-4 prose-ol:-my-4 prose-li:-my-3 prose-ul:-mb-6 prose-ol:-mb-8 prose-ol:p-0 prose-li:-mb-4 whitespace-pre-line"
>
<div>
{#if message?.status}
{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}
{@const status = (
message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]
).at(-1)}
<div class="flex items-center gap-2 pt-1 pb-1">
{#if message?.status?.done === false}
{#if status.done === false}
<div class="">
<Spinner className="size-4" />
</div>
{/if}
{#if message?.status?.action === 'web_search' && message?.status?.urls}
<WebSearchResults urls={message?.status?.urls}>
{#if status?.action === 'web_search' && status?.urls}
<WebSearchResults {status}>
<div class="flex flex-col justify-center -space-y-0.5">
<div class="text-base line-clamp-1 text-wrap">
{message.status.description}
{status?.description}
</div>
</div>
</WebSearchResults>
{:else}
<div class="flex flex-col justify-center -space-y-0.5">
<div class=" text-gray-500 dark:text-gray-500 text-base line-clamp-1 text-wrap">
{message.status.description}
{status?.description}
</div>
</div>
{/if}
@@ -868,8 +876,8 @@
<button
class="{isLastMessage
? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
?.annotation?.rating === 1
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
?.annotation?.rating ?? null) === 1
? 'bg-gray-100 dark:bg-gray-800'
: ''} dark:hover:text-white hover:text-black transition"
on:click={() => {
@@ -903,8 +911,8 @@
<button
class="{isLastMessage
? 'visible'
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
?.annotation?.rating === -1
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
?.annotation?.rating ?? null) === -1
? 'bg-gray-100 dark:bg-gray-800'
: ''} dark:hover:text-white hover:text-black transition"
on:click={() => {
@@ -974,6 +982,7 @@
? '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={() => {
showRateComment = false;
regenerateResponse(message);
}}
>
@@ -1,10 +1,11 @@
<script lang="ts">
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
import MagnifyingGlass from '$lib/components/icons/MagnifyingGlass.svelte';
import { Collapsible } from 'bits-ui';
import { slide } from 'svelte/transition';
export let urls = [];
export let status = { urls: [], query: '' };
let state = false;
</script>
@@ -27,11 +28,45 @@
class=" text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl"
transition={slide}
>
{#each urls as url, urlIdx}
{#if status?.query}
<a
href="https://www.google.com/search?q={status.query}"
target="_blank"
class="flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 dark:text-gray-300 no-underline"
>
<div class="flex gap-2 items-center">
<MagnifyingGlass />
<div class=" line-clamp-1">
{status.query}
</div>
</div>
<div
class=" ml-1 text-white dark:text-gray-900 group-hover/item:text-gray-600 dark:group-hover/item:text-white transition"
>
<!-- -->
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="size-4"
>
<path
fill-rule="evenodd"
d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
clip-rule="evenodd"
/>
</svg>
</div>
</a>
{/if}
{#each status.urls as url, urlIdx}
<a
href={url}
target="_blank"
class="flex w-full items-center p-3 px-4 {urlIdx === urls.length - 1
class="flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1
? ''
: 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 dark:text-gray-300"
>
@@ -152,6 +152,7 @@
toast.error(error);
// opts.callback({ success: false, error, modelName: opts.modelName });
break;
}
}
@@ -5,21 +5,23 @@
const i18n = getContext('i18n');
export let admin = false;
export let params = {
// Advanced
seed: 0,
seed: null,
stop: null,
temperature: '',
frequency_penalty: '',
repeat_last_n: '',
mirostat: '',
mirostat_eta: '',
mirostat_tau: '',
top_k: '',
top_p: '',
tfs_z: '',
num_ctx: '',
max_tokens: '',
temperature: null,
frequency_penalty: null,
repeat_last_n: null,
mirostat: null,
mirostat_eta: null,
mirostat_tau: null,
top_k: null,
top_p: null,
tfs_z: null,
num_ctx: null,
max_tokens: null,
use_mmap: null,
use_mlock: null,
num_thread: null,
@@ -112,10 +114,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.temperature = (params?.temperature ?? '') === '' ? 0.8 : '';
params.temperature = (params?.temperature ?? null) === null ? 0.8 : null;
}}
>
{#if (params?.temperature ?? '') === ''}
{#if (params?.temperature ?? null) === null}
<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
{:else}
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
@@ -123,7 +125,7 @@
</button>
</div>
{#if (params?.temperature ?? '') !== ''}
{#if (params?.temperature ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -143,7 +145,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="1"
step="0.05"
step="any"
/>
</div>
</div>
@@ -158,10 +160,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.mirostat = (params?.mirostat ?? '') === '' ? 0 : '';
params.mirostat = (params?.mirostat ?? null) === null ? 0 : null;
}}
>
{#if (params?.mirostat ?? '') === ''}
{#if (params?.mirostat ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -169,7 +171,7 @@
</button>
</div>
{#if (params?.mirostat ?? '') !== ''}
{#if (params?.mirostat ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -204,10 +206,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.mirostat_eta = (params?.mirostat_eta ?? '') === '' ? 0.1 : '';
params.mirostat_eta = (params?.mirostat_eta ?? null) === null ? 0.1 : null;
}}
>
{#if (params?.mirostat_eta ?? '') === ''}
{#if (params?.mirostat_eta ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -215,7 +217,7 @@
</button>
</div>
{#if (params?.mirostat_eta ?? '') !== ''}
{#if (params?.mirostat_eta ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -235,7 +237,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="1"
step="0.05"
step="any"
/>
</div>
</div>
@@ -250,10 +252,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.mirostat_tau = (params?.mirostat_tau ?? '') === '' ? 5.0 : '';
params.mirostat_tau = (params?.mirostat_tau ?? null) === null ? 5.0 : null;
}}
>
{#if (params?.mirostat_tau ?? '') === ''}
{#if (params?.mirostat_tau ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -261,7 +263,7 @@
</button>
</div>
{#if (params?.mirostat_tau ?? '') !== ''}
{#if (params?.mirostat_tau ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -281,7 +283,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="10"
step="0.5"
step="any"
/>
</div>
</div>
@@ -296,10 +298,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.top_k = (params?.top_k ?? '') === '' ? 40 : '';
params.top_k = (params?.top_k ?? null) === null ? 40 : null;
}}
>
{#if (params?.top_k ?? '') === ''}
{#if (params?.top_k ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -307,7 +309,7 @@
</button>
</div>
{#if (params?.top_k ?? '') !== ''}
{#if (params?.top_k ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -327,7 +329,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="100"
step="0.5"
step="any"
/>
</div>
</div>
@@ -342,10 +344,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.top_p = (params?.top_p ?? '') === '' ? 0.9 : '';
params.top_p = (params?.top_p ?? null) === null ? 0.9 : null;
}}
>
{#if (params?.top_p ?? '') === ''}
{#if (params?.top_p ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -353,7 +355,7 @@
</button>
</div>
{#if (params?.top_p ?? '') !== ''}
{#if (params?.top_p ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -373,7 +375,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="1"
step="0.05"
step="any"
/>
</div>
</div>
@@ -388,10 +390,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.frequency_penalty = (params?.frequency_penalty ?? '') === '' ? 1.1 : '';
params.frequency_penalty = (params?.frequency_penalty ?? null) === null ? 1.1 : null;
}}
>
{#if (params?.frequency_penalty ?? '') === ''}
{#if (params?.frequency_penalty ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -399,7 +401,7 @@
</button>
</div>
{#if (params?.frequency_penalty ?? '') !== ''}
{#if (params?.frequency_penalty ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -419,7 +421,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="2"
step="0.05"
step="any"
/>
</div>
</div>
@@ -434,10 +436,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.repeat_last_n = (params?.repeat_last_n ?? '') === '' ? 64 : '';
params.repeat_last_n = (params?.repeat_last_n ?? null) === null ? 64 : null;
}}
>
{#if (params?.repeat_last_n ?? '') === ''}
{#if (params?.repeat_last_n ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -445,7 +447,7 @@
</button>
</div>
{#if (params?.repeat_last_n ?? '') !== ''}
{#if (params?.repeat_last_n ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -480,10 +482,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.tfs_z = (params?.tfs_z ?? '') === '' ? 1 : '';
params.tfs_z = (params?.tfs_z ?? null) === null ? 1 : null;
}}
>
{#if (params?.tfs_z ?? '') === ''}
{#if (params?.tfs_z ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -491,7 +493,7 @@
</button>
</div>
{#if (params?.tfs_z ?? '') !== ''}
{#if (params?.tfs_z ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -511,7 +513,7 @@
class=" bg-transparent text-center w-14"
min="0"
max="2"
step="0.05"
step="any"
/>
</div>
</div>
@@ -526,10 +528,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.num_ctx = (params?.num_ctx ?? '') === '' ? 2048 : '';
params.num_ctx = (params?.num_ctx ?? null) === null ? 2048 : null;
}}
>
{#if (params?.num_ctx ?? '') === ''}
{#if (params?.num_ctx ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -537,7 +539,7 @@
</button>
</div>
{#if (params?.num_ctx ?? '') !== ''}
{#if (params?.num_ctx ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -571,10 +573,10 @@
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.max_tokens = (params?.max_tokens ?? '') === '' ? 128 : '';
params.max_tokens = (params?.max_tokens ?? null) === null ? 128 : null;
}}
>
{#if (params?.max_tokens ?? '') === ''}
{#if (params?.max_tokens ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -582,7 +584,7 @@
</button>
</div>
{#if (params?.max_tokens ?? '') !== ''}
{#if (params?.max_tokens ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
@@ -609,122 +611,124 @@
{/if}
</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('use_mmap (Ollama)')}</div>
{#if admin}
<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('use_mmap (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
}}
>
{#if (params?.use_mmap ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{/if}
</button>
</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('use_mlock (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
}}
>
{#if (params?.use_mlock ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{/if}
</button>
</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('num_thread (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
}}
>
{#if (params?.num_thread ?? 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?.num_thread ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
id="steps-range"
type="range"
min="1"
max="256"
step="1"
bind:value={params.num_thread}
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
/>
</div>
<div class="">
<input
bind:value={params.num_thread}
type="number"
class=" bg-transparent text-center w-14"
min="1"
max="256"
step="1"
/>
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
}}
>
{#if (params?.use_mmap ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{/if}
</button>
</div>
{/if}
</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('Template')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.template = (params?.template ?? null) === null ? '' : null;
}}
>
{#if (params?.template ?? 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?.template ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<textarea
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
placeholder="Write your model template content here"
rows="4"
bind:value={params.template}
/>
</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('use_mlock (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
}}
>
{#if (params?.use_mlock ?? null) === null}
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
{:else}
<span class="ml-2 self-center">{$i18n.t('On')}</span>
{/if}
</button>
</div>
{/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('num_thread (Ollama)')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
}}
>
{#if (params?.num_thread ?? 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?.num_thread ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<input
id="steps-range"
type="range"
min="1"
max="256"
step="1"
bind:value={params.num_thread}
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
/>
</div>
<div class="">
<input
bind:value={params.num_thread}
type="number"
class=" bg-transparent text-center w-14"
min="1"
max="256"
step="1"
/>
</div>
</div>
{/if}
</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('Template')}</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
params.template = (params?.template ?? null) === null ? '' : null;
}}
>
{#if (params?.template ?? 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?.template ?? null) !== null}
<div class="flex mt-0.5 space-x-2">
<div class=" flex-1">
<textarea
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
placeholder="Write your model template content here"
rows="4"
bind:value={params.template}
/>
</div>
</div>
{/if}
</div> -->
{/if}
</div>
+30 -32
View File
@@ -4,7 +4,7 @@
import { getLanguages } from '$lib/i18n';
const dispatch = createEventDispatcher();
import { models, settings, theme } from '$lib/stores';
import { models, settings, theme, user } from '$lib/stores';
const i18n = getContext('i18n');
@@ -43,19 +43,19 @@
let params = {
// Advanced
seed: 0,
temperature: '',
frequency_penalty: '',
repeat_last_n: '',
mirostat: '',
mirostat_eta: '',
mirostat_tau: '',
top_k: '',
top_p: '',
seed: null,
temperature: null,
frequency_penalty: null,
repeat_last_n: null,
mirostat: null,
mirostat_eta: null,
mirostat_tau: null,
top_k: null,
top_p: null,
stop: null,
tfs_z: '',
num_ctx: '',
max_tokens: ''
tfs_z: null,
num_ctx: null,
max_tokens: null
};
const toggleRequestFormat = async () => {
@@ -79,12 +79,6 @@
requestFormat = $settings.requestFormat ?? '';
keepAlive = $settings.keepAlive ?? null;
params.seed = $settings.seed ?? 0;
params.temperature = $settings.temperature ?? '';
params.frequency_penalty = $settings.frequency_penalty ?? '';
params.top_k = $settings.top_k ?? '';
params.top_p = $settings.top_p ?? '';
params.num_ctx = $settings.num_ctx ?? '';
params = { ...params, ...$settings.params };
params.stop = $settings?.params?.stop ? ($settings?.params?.stop ?? []).join(',') : null;
});
@@ -146,6 +140,7 @@
<option value="dark">🌑 {$i18n.t('Dark')}</option>
<option value="oled-dark">🌃 {$i18n.t('OLED Dark')}</option>
<option value="light">☀️ {$i18n.t('Light')}</option>
<option value="her">🌷 Her</option>
<!-- <option value="rose-pine dark">🪻 {$i18n.t('Rosé Pine')}</option>
<option value="rose-pine-dawn light">🌷 {$i18n.t('Rosé Pine Dawn')}</option> -->
</select>
@@ -227,7 +222,7 @@
</div>
{#if showAdvanced}
<AdvancedParams bind:params />
<AdvancedParams admin={$user?.role === 'admin'} bind:params />
<hr class=" dark:border-gray-850" />
<div class=" py-1 w-full justify-between">
@@ -300,20 +295,23 @@
saveSettings({
system: system !== '' ? system : undefined,
params: {
seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
seed: (params.seed !== null ? params.seed : undefined) ?? undefined,
stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
temperature: params.temperature !== '' ? params.temperature : undefined,
temperature: params.temperature !== null ? params.temperature : undefined,
frequency_penalty:
params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
repeat_last_n: params.repeat_last_n !== '' ? params.repeat_last_n : undefined,
mirostat: params.mirostat !== '' ? params.mirostat : undefined,
mirostat_eta: params.mirostat_eta !== '' ? params.mirostat_eta : undefined,
mirostat_tau: params.mirostat_tau !== '' ? params.mirostat_tau : undefined,
top_k: params.top_k !== '' ? params.top_k : undefined,
top_p: params.top_p !== '' ? params.top_p : undefined,
tfs_z: params.tfs_z !== '' ? params.tfs_z : undefined,
num_ctx: params.num_ctx !== '' ? params.num_ctx : undefined,
max_tokens: params.max_tokens !== '' ? params.max_tokens : undefined
params.frequency_penalty !== null ? params.frequency_penalty : undefined,
repeat_last_n: params.repeat_last_n !== null ? params.repeat_last_n : undefined,
mirostat: params.mirostat !== null ? params.mirostat : undefined,
mirostat_eta: params.mirostat_eta !== null ? params.mirostat_eta : undefined,
mirostat_tau: params.mirostat_tau !== null ? params.mirostat_tau : undefined,
top_k: params.top_k !== null ? params.top_k : undefined,
top_p: params.top_p !== null ? params.top_p : undefined,
tfs_z: params.tfs_z !== null ? params.tfs_z : undefined,
num_ctx: params.num_ctx !== null ? params.num_ctx : undefined,
max_tokens: params.max_tokens !== null ? params.max_tokens : undefined,
use_mmap: params.use_mmap !== null ? params.use_mmap : undefined,
use_mlock: params.use_mlock !== null ? params.use_mlock : undefined,
num_thread: params.num_thread !== null ? params.num_thread : undefined
},
keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
});
+135
View File
@@ -0,0 +1,135 @@
<script lang="ts">
import { basicSetup, EditorView } from 'codemirror';
import { keymap, placeholder } from '@codemirror/view';
import { Compartment, EditorState } from '@codemirror/state';
import { acceptCompletion } from '@codemirror/autocomplete';
import { indentWithTab } from '@codemirror/commands';
import { indentUnit } from '@codemirror/language';
import { python } from '@codemirror/lang-python';
import { oneDark } from '@codemirror/theme-one-dark';
import { onMount, createEventDispatcher } from 'svelte';
import { formatPythonCode } from '$lib/apis/utils';
import { toast } from 'svelte-sonner';
const dispatch = createEventDispatcher();
export let boilerplate = '';
export let value = '';
let codeEditor;
let isDarkMode = false;
let editorTheme = new Compartment();
export const formatPythonCodeHandler = async () => {
if (codeEditor) {
const res = await formatPythonCode(value).catch((error) => {
toast.error(error);
return null;
});
if (res && res.code) {
const formattedCode = res.code;
codeEditor.dispatch({
changes: [{ from: 0, to: codeEditor.state.doc.length, insert: formattedCode }]
});
toast.success('Code formatted successfully');
return true;
}
return false;
}
return false;
};
let extensions = [
basicSetup,
keymap.of([{ key: 'Tab', run: acceptCompletion }, indentWithTab]),
python(),
indentUnit.of(' '),
placeholder('Enter your code here...'),
EditorView.updateListener.of((e) => {
if (e.docChanged) {
value = e.state.doc.toString();
}
}),
editorTheme.of([])
];
onMount(() => {
console.log(value);
if (value === '') {
value = boilerplate;
}
// Check if html class has dark mode
isDarkMode = document.documentElement.classList.contains('dark');
// python code editor, highlight python code
codeEditor = new EditorView({
state: EditorState.create({
doc: value,
extensions: extensions
}),
parent: document.getElementById('code-textarea')
});
if (isDarkMode) {
codeEditor.dispatch({
effects: editorTheme.reconfigure(oneDark)
});
}
// listen to html class changes this should fire only when dark mode is toggled
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
const _isDarkMode = document.documentElement.classList.contains('dark');
if (_isDarkMode !== isDarkMode) {
isDarkMode = _isDarkMode;
if (_isDarkMode) {
codeEditor.dispatch({
effects: editorTheme.reconfigure(oneDark)
});
} else {
codeEditor.dispatch({
effects: editorTheme.reconfigure()
});
}
}
}
});
});
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class']
});
const keydownHandler = async (e) => {
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
e.preventDefault();
dispatch('save');
}
// Format code when Ctrl + Shift + F is pressed
if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'f') {
e.preventDefault();
await formatPythonCodeHandler();
}
};
document.addEventListener('keydown', keydownHandler);
return () => {
observer.disconnect();
document.removeEventListener('keydown', keydownHandler);
};
});
</script>
<div id="code-textarea" class="h-full w-full" />
@@ -0,0 +1,106 @@
<script lang="ts">
import { onMount, createEventDispatcher } from 'svelte';
import { fade } from 'svelte/transition';
import { flyAndScale } from '$lib/utils/transitions';
const dispatch = createEventDispatcher();
export let title = 'Confirm your action';
export let message = 'This action cannot be undone. Do you wish to continue?';
export let show = false;
let modalElement = null;
let mounted = false;
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'Escape') {
console.log('Escape');
show = false;
}
};
onMount(() => {
mounted = true;
});
$: if (mounted) {
if (show) {
window.addEventListener('keydown', handleKeyDown);
document.body.style.overflow = 'hidden';
} else {
window.removeEventListener('keydown', handleKeyDown);
document.body.style.overflow = 'unset';
}
}
</script>
{#if show}
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
bind:this={modalElement}
class=" fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full min-h-screen h-screen flex justify-center z-[9999] overflow-hidden overscroll-contain"
in:fade={{ duration: 10 }}
on:mousedown={() => {
show = false;
}}
>
<div
class=" m-auto rounded-2xl max-w-full w-[32rem] mx-2 bg-gray-50 dark:bg-gray-950 shadow-3xl border border-gray-850"
in:flyAndScale
on:mousedown={(e) => {
e.stopPropagation();
}}
>
<div class="px-[1.75rem] py-6">
<div class=" text-lg font-semibold dark:text-gray-200 mb-2.5">{title}</div>
<slot>
<div class=" text-sm text-gray-500">
{message}
</div>
</slot>
<div class="mt-6 flex justify-between gap-1.5">
<button
class="bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white font-medium w-full py-2.5 rounded-lg transition"
on:click={() => {
show = false;
}}
type="button"
>
Cancel
</button>
<button
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={() => {
show = false;
dispatch('confirm');
}}
type="button"
>
Confirm
</button>
</div>
</div>
</div>
</div>
{/if}
<style>
.modal-content {
animation: scaleUp 0.1s ease-out forwards;
}
@keyframes scaleUp {
from {
transform: scale(0.985);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
</style>
@@ -11,7 +11,7 @@
export let saveHandler: Function;
let webConfig = null;
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper', 'serply'];
let youtubeLanguage = 'en';
let youtubeTranslation = null;
@@ -0,0 +1,19 @@
<script lang="ts">
export let className = 'size-4';
export let strokeWidth = '2';
</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="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
/>
</svg>
@@ -0,0 +1,11 @@
<script lang="ts">
export let className = 'size-4';
</script>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class={className}>
<path
fill-rule="evenodd"
d="M12 6.75a5.25 5.25 0 0 1 6.775-5.025.75.75 0 0 1 .313 1.248l-3.32 3.319c.063.475.276.934.641 1.299.365.365.824.578 1.3.64l3.318-3.319a.75.75 0 0 1 1.248.313 5.25 5.25 0 0 1-5.472 6.756c-1.018-.086-1.87.1-2.309.634L7.344 21.3A3.298 3.298 0 1 1 2.7 16.657l8.684-7.151c.533-.44.72-1.291.634-2.309A5.342 5.342 0 0 1 12 6.75ZM4.117 19.125a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Z"
clip-rule="evenodd"
/>
</svg>
@@ -491,7 +491,7 @@
{/each}
</div>
<div class=" text-gray-500 text-xs mt-1">
<div class=" text-gray-500 text-xs mt-1 mb-2">
{$i18n.t("Use '#' in the prompt input to load and select your documents.")}
</div>
@@ -13,7 +13,7 @@
</div>
<div class=" text-xs dark:text-gray-500">
To add documents here, upload them to the "Documents" workspace first.
{$i18n.t('To add documents here, upload them to the "Documents" workspace first.')}
</div>
<div class="flex flex-col">
@@ -97,7 +97,7 @@
<Selector bind:knowledge>
<button
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
type="button">Select Documents</button
type="button">{$i18n.t('Select Documents')}</button
>
</Selector>
</div>
@@ -0,0 +1,57 @@
<script lang="ts">
import Checkbox from '$lib/components/common/Checkbox.svelte';
import { getContext, onMount } from 'svelte';
export let tools = [];
let _tools = {};
export let selectedToolIds = [];
const i18n = getContext('i18n');
onMount(() => {
_tools = tools.reduce((acc, tool) => {
acc[tool.id] = {
...tool,
selected: selectedToolIds.includes(tool.id)
};
return acc;
}, {});
});
</script>
<div>
<div class="flex w-full justify-between mb-1">
<div class=" self-center text-sm font-semibold">{$i18n.t('Tools')}</div>
</div>
<div class=" text-xs dark:text-gray-500">
{$i18n.t('To select toolkits here, add them to the "Tools" workspace first.')}
</div>
<div class="flex flex-col">
{#if tools.length > 0}
<div class=" flex items-center gap-2 mt-2">
{#each Object.keys(_tools) as tool, toolIdx}
<div class=" flex items-center gap-2">
<div class="self-center flex items-center">
<Checkbox
state={_tools[tool].selected ? 'checked' : 'unchecked'}
on:change={(e) => {
_tools[tool].selected = e.detail === 'checked';
selectedToolIds = Object.keys(_tools).filter((t) => _tools[t].selected);
}}
/>
</div>
<div class=" py-0.5 text-sm w-full capitalize font-medium">
{_tools[tool].name}
</div>
</div>
{/each}
</div>
{/if}
</div>
</div>
+358
View File
@@ -0,0 +1,358 @@
<script lang="ts">
import { toast } from 'svelte-sonner';
import fileSaver from 'file-saver';
const { saveAs } = fileSaver;
import { onMount, getContext } from 'svelte';
import { WEBUI_NAME, prompts, tools } from '$lib/stores';
import { createNewPrompt, deletePromptByCommand, getPrompts } from '$lib/apis/prompts';
import { goto } from '$app/navigation';
import {
createNewTool,
deleteToolById,
exportTools,
getToolById,
getTools
} from '$lib/apis/tools';
import ArrowDownTray from '../icons/ArrowDownTray.svelte';
import Tooltip from '../common/Tooltip.svelte';
import ConfirmDialog from '../common/ConfirmDialog.svelte';
const i18n = getContext('i18n');
let toolsImportInputElement: HTMLInputElement;
let importFiles;
let showConfirm = false;
let query = '';
</script>
<svelte:head>
<title>
{$i18n.t('Tools')} | {$WEBUI_NAME}
</title>
</svelte:head>
<div class="mb-3 flex justify-between items-center">
<div class=" text-lg font-semibold self-center">{$i18n.t('Tools')}</div>
</div>
<div class=" flex w-full space-x-2">
<div class="flex flex-1">
<div class=" self-center ml-1 mr-3">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
clip-rule="evenodd"
/>
</svg>
</div>
<input
class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
bind:value={query}
placeholder={$i18n.t('Search Tools')}
/>
</div>
<div>
<a
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"
href="/workspace/tools/create"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
/>
</svg>
</a>
</div>
</div>
<hr class=" dark:border-gray-850 my-2.5" />
<div class="my-3 mb-5">
{#each $tools.filter((t) => query === '' || t.name
.toLowerCase()
.includes(query.toLowerCase()) || t.id.toLowerCase().includes(query.toLowerCase())) as tool}
<button
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
type="button"
on:click={() => {
goto(`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`);
}}
>
<div class=" flex flex-1 space-x-4 cursor-pointer w-full">
<a
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
class="flex items-center text-left"
>
<div class=" flex-1 self-center pl-5">
<div class=" font-semibold flex items-center gap-1.5">
<div>
{tool.name}
</div>
<div class=" text-gray-500 text-xs font-medium">{tool.id}</div>
</div>
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
{tool.meta.description}
</div>
</div>
</a>
</div>
<div class="flex flex-row space-x-1 self-center">
<Tooltip content="Edit">
<a
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"
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
/>
</svg>
</a>
</Tooltip>
<Tooltip content="Clone">
<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"
type="button"
on:click={async (e) => {
e.stopPropagation();
const _tool = await getToolById(localStorage.token, tool.id).catch((error) => {
toast.error(error);
return null;
});
if (_tool) {
sessionStorage.tool = JSON.stringify({
..._tool,
id: `${_tool.id}_clone`,
name: `${_tool.name} (Clone)`
});
goto('/workspace/tools/create');
}
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"
/>
</svg>
</button>
</Tooltip>
<Tooltip content="Export">
<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"
type="button"
on:click={async (e) => {
e.stopPropagation();
const _tool = await getToolById(localStorage.token, tool.id).catch((error) => {
toast.error(error);
return null;
});
if (_tool) {
let blob = new Blob([JSON.stringify([_tool])], {
type: 'application/json'
});
saveAs(blob, `tool-${_tool.id}-export-${Date.now()}.json`);
}
}}
>
<ArrowDownTray />
</button>
</Tooltip>
<Tooltip content="Delete">
<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"
type="button"
on:click={async (e) => {
e.stopPropagation();
const res = await deleteToolById(localStorage.token, tool.id).catch((error) => {
toast.error(error);
return null;
});
if (res) {
toast.success('Tool deleted successfully');
tools.set(await getTools(localStorage.token));
}
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-4 h-4"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
/>
</svg>
</button>
</Tooltip>
</div>
</button>
{/each}
</div>
<div class=" text-gray-500 text-xs mt-1 mb-2">
{$i18n.t(
'Admins have access to all tools at all times; users need tools assigned per model in the workspace.'
)}
</div>
<div class=" flex justify-end w-full mb-2">
<div class="flex space-x-2">
<input
id="documents-import-input"
bind:this={toolsImportInputElement}
bind:files={importFiles}
type="file"
accept=".json"
hidden
on:change={() => {
console.log(importFiles);
showConfirm = true;
}}
/>
<button
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
on:click={() => {
toolsImportInputElement.click();
}}
>
<div class=" self-center mr-2 font-medium">{$i18n.t('Import Tools')}</div>
<div class=" self-center">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm4 9.5a.75.75 0 0 1-.75-.75V8.06l-.72.72a.75.75 0 0 1-1.06-1.06l2-2a.75.75 0 0 1 1.06 0l2 2a.75.75 0 1 1-1.06 1.06l-.72-.72v2.69a.75.75 0 0 1-.75.75Z"
clip-rule="evenodd"
/>
</svg>
</div>
</button>
<button
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
on:click={async () => {
const _tools = await exportTools(localStorage.token).catch((error) => {
toast.error(error);
return null;
});
if (_tools) {
let blob = new Blob([JSON.stringify(_tools)], {
type: 'application/json'
});
saveAs(blob, `tools-export-${Date.now()}.json`);
}
}}
>
<div class=" self-center mr-2 font-medium">{$i18n.t('Export Tools')}</div>
<div class=" self-center">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm4 3.5a.75.75 0 0 1 .75.75v2.69l.72-.72a.75.75 0 1 1 1.06 1.06l-2 2a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 0 1 1.06-1.06l.72.72V6.25A.75.75 0 0 1 8 5.5Z"
clip-rule="evenodd"
/>
</svg>
</div>
</button>
</div>
</div>
<ConfirmDialog
bind:show={showConfirm}
on:confirm={() => {
const reader = new FileReader();
reader.onload = async (event) => {
const _tools = JSON.parse(event.target.result);
console.log(_tools);
for (const tool of _tools) {
const res = await createNewTool(localStorage.token, tool).catch((error) => {
toast.error(error);
return null;
});
}
toast.success('Tool imported successfully');
tools.set(await getTools(localStorage.token));
};
reader.readAsText(importFiles[0]);
}}
>
<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>Please carefully review the following warnings:</div>
<ul class=" mt-1 list-disc pl-4 text-xs">
<li>Tools have a function calling system that allows arbitrary code execution.</li>
<li>Do not install tools from sources you do not fully trust.</li>
</ul>
</div>
<div class="my-3">
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.
</div>
</div>
</ConfirmDialog>
@@ -0,0 +1,127 @@
<script lang="ts">
import CodeEditor from '$lib/components/common/CodeEditor.svelte';
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let value = '';
let codeEditor;
let boilerplate = `import os
import requests
from datetime import datetime
class Tools:
def __init__(self):
pass
# Add your custom tools using pure Python code here, make sure to add type hints
# Use Sphinx-style docstrings to document your tools, they will be used for generating tools specifications
# Please refer to function_calling_filter_pipeline.py file from pipelines project for an example
def get_user_name_and_email_and_id(self, __user__: dict = {}) -> str:
"""
Get the user name, Email and ID from the user object.
"""
# Do not include :param for __user__ in the docstring as it should not be shown in the tool's specification
# The session user object will be passed as a parameter when the function is called
print(__user__)
result = ""
if "name" in __user__:
result += f"User: {__user__['name']}"
if "id" in __user__:
result += f" (ID: {__user__['id']})"
if "email" in __user__:
result += f" (Email: {__user__['email']})"
if result == "":
result = "User: Unknown"
return result
def get_current_time(self) -> str:
"""
Get the current time in a more human-readable format.
:return: The current time.
"""
now = datetime.now()
current_time = now.strftime("%I:%M:%S %p") # Using 12-hour format with AM/PM
current_date = now.strftime(
"%A, %B %d, %Y"
) # Full weekday, month name, day, and year
return f"Current Date and Time = {current_date}, {current_time}"
def calculator(self, equation: str) -> str:
"""
Calculate the result of an equation.
:param equation: The equation to calculate.
"""
# Avoid using eval in production code
# https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
try:
result = eval(equation)
return f"{equation} = {result}"
except Exception as e:
print(e)
return "Invalid equation"
def get_current_weather(self, city: str) -> str:
"""
Get the current weather for a given city.
:param city: The name of the city to get the weather for.
:return: The current weather information or an error message.
"""
api_key = os.getenv("OPENWEATHER_API_KEY")
if not api_key:
return (
"API key is not set in the environment variable 'OPENWEATHER_API_KEY'."
)
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
"q": city,
"appid": api_key,
"units": "metric", # Optional: Use 'imperial' for Fahrenheit
}
try:
response = requests.get(base_url, params=params)
response.raise_for_status() # Raise HTTPError for bad responses (4xx and 5xx)
data = response.json()
if data.get("cod") != 200:
return f"Error fetching weather data: {data.get('message')}"
weather_description = data["weather"][0]["description"]
temperature = data["main"]["temp"]
humidity = data["main"]["humidity"]
wind_speed = data["wind"]["speed"]
return f"Weather in {city}: {temperature}°C"
except requests.RequestException as e:
return f"Error fetching weather data: {str(e)}"
`;
export const formatHandler = async () => {
if (codeEditor) {
return await codeEditor.formatPythonCodeHandler();
}
return false;
};
</script>
<CodeEditor
bind:value
{boilerplate}
bind:this={codeEditor}
on:save={() => {
dispatch('save');
}}
/>
@@ -0,0 +1,179 @@
<script>
import { getContext, createEventDispatcher, onMount } from 'svelte';
const i18n = getContext('i18n');
import CodeEditor from './CodeEditor.svelte';
import { goto } from '$app/navigation';
import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
const dispatch = createEventDispatcher();
let formElement = null;
let loading = false;
let showConfirm = false;
export let edit = false;
export let clone = false;
export let id = '';
export let name = '';
export let meta = {
description: ''
};
export let content = '';
$: if (name && !edit && !clone) {
id = name.replace(/\s+/g, '_').toLowerCase();
}
let codeEditor;
const saveHandler = async () => {
loading = true;
dispatch('save', {
id,
name,
meta,
content
});
};
const submitHandler = async () => {
if (codeEditor) {
const res = await codeEditor.formatHandler();
if (res) {
console.log('Code formatted successfully');
saveHandler();
}
}
};
</script>
<div class=" flex flex-col justify-between w-full overflow-y-auto h-full">
<div class="mx-auto w-full md:px-0 h-full">
<form
bind:this={formElement}
class=" flex flex-col max-h-[100dvh] h-full"
on:submit|preventDefault={() => {
if (edit) {
submitHandler();
} else {
showConfirm = true;
}
}}
>
<div class="mb-2.5">
<button
class="flex space-x-1"
on:click={() => {
goto('/workspace/tools');
}}
type="button"
>
<div class=" self-center">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
fill-rule="evenodd"
d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
clip-rule="evenodd"
/>
</svg>
</div>
<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
</button>
</div>
<div class="flex flex-col flex-1 overflow-auto h-0 rounded-lg">
<div class="w-full mb-2 flex flex-col gap-1.5">
<div class="flex gap-2 w-full">
<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"
type="text"
placeholder="Toolkit Name (e.g. My ToolKit)"
bind:value={name}
required
/>
<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"
type="text"
placeholder="Toolkit ID (e.g. my_toolkit)"
bind:value={id}
required
disabled={edit}
/>
</div>
<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"
type="text"
placeholder="Toolkit Description (e.g. A toolkit for performing various operations)"
bind:value={meta.description}
required
/>
</div>
<div class="mb-2 flex-1 overflow-auto h-0 rounded-lg">
<CodeEditor
bind:value={content}
bind:this={codeEditor}
on:save={() => {
if (formElement) {
formElement.requestSubmit();
}
}}
/>
</div>
<div class="pb-3 flex justify-between">
<div class="flex-1 pr-3">
<div class="text-xs text-gray-500 line-clamp-2">
<span class=" font-semibold dark:text-gray-200">Warning:</span> Tools are a function
calling system with arbitrary code execution <br />
<span class=" font-medium dark:text-gray-400"
>don't install random tools from sources you don't trust.</span
>
</div>
</div>
<button
class="px-3 py-1.5 text-sm font-medium bg-emerald-600 hover:bg-emerald-700 text-gray-50 transition rounded-lg"
type="submit"
>
{$i18n.t('Save')}
</button>
</div>
</div>
</form>
</div>
</div>
<ConfirmDialog
bind:show={showConfirm}
on:confirm={() => {
submitHandler();
}}
>
<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>Please carefully review the following warnings:</div>
<ul class=" mt-1 list-disc pl-4 text-xs">
<li>Tools have a function calling system that allows arbitrary code execution.</li>
<li>Do not install tools from sources you do not fully trust.</li>
</ul>
</div>
<div class="my-3">
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.
</div>
</div>
</ConfirmDialog>
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "لوحة التحكم",
"Admin Settings": "اعدادات المشرف",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "التعليمات المتقدمة",
"Advanced Params": "المعلمات المتقدمة",
"all": "الكل",
@@ -201,6 +202,7 @@
"Enter Score": "أدخل النتيجة",
"Enter Searxng Query URL": "أدخل عنوان URL لاستعلام Searxng",
"Enter Serper API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
"Enter stop sequence": "أدخل تسلسل التوقف",
"Enter Top K": "أدخل Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "تصدير وثائق الخرائط",
"Export Models": "نماذج التصدير",
"Export Prompts": "مطالبات التصدير",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "فشل في إنشاء مفتاح API.",
"Failed to read clipboard contents": "فشل في قراءة محتويات الحافظة",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "استيراد خرائط المستندات",
"Import Models": "استيراد النماذج",
"Import Prompts": "مطالبات الاستيراد",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
"Info": "معلومات",
"Input commands": "إدخال الأوامر",
@@ -419,13 +423,14 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "عدد نتائج البحث",
"Search Tools": "",
"Searched {{count}} sites_zero": "تم البحث في {{count}} sites_zero",
"Searched {{count}} sites_one": "تم البحث في {{count}} sites_one",
"Searched {{count}} sites_two": "تم البحث في {{count}} sites_two",
"Searched {{count}} sites_few": "تم البحث في {{count}} sites_few",
"Searched {{count}} sites_many": "تم البحث في {{count}} sites_many",
"Searched {{count}} sites_other": "تم البحث في {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "البحث في الويب عن \"{{searchQuery}}\"",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "عنوان URL لاستعلام Searxng",
"See readme.md for instructions": "readme.md للحصول على التعليمات",
"See what's new": "ما الجديد",
@@ -437,6 +442,7 @@
"Select a pipeline": "حدد مسارا",
"Select a pipeline url": "حدد عنوان URL لخط الأنابيب",
"Select an Ollama instance": "أختار سيرفر ",
"Select Documents": "",
"Select model": " أختار موديل",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "النموذج (النماذج) المحددة لا تدعم مدخلات الصور",
@@ -445,6 +451,7 @@
"Send message": "يُرجى إدخال طلبك هنا.",
"September": "سبتمبر",
"Serper API Key": "مفتاح واجهة برمجة تطبيقات سيربر",
"Serply API Key": "",
"Serpstack API Key": "مفتاح واجهة برمجة تطبيقات Serpstack",
"Server connection verified": "تم التحقق من اتصال الخادم",
"Set as default": "الافتراضي",
@@ -509,10 +516,13 @@
"To access the available model names for downloading,": "للوصول إلى أسماء الموديلات المتاحة للتنزيل،",
"To access the GGUF models available for downloading,": "للوصول إلى الموديلات GGUF المتاحة للتنزيل،",
"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 chat input.": "الى كتابة المحادثه",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "اليوم",
"Toggle settings": "فتح وأغلاق الاعدادات",
"Toggle sidebar": "فتح وأغلاق الشريط الجانبي",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Панел на Администратор",
"Admin Settings": "Настройки на Администратор",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Разширени Параметри",
"Advanced Params": "Разширени параметри",
"all": "всички",
@@ -201,6 +202,7 @@
"Enter Score": "Въведете оценка",
"Enter Searxng Query URL": "Въведете URL адреса на заявката на Searxng",
"Enter Serper API Key": "Въведете Serper API ключ",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Въведете Serpstack API ключ",
"Enter stop sequence": "Въведете стоп последователност",
"Enter Top K": "Въведете Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Експортване на документен мапинг",
"Export Models": "Експортиране на модели",
"Export Prompts": "Експортване на промптове",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Неуспешно създаване на API ключ.",
"Failed to read clipboard contents": "Грешка при четене на съдържанието от клипборда",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Импортване на документен мапинг",
"Import Models": "Импортиране на модели",
"Import Prompts": "Импортване на промптове",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
"Info": "Информация",
"Input commands": "Въведете команди",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Брой резултати от търсенето",
"Search Tools": "",
"Searched {{count}} sites_one": "Търси се в {{count}} sites_one",
"Searched {{count}} sites_other": "Търси се в {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Търсене в уеб за '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL адрес на заявка на Searxng",
"See readme.md for instructions": "Виж readme.md за инструкции",
"See what's new": "Виж какво е новото",
@@ -433,6 +438,7 @@
"Select a pipeline": "Изберете тръбопровод",
"Select a pipeline url": "Избор на URL адрес на канал",
"Select an Ollama instance": "Изберете Ollama инстанция",
"Select Documents": "",
"Select model": "Изберете модел",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Избраният(те) модел(и) не поддържа въвеждане на изображения",
@@ -441,6 +447,7 @@
"Send message": "Изпращане на съобщение",
"September": "Септември",
"Serper API Key": "Serper API ключ",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API ключ",
"Server connection verified": "Server connection verified",
"Set as default": "Задай по подразбиране",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "За да получите достъп до наличните имена на модели за изтегляне,",
"To access the GGUF models available for downloading,": "За да получите достъп до GGUF моделите, налични за изтегляне,",
"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 chat input.": "към чат входа.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "днес",
"Toggle settings": "Toggle settings",
"Toggle sidebar": "Toggle sidebar",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "এডমিন প্যানেল",
"Admin Settings": "এডমিন সেটিংস",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "এডভান্সড প্যারামিটার্স",
"Advanced Params": "অ্যাডভান্সড প্যারাম",
"all": "সব",
@@ -201,6 +202,7 @@
"Enter Score": "স্কোর দিন",
"Enter Searxng Query URL": "Searxng ক্যোয়ারী URL লিখুন",
"Enter Serper API Key": "Serper API কী লিখুন",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack API কী লিখুন",
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
"Enter Top K": "Top K লিখুন",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
"Export Models": "রপ্তানি মডেল",
"Export Prompts": "প্রম্পটগুলো একপোর্ট করুন",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API Key তৈরি করা যায়নি।",
"Failed to read clipboard contents": "ক্লিপবোর্ডের বিষয়বস্তু পড়া সম্ভব হয়নি",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং ইমপোর্ট করুন",
"Import Models": "মডেল আমদানি করুন",
"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
"Info": "তথ্য",
"Input commands": "ইনপুট কমান্ডস",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "অনুসন্ধানের ফলাফল গণনা",
"Search Tools": "",
"Searched {{count}} sites_one": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_one",
"Searched {{count}} sites_other": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_other",
"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' এর জন্য ওয়েবে অনুসন্ধান করা হচ্ছে",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng ক্যোয়ারী URL",
"See readme.md for instructions": "নির্দেশিকার জন্য readme.md দেখুন",
"See what's new": "নতুন কী আছে দেখুন",
@@ -433,6 +438,7 @@
"Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন",
"Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন",
"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
"Select Documents": "",
"Select model": "মডেল নির্বাচন করুন",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "নির্বাচিত মডেল(গুলি) চিত্র ইনপুট সমর্থন করে না",
@@ -441,6 +447,7 @@
"Send message": "মেসেজ পাঠান",
"September": "সেপ্টেম্বর",
"Serper API Key": "Serper API Key",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API Key",
"Server connection verified": "সার্ভার কানেকশন যাচাই করা হয়েছে",
"Set as default": "ডিফল্ট হিসেবে নির্ধারণ করুন",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "ডাউনলোডের জন্য এভেইলএবল মডেলের নামগুলো এক্সেস করতে,",
"To access the GGUF models available for downloading,": "ডাউলোডের জন্য এভেইলএবল GGUF মডেলগুলো এক্সেস করতে,",
"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 chat input.": "চ্যাট ইনপুটে",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "আজ",
"Toggle settings": "সেটিংস টোগল",
"Toggle sidebar": "সাইডবার টোগল",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Panell d'Administració",
"Admin Settings": "Configuració d'Administració",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Paràmetres Avançats",
"Advanced Params": "Paràmetres avançats",
"all": "tots",
@@ -201,6 +202,7 @@
"Enter Score": "Introdueix el Puntuació",
"Enter Searxng Query URL": "Introduïu l'URL de consulta de Searxng",
"Enter Serper API Key": "Introduïu la clau de l'API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack",
"Enter stop sequence": "Introdueix la seqüència de parada",
"Enter Top K": "Introdueix Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exporta el Mapatge de Documents",
"Export Models": "Models d'exportació",
"Export Prompts": "Exporta Prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "No s'ha pogut crear la clau d'API.",
"Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importa el Mapa de Documents",
"Import Models": "Models d'importació",
"Import Prompts": "Importa Prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
"Info": "Informació",
"Input commands": "Entra ordres",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Recompte de resultats de cerca",
"Search Tools": "",
"Searched {{count}} sites_one": "Cercat {{count}} sites_one",
"Searched {{count}} sites_many": "Cercat {{recompte}} sites_many",
"Searched {{count}} sites_other": "Cercat {{recompte}} sites_other",
"Searching the web for '{{searchQuery}}'": "Cerca a la web de '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng URL de consulta",
"See readme.md for instructions": "Consulta el readme.md per a instruccions",
"See what's new": "Veure novetats",
@@ -434,6 +439,7 @@
"Select a pipeline": "Seleccioneu una canonada",
"Select a pipeline url": "Seleccionar un URL de canonada",
"Select an Ollama instance": "Selecciona una instància d'Ollama",
"Select Documents": "",
"Select model": "Selecciona un model",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Els models seleccionats no admeten l'entrada d'imatges",
@@ -442,6 +448,7 @@
"Send message": "Envia missatge",
"September": "Setembre",
"Serper API Key": "Clau API Serper",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API Key",
"Server connection verified": "Connexió al servidor verificada",
"Set as default": "Estableix com a predeterminat",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,",
"To access the GGUF models available for downloading,": "Per accedir als models GGUF disponibles per descarregar,",
"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 chat input.": "a l'entrada del xat.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Avui",
"Toggle settings": "Commuta configuracions",
"Toggle sidebar": "Commuta barra lateral",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemes accedint a Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Admin Panel",
"Admin Settings": "Mga setting sa administratibo",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "advanced settings",
"Advanced Params": "",
"all": "tanan",
@@ -201,6 +202,7 @@
"Enter Score": "",
"Enter Searxng Query URL": "",
"Enter Serper API Key": "",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "",
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
"Enter Top K": "Pagsulod sa Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "I-export ang pagmapa sa dokumento",
"Export Models": "",
"Export Prompts": "Export prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "",
"Failed to read clipboard contents": "Napakyas sa pagbasa sa sulod sa clipboard",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Import nga pagmapa sa dokumento",
"Import Models": "",
"Import Prompts": "Import prompt",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Iapil ang `--api` nga bandila kung nagdagan nga stable-diffusion-webui",
"Info": "",
"Input commands": "Pagsulod sa input commands",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "",
"Search Tools": "",
"Searched {{count}} sites_one": "",
"Searched {{count}} sites_other": "",
"Searching the web for '{{searchQuery}}'": "",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "",
"See readme.md for instructions": "Tan-awa ang readme.md alang sa mga panudlo",
"See what's new": "Tan-awa unsay bag-o",
@@ -433,6 +438,7 @@
"Select a pipeline": "",
"Select a pipeline url": "",
"Select an Ollama instance": "Pagpili usa ka pananglitan sa Ollama",
"Select Documents": "",
"Select model": "Pagpili og modelo",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "",
@@ -441,6 +447,7 @@
"Send message": "Magpadala ug mensahe",
"September": "",
"Serper API Key": "",
"Serply API Key": "",
"Serpstack API Key": "",
"Server connection verified": "Gipamatud-an nga koneksyon sa server",
"Set as default": "Define pinaagi sa default",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "Aron ma-access ang mga ngalan sa modelo nga ma-download,",
"To access the GGUF models available for downloading,": "Aron ma-access ang mga modelo sa GGUF nga magamit alang sa pag-download,",
"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 chat input.": "sa entrada sa iring.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "",
"Toggle settings": "I-toggle ang mga setting",
"Toggle sidebar": "I-toggle ang sidebar",
"Tools": "",
"Top K": "Top K",
"Top P": "Ibabaw nga P",
"Trouble accessing Ollama?": "Adunay mga problema sa pag-access sa Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Admin Panel",
"Admin Settings": "Admin Einstellungen",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Erweiterte Parameter",
"Advanced Params": "Erweiterte Parameter",
"all": "Alle",
@@ -201,6 +202,7 @@
"Enter Score": "Score eingeben",
"Enter Searxng Query URL": "Geben Sie die Searxng-Abfrage-URL ein",
"Enter Serper API Key": "Serper-API-Schlüssel eingeben",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
"Enter stop sequence": "Stop-Sequenz eingeben",
"Enter Top K": "Gib Top K ein",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Dokumentenmapping exportieren",
"Export Models": "Modelle exportieren",
"Export Prompts": "Prompts exportieren",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API Key erstellen fehlgeschlagen",
"Failed to read clipboard contents": "Fehler beim Lesen des Zwischenablageninhalts",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Dokumentenmapping importieren",
"Import Models": "Modelle importieren",
"Import Prompts": "Prompts importieren",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Füge das `--api`-Flag hinzu, wenn du stable-diffusion-webui nutzt",
"Info": "Info",
"Input commands": "Eingabebefehle",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Anzahl der Suchergebnisse",
"Search Tools": "",
"Searched {{count}} sites_one": "Gesucht {{count}} sites_one",
"Searched {{count}} sites_other": "Gesucht {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Suche im Web nach '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng-Abfrage-URL",
"See readme.md for instructions": "Anleitung in readme.md anzeigen",
"See what's new": "Was gibt's Neues",
@@ -433,6 +438,7 @@
"Select a pipeline": "Wählen Sie eine Pipeline aus",
"Select a pipeline url": "Auswählen einer Pipeline-URL",
"Select an Ollama instance": "Eine Ollama Instanz auswählen",
"Select Documents": "",
"Select model": "Modell auswählen",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Ausgewählte Modelle unterstützen keine Bildeingaben",
@@ -441,6 +447,7 @@
"Send message": "Nachricht senden",
"September": "September",
"Serper API Key": "Serper-API-Schlüssel",
"Serply API Key": "",
"Serpstack API Key": "Serpstack-API-Schlüssel",
"Server connection verified": "Serververbindung überprüft",
"Set as default": "Als Standard festlegen",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "Um auf die verfügbaren Modellnamen zum Herunterladen zuzugreifen,",
"To access the GGUF models available for downloading,": "Um auf die verfügbaren GGUF Modelle zum Herunterladen zuzugreifen",
"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 chat input.": "to chat input.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Heute",
"Toggle settings": "Einstellungen umschalten",
"Toggle sidebar": "Seitenleiste umschalten",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Admin Panel",
"Admin Settings": "Admin Settings",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Advanced Parameters",
"Advanced Params": "",
"all": "all",
@@ -201,6 +202,7 @@
"Enter Score": "",
"Enter Searxng Query URL": "",
"Enter Serper API Key": "",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "",
"Enter stop sequence": "Enter stop bark",
"Enter Top K": "Enter Top Wow",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Export Mappings of Dogos",
"Export Models": "",
"Export Prompts": "Export Promptos",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "",
"Failed to read clipboard contents": "Failed to read clipboard borks",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Import Doge Mapping",
"Import Models": "",
"Import Prompts": "Import Promptos",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
"Info": "",
"Input commands": "Input commands",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "",
"Search Tools": "",
"Searched {{count}} sites_one": "",
"Searched {{count}} sites_other": "",
"Searching the web for '{{searchQuery}}'": "",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "",
"See readme.md for instructions": "See readme.md for instructions wow",
"See what's new": "See what's new so amaze",
@@ -433,6 +438,7 @@
"Select a pipeline": "",
"Select a pipeline url": "",
"Select an Ollama instance": "Select an Ollama instance very choose",
"Select Documents": "",
"Select model": "Select model much choice",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "",
@@ -441,6 +447,7 @@
"Send message": "Send message very send",
"September": "",
"Serper API Key": "",
"Serply API Key": "",
"Serpstack API Key": "",
"Server connection verified": "Server connection verified much secure",
"Set as default": "Set as default very default",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "To access the available model names for downloading, much access",
"To access the GGUF models available for downloading,": "To access the GGUF models available for downloading, much access",
"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 chat input.": "to chat input. Very chat.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "",
"Toggle settings": "Toggle settings much toggle",
"Toggle sidebar": "Toggle sidebar much toggle",
"Tools": "",
"Top K": "Top K very top",
"Top P": "Top P very top",
"Trouble accessing Ollama?": "Trouble accessing Ollama? Much trouble?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "",
"Admin Settings": "",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "",
"Advanced Params": "",
"all": "",
@@ -201,6 +202,7 @@
"Enter Score": "",
"Enter Searxng Query URL": "",
"Enter Serper API Key": "",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "",
"Enter stop sequence": "",
"Enter Top K": "",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "",
"Export Models": "",
"Export Prompts": "",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "",
"Failed to read clipboard contents": "",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "",
"Import Models": "",
"Import Prompts": "",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "",
"Info": "",
"Input commands": "",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "",
"Search Tools": "",
"Searched {{count}} sites_one": "",
"Searched {{count}} sites_other": "",
"Searching the web for '{{searchQuery}}'": "",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "",
"See readme.md for instructions": "",
"See what's new": "",
@@ -433,6 +438,7 @@
"Select a pipeline": "",
"Select a pipeline url": "",
"Select an Ollama instance": "",
"Select Documents": "",
"Select model": "",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "",
@@ -441,6 +447,7 @@
"Send message": "",
"September": "",
"Serper API Key": "",
"Serply API Key": "",
"Serpstack API Key": "",
"Server connection verified": "",
"Set as default": "",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "",
"To access the GGUF models available for downloading,": "",
"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 chat input.": "",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "",
"Toggle settings": "",
"Toggle sidebar": "",
"Tools": "",
"Top K": "",
"Top P": "",
"Trouble accessing Ollama?": "",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "",
"Admin Settings": "",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "",
"Advanced Params": "",
"all": "",
@@ -201,6 +202,7 @@
"Enter Score": "",
"Enter Searxng Query URL": "",
"Enter Serper API Key": "",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "",
"Enter stop sequence": "",
"Enter Top K": "",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "",
"Export Models": "",
"Export Prompts": "",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "",
"Failed to read clipboard contents": "",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "",
"Import Models": "",
"Import Prompts": "",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "",
"Info": "",
"Input commands": "",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "",
"Search Tools": "",
"Searched {{count}} sites_one": "",
"Searched {{count}} sites_other": "",
"Searching the web for '{{searchQuery}}'": "",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "",
"See readme.md for instructions": "",
"See what's new": "",
@@ -433,6 +438,7 @@
"Select a pipeline": "",
"Select a pipeline url": "",
"Select an Ollama instance": "",
"Select Documents": "",
"Select model": "",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "",
@@ -441,6 +447,7 @@
"Send message": "",
"September": "",
"Serper API Key": "",
"Serply API Key": "",
"Serpstack API Key": "",
"Server connection verified": "",
"Set as default": "",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "",
"To access the GGUF models available for downloading,": "",
"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 chat input.": "",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "",
"Toggle settings": "",
"Toggle sidebar": "",
"Tools": "",
"Top K": "",
"Top P": "",
"Trouble accessing Ollama?": "",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Panel de Administración",
"Admin Settings": "Configuración de Administrador",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Parámetros Avanzados",
"Advanced Params": "Parámetros avanzados",
"all": "todo",
@@ -201,6 +202,7 @@
"Enter Score": "Ingrese la puntuación",
"Enter Searxng Query URL": "Introduzca la URL de consulta de Searxng",
"Enter Serper API Key": "Ingrese la clave API de Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Ingrese la clave API de Serpstack",
"Enter stop sequence": "Ingrese la secuencia de parada",
"Enter Top K": "Ingrese el Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exportar el mapeo de documentos",
"Export Models": "Modelos de exportación",
"Export Prompts": "Exportar Prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "No se pudo crear la clave API.",
"Failed to read clipboard contents": "No se pudo leer el contenido del portapapeles",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importar Mapeo de Documentos",
"Import Models": "Importar modelos",
"Import Prompts": "Importar Prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
"Info": "Información",
"Input commands": "Ingresar comandos",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Recuento de resultados de búsqueda",
"Search Tools": "",
"Searched {{count}} sites_one": "Buscado {{count}} sites_one",
"Searched {{count}} sites_many": "Buscado {{count}} sites_many",
"Searched {{count}} sites_other": "Buscó {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Buscando en la web '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng URL de consulta",
"See readme.md for instructions": "Vea el readme.md para instrucciones",
"See what's new": "Ver las novedades",
@@ -434,6 +439,7 @@
"Select a pipeline": "Selección de una canalización",
"Select a pipeline url": "Selección de una dirección URL de canalización",
"Select an Ollama instance": "Seleccione una instancia de Ollama",
"Select Documents": "",
"Select model": "Selecciona un modelo",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Los modelos seleccionados no admiten entradas de imagen",
@@ -442,6 +448,7 @@
"Send message": "Enviar Mensaje",
"September": "Septiembre",
"Serper API Key": "Clave API de Serper",
"Serply API Key": "",
"Serpstack API Key": "Clave API de Serpstack",
"Server connection verified": "Conexión del servidor verificada",
"Set as default": "Establecer por defecto",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Para acceder a los nombres de modelos disponibles para descargar,",
"To access the GGUF models available for downloading,": "Para acceder a los modelos GGUF disponibles para descargar,",
"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 chat input.": "a la entrada del chat.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Hoy",
"Toggle settings": "Alternar configuración",
"Toggle sidebar": "Alternar barra lateral",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "پنل مدیریت",
"Admin Settings": "تنظیمات مدیریت",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "پارامترهای پیشرفته",
"Advanced Params": "پارام های پیشرفته",
"all": "همه",
@@ -201,6 +202,7 @@
"Enter Score": "امتیاز را وارد کنید",
"Enter Searxng Query URL": "نشانی وب پرسوجوی Searxng را وارد کنید",
"Enter Serper API Key": "کلید API Serper را وارد کنید",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "کلید API Serpstack را وارد کنید",
"Enter stop sequence": "توالی توقف را وارد کنید",
"Enter Top K": "مقدار Top K را وارد کنید",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "اکسپورت از نگاشت اسناد",
"Export Models": "مدل های صادرات",
"Export Prompts": "اکسپورت از پرامپت\u200cها",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "ایجاد کلید API با خطا مواجه شد.",
"Failed to read clipboard contents": "خواندن محتوای کلیپ بورد ناموفق بود",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "ایمپورت نگاشت اسناد",
"Import Models": "واردات مدلها",
"Import Prompts": "ایمپورت پرامپت\u200cها",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "فلگ `--api` را هنکام اجرای stable-diffusion-webui استفاده کنید.",
"Info": "اطلاعات",
"Input commands": "ورودی دستورات",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "تعداد نتایج جستجو",
"Search Tools": "",
"Searched {{count}} sites_one": "جستجو {{count}} sites_one",
"Searched {{count}} sites_other": "جستجو {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "جستجو در وب برای '{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "نشانی وب جستجوی Searxng",
"See readme.md for instructions": "برای مشاهده دستورالعمل\u200cها به readme.md مراجعه کنید",
"See what's new": "ببینید موارد جدید چه بوده",
@@ -433,6 +438,7 @@
"Select a pipeline": "انتخاب یک خط لوله",
"Select a pipeline url": "یک ادرس خط لوله را انتخاب کنید",
"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
"Select Documents": "",
"Select model": "انتخاب یک مدل",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "مدل) های (انتخاب شده ورودیهای تصویر را پشتیبانی نمیکند",
@@ -441,6 +447,7 @@
"Send message": "ارسال پیام",
"September": "سپتامبر",
"Serper API Key": "کلید API Serper",
"Serply API Key": "",
"Serpstack API Key": "کلید API Serpstack",
"Server connection verified": "اتصال سرور تأیید شد",
"Set as default": "تنظیم به عنوان پیشفرض",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "برای دسترسی به نام مدل های موجود برای دانلود،",
"To access the GGUF models available for downloading,": "برای دسترسی به مدل\u200cهای GGUF موجود برای دانلود،",
"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 chat input.": "در ورودی گپ.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "امروز",
"Toggle settings": "نمایش/عدم نمایش تنظیمات",
"Toggle sidebar": "نمایش/عدم نمایش نوار کناری",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "در دسترسی به اولاما مشکل دارید؟",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Hallintapaneeli",
"Admin Settings": "Hallinta-asetukset",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Edistyneet parametrit",
"Advanced Params": "Edistyneet parametrit",
"all": "kaikki",
@@ -201,6 +202,7 @@
"Enter Score": "Syötä pisteet",
"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn URL-osoite",
"Enter Serper API Key": "Anna Serper API -avain",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Anna Serpstack API -avain",
"Enter stop sequence": "Syötä lopetussekvenssi",
"Enter Top K": "Syötä Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Vie asiakirjakartoitus",
"Export Models": "Vie malleja",
"Export Prompts": "Vie kehotteet",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API-avaimen luonti epäonnistui.",
"Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Tuo asiakirjakartoitus",
"Import Models": "Mallien tuominen",
"Import Prompts": "Tuo kehotteita",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Sisällytä `--api`-parametri suorittaessasi stable-diffusion-webui",
"Info": "Info",
"Input commands": "Syötä komennot",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Hakutulosten määrä",
"Search Tools": "",
"Searched {{count}} sites_one": "Haettu {{count}} sites_one",
"Searched {{count}} sites_other": "Haku {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Haku verkosta hakusanalla {{searchQuery}}",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng-kyselyn URL-osoite",
"See readme.md for instructions": "Katso lisää ohjeita readme.md:stä",
"See what's new": "Katso, mitä uutta",
@@ -433,6 +438,7 @@
"Select a pipeline": "Valitse putki",
"Select a pipeline url": "Valitse putken URL-osoite",
"Select an Ollama instance": "Valitse Ollama-instanssi",
"Select Documents": "",
"Select model": "Valitse malli",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasyötteitä",
@@ -441,6 +447,7 @@
"Send message": "Lähetä viesti",
"September": "syyskuu",
"Serper API Key": "Serper API -avain",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API -avain",
"Server connection verified": "Palvelinyhteys varmennettu",
"Set as default": "Aseta oletukseksi",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,",
"To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,",
"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 chat input.": "keskustelusyötteeseen.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Tänään",
"Toggle settings": "Kytke asetukset",
"Toggle sidebar": "Kytke sivupalkki",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?",
+12 -2
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Panneau d'administration",
"Admin Settings": "Paramètres d'administration",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Paramètres avancés",
"Advanced Params": "Params avancés",
"all": "tous",
@@ -201,6 +202,7 @@
"Enter Score": "Entrez le score",
"Enter Searxng Query URL": "Entrez lURL de requête Searxng",
"Enter Serper API Key": "Entrez la clé API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Entrez dans la clé API Serpstack",
"Enter stop sequence": "Entrez la séquence de fin",
"Enter Top K": "Entrez Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exporter le mappage des documents",
"Export Models": "Modèles dexportation",
"Export Prompts": "Exporter les prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Impossible de créer la clé API.",
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importer le mappage des documents",
"Import Models": "Importer des modèles",
"Import Prompts": "Importer les prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
"Info": "Linfo",
"Input commands": "Entrez des commandes d'entrée",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Nombre de résultats de la recherche",
"Search Tools": "",
"Searched {{count}} sites_one": "Recherche dans {{count}} sites_one",
"Searched {{count}} sites_many": "Recherche dans {{count}} sites_many",
"Searched {{count}} sites_other": "Recherche dans {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Recherche sur le Web pour '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL de la requête Searxng",
"See readme.md for instructions": "Voir readme.md pour les instructions",
"See what's new": "Voir les nouveautés",
@@ -434,6 +439,7 @@
"Select a pipeline": "Sélectionner un pipeline",
"Select a pipeline url": "Sélectionnez une URL de pipeline",
"Select an Ollama instance": "Sélectionner une instance Ollama",
"Select Documents": "",
"Select model": "Sélectionnez un modèle",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Les modèles sélectionnés ne prennent pas en charge les entrées dimage",
@@ -442,6 +448,7 @@
"Send message": "Envoyer un message",
"September": "Septembre",
"Serper API Key": "Clé API Serper",
"Serply API Key": "",
"Serpstack API Key": "Clé API Serpstack",
"Server connection verified": "Connexion au serveur vérifiée",
"Set as default": "Définir par défaut",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
"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 chat input.": "à l'entrée du chat.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Aujourd'hui",
"Toggle settings": "Basculer les paramètres",
"Toggle sidebar": "Basculer la barre latérale",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Des problèmes pour accéder à Ollama ?",
@@ -523,7 +533,7 @@
"Update and Copy Link": "Mettre à jour et copier le lien",
"Update password": "Mettre à jour le mot de passe",
"Upload a GGUF model": "Téléverser un modèle GGUF",
"Upload Files": "Télécharger des fichiers",
"Upload Files": "Téléverser des fichiers",
"Upload Pipeline": "",
"Upload Progress": "Progression du Téléversement",
"URL Mode": "Mode URL",
+12 -2
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Panneau d'Administration",
"Admin Settings": "Paramètres d'Administration",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Paramètres Avancés",
"Advanced Params": "Params Avancés",
"all": "tous",
@@ -201,6 +202,7 @@
"Enter Score": "Entrez le Score",
"Enter Searxng Query URL": "Entrez lURL de la requête Searxng",
"Enter Serper API Key": "Entrez la clé API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Entrez la clé API Serpstack",
"Enter stop sequence": "Entrez la séquence de fin",
"Enter Top K": "Entrez Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exporter la Correspondance des Documents",
"Export Models": "Exporter les Modèles",
"Export Prompts": "Exporter les Prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Échec de la création de la clé d'API.",
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importer la Correspondance des Documents",
"Import Models": "Importer des Modèles",
"Import Prompts": "Importer des Prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
"Info": "Info",
"Input commands": "Entrez les commandes d'entrée",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Nombre de résultats de recherche",
"Search Tools": "",
"Searched {{count}} sites_one": "Recherché {{count}} sites_one",
"Searched {{count}} sites_many": "Recherché {{count}} sites_many",
"Searched {{count}} sites_other": "Recherché {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Recherche sur le web pour '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL de requête Searxng",
"See readme.md for instructions": "Voir readme.md pour les instructions",
"See what's new": "Voir les nouveautés",
@@ -434,6 +439,7 @@
"Select a pipeline": "Sélectionner un pipeline",
"Select a pipeline url": "Sélectionnez une URL de pipeline",
"Select an Ollama instance": "Sélectionner une instance Ollama",
"Select Documents": "",
"Select model": "Sélectionner un modèle",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images",
@@ -442,6 +448,7 @@
"Send message": "Envoyer un message",
"September": "Septembre",
"Serper API Key": "Clé API Serper",
"Serply API Key": "",
"Serpstack API Key": "Clé API Serpstack",
"Server connection verified": "Connexion au serveur vérifiée",
"Set as default": "Définir par défaut",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
"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 chat input.": "à l'entrée du chat.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Aujourd'hui",
"Toggle settings": "Basculer les paramètres",
"Toggle sidebar": "Basculer la barre latérale",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
@@ -523,7 +533,7 @@
"Update and Copy Link": "Mettre à Jour et Copier le Lien",
"Update password": "Mettre à Jour le Mot de Passe",
"Upload a GGUF model": "Téléverser un modèle GGUF",
"Upload Files": "Télécharger des fichiers",
"Upload Files": "Téléverser des fichiers",
"Upload Pipeline": "",
"Upload Progress": "Progression du Téléversement",
"URL Mode": "Mode URL",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "לוח בקרה למנהל",
"Admin Settings": "הגדרות מנהל",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "פרמטרים מתקדמים",
"Advanced Params": "פרמטרים מתקדמים",
"all": "הכל",
@@ -201,6 +202,7 @@
"Enter Score": "הזן ציון",
"Enter Searxng Query URL": "הזן כתובת URL של שאילתת Searxng",
"Enter Serper API Key": "הזן מפתח API של Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "הזן מפתח API של Serpstack",
"Enter stop sequence": "הזן רצף עצירה",
"Enter Top K": "הזן Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "ייצוא מיפוי מסמכים",
"Export Models": "ייצוא מודלים",
"Export Prompts": "ייצוא פקודות",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "יצירת מפתח API נכשלה.",
"Failed to read clipboard contents": "קריאת תוכן הלוח נכשלה",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "יבוא מיפוי מסמכים",
"Import Models": "ייבוא דגמים",
"Import Prompts": "יבוא פקודות",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "כלול את הדגל `--api` בעת הרצת stable-diffusion-webui",
"Info": "מידע",
"Input commands": "פקודות קלט",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "ספירת תוצאות חיפוש",
"Search Tools": "",
"Searched {{count}} sites_one": "חיפש {{count}} sites_one",
"Searched {{count}} sites_two": "חיפש {{count}} sites_two",
"Searched {{count}} sites_other": "חיפש {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "חיפוש באינטרנט אחר '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "כתובת URL של שאילתת Searxng",
"See readme.md for instructions": "ראה את readme.md להוראות",
"See what's new": "ראה מה חדש",
@@ -434,6 +439,7 @@
"Select a pipeline": "בחר קו צינור",
"Select a pipeline url": "בחר כתובת URL של קו צינור",
"Select an Ollama instance": "בחר מופע של Ollama",
"Select Documents": "",
"Select model": "בחר מודל",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "דגמים נבחרים אינם תומכים בקלט תמונה",
@@ -442,6 +448,7 @@
"Send message": "שלח הודעה",
"September": "ספטמבר",
"Serper API Key": "מפתח Serper API",
"Serply API Key": "",
"Serpstack API Key": "מפתח API של Serpstack",
"Server connection verified": "החיבור לשרת אומת",
"Set as default": "הגדר כברירת מחדל",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "כדי לגשת לשמות הדגמים הזמינים להורדה,",
"To access the GGUF models available for downloading,": "כדי לגשת לדגמי GGUF הזמינים להורדה,",
"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 chat input.": "לקלטת שיחה.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "היום",
"Toggle settings": "החלפת מצב של הגדרות",
"Toggle sidebar": "החלפת מצב של סרגל הצד",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "קשה לגשת לOllama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "व्यवस्थापक पैनल",
"Admin Settings": "व्यवस्थापक सेटिंग्स",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "उन्नत पैरामीटर",
"Advanced Params": "उन्नत परम",
"all": "सभी",
@@ -201,6 +202,7 @@
"Enter Score": "स्कोर दर्ज करें",
"Enter Searxng Query URL": "Searxng क्वेरी URL दर्ज करें",
"Enter Serper API Key": "Serper API कुंजी दर्ज करें",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें",
"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
"Enter Top K": "शीर्ष K दर्ज करें",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
"Export Models": "निर्यात मॉडल",
"Export Prompts": "प्रॉम्प्ट निर्यात करें",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "एपीआई कुंजी बनाने में विफल.",
"Failed to read clipboard contents": "क्लिपबोर्ड सामग्री पढ़ने में विफल",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "दस्तावेज़ मैपिंग आयात करें",
"Import Models": "आयात मॉडल",
"Import Prompts": "प्रॉम्प्ट आयात करें",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui चलाते समय `--api` ध्वज शामिल करें",
"Info": "सूचना-विषयक",
"Input commands": "इनपुट क命",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "खोज परिणामों की संख्या",
"Search Tools": "",
"Searched {{count}} sites_one": "{{count}} sites_one खोजा गया",
"Searched {{count}} sites_other": "{{count}} sites_other खोजा गया",
"Searching the web for '{{searchQuery}}'": "वेब पर '{{searchQuery}}' खोजना",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng क्वेरी URL",
"See readme.md for instructions": "निर्देशों के लिए readme.md देखें",
"See what's new": "देखें, क्या नया है",
@@ -433,6 +438,7 @@
"Select a pipeline": "एक पाइपलाइन का चयन करें",
"Select a pipeline url": "एक पाइपलाइन url चुनें",
"Select an Ollama instance": "एक Ollama Instance चुनें",
"Select Documents": "",
"Select model": "मॉडल चुनें",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "चयनित मॉडल छवि इनपुट का समर्थन नहीं करते हैं",
@@ -441,6 +447,7 @@
"Send message": "मेसेज भेजें",
"September": "सितंबर",
"Serper API Key": "Serper API कुंजी",
"Serply API Key": "",
"Serpstack API Key": "सर्पस्टैक एपीआई कुंजी",
"Server connection verified": "सर्वर कनेक्शन सत्यापित",
"Set as default": "डिफाल्ट के रूप में सेट",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "डाउनलोड करने के लिए उपलब्ध मॉडल नामों तक पहुंचने के लिए,",
"To access the GGUF models available for downloading,": "डाउनलोडिंग के लिए उपलब्ध GGUF मॉडल तक पहुँचने के लिए,",
"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 chat input.": "इनपुट चैट करने के लिए.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "आज",
"Toggle settings": "सेटिंग्स टॉगल करें",
"Toggle sidebar": "साइडबार टॉगल करें",
"Tools": "",
"Top K": "शीर्ष K",
"Top P": "शीर्ष P",
"Trouble accessing Ollama?": "Ollama तक पहुँचने में परेशानी हो रही है?",
+84 -74
View File
@@ -4,7 +4,7 @@
"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
"(latest)": "(najnovije)",
"{{ models }}": "{{ modeli }}",
"{{ owner }}: You cannot delete a base model": "{{ vlasnik }}: ne možete izbrisati osnovni model",
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Ne možete obrisati osnovni model",
"{{modelName}} is thinking...": "{{modelName}} razmišlja...",
"{{user}}'s Chats": "Razgovori korisnika {{user}}",
"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
@@ -14,7 +14,7 @@
"Account": "Račun",
"Account Activation Pending": "",
"Accurate information": "Točne informacije",
"Active Users": "",
"Active Users": "Aktivni korisnici",
"Add": "Dodaj",
"Add a model id": "Dodavanje ID-a modela",
"Add a short description about what this model does": "Dodajte kratak opis funkcija ovog modela",
@@ -30,17 +30,18 @@
"Add User": "Dodaj korisnika",
"Adjusting these settings will apply changes universally to all users.": "Podešavanje će se primijeniti univerzalno na sve korisnike.",
"admin": "administrator",
"Admin": "",
"Admin Panel": "Administratorska ploča",
"Admin Settings": "Administratorske postavke",
"Admin": "Admin",
"Admin Panel": "Admin ploča",
"Admin Settings": "Admin postavke",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Napredni parametri",
"Advanced Params": "Napredni parami",
"Advanced Params": "Napredni parametri",
"all": "sve",
"All Documents": "Svi dokumenti",
"All Users": "Svi korisnici",
"Allow": "Dopusti",
"Allow Chat Deletion": "Dopusti brisanje razgovora",
"Allow non-local voices": "",
"Allow non-local voices": "Dopusti nelokalne glasove",
"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
"Already have an account?": "Već imate račun?",
"an assistant": "asistent",
@@ -52,7 +53,7 @@
"API keys": "API ključevi",
"April": "Travanj",
"Archive": "Arhiva",
"Archive All Chats": "Arhiviraj sve razgovore",
"Archive All Chats": "Arhivirajte sve razgovore",
"Archived Chats": "Arhivirani razgovori",
"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
"Are you sure?": "Jeste li sigurni?",
@@ -66,15 +67,15 @@
"available!": "dostupno!",
"Back": "Natrag",
"Bad Response": "Loš odgovor",
"Banners": "Bannere",
"Base Model (From)": "Osnovni model (šalje)",
"Banners": "Baneri",
"Base Model (From)": "Osnovni model (Od)",
"before": "prije",
"Being lazy": "Biti lijen",
"Brave Search API Key": "Ključ API-ja za hrabro pretraživanje",
"Brave Search API Key": "Brave tražilica - API ključ",
"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
"Call": "",
"Call feature is not supported when using Web STT engine": "",
"Camera": "",
"Call": "Poziv",
"Call feature is not supported when using Web STT engine": "Značajka poziva nije podržana kada se koristi Web STT mehanizam",
"Camera": "Kamera",
"Cancel": "Otkaži",
"Capabilities": "Mogućnosti",
"Change Password": "Promijeni lozinku",
@@ -92,7 +93,7 @@
"Chunk Params": "Parametri dijelova",
"Chunk Size": "Veličina dijela",
"Citation": "Citiranje",
"Clear memory": "",
"Clear memory": "Očisti memoriju",
"Click here for help.": "Kliknite ovdje za pomoć.",
"Click here to": "Kliknite ovdje za",
"Click here to select": "Kliknite ovdje za odabir",
@@ -101,7 +102,7 @@
"Click here to select documents.": "Kliknite ovdje da odaberete dokumente.",
"click here.": "kliknite ovdje.",
"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
"Clone": "Klon",
"Clone": "Kloniraj",
"Close": "Zatvori",
"Collection": "Kolekcija",
"ComfyUI": "ComfyUI",
@@ -111,7 +112,7 @@
"Concurrent Requests": "Istodobni zahtjevi",
"Confirm Password": "Potvrdite lozinku",
"Connections": "Povezivanja",
"Contact Admin for WebUI Access": "",
"Contact Admin for WebUI Access": "Kontaktirajte admina za WebUI pristup",
"Content": "Sadržaj",
"Context Length": "Dužina konteksta",
"Continue Response": "Nastavi odgovor",
@@ -121,7 +122,7 @@
"Copy last response": "Kopiraj zadnji odgovor",
"Copy Link": "Kopiraj vezu",
"Copying to clipboard was successful!": "Kopiranje u međuspremnik je uspješno!",
"Create a model": "Stvaranje modela",
"Create a model": "Izradite model",
"Create Account": "Stvori račun",
"Create new key": "Stvori novi ključ",
"Create new secret key": "Stvori novi tajni ključ",
@@ -132,7 +133,7 @@
"Custom": "Prilagođeno",
"Customize models for a specific purpose": "Prilagodba modela za određenu svrhu",
"Dark": "Tamno",
"Dashboard": "",
"Dashboard": "Radna ploča",
"Database": "Baza podataka",
"December": "Prosinac",
"Default": "Zadano",
@@ -158,11 +159,11 @@
"Discover a prompt": "Otkrijte prompt",
"Discover, download, and explore custom prompts": "Otkrijte, preuzmite i istražite prilagođene prompte",
"Discover, download, and explore model presets": "Otkrijte, preuzmite i istražite unaprijed postavljene modele",
"Dismissible": "",
"Dismissible": "Odbaciti",
"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
"Document": "Dokument",
"Document Settings": "Postavke dokumenta",
"Documentation": "",
"Documentation": "Dokumentacija",
"Documents": "Dokumenti",
"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",
@@ -177,7 +178,7 @@
"Edit Doc": "Uredi dokument",
"Edit User": "Uredi korisnika",
"Email": "Email",
"Embedding Batch Size": "",
"Embedding Batch Size": "Embedding - Veličina batch-a",
"Embedding Model": "Embedding model",
"Embedding Model Engine": "Embedding model pogon",
"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
@@ -188,7 +189,7 @@
"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 a detail about yourself for your LLMs to recall": "Unesite pojedinosti o sebi da bi učitali memoriju u LLM",
"Enter Brave Search API Key": "Unesite ključ API-ja za hrabro pretraživanje",
"Enter Brave Search API Key": "Unesite Brave Search API ključ",
"Enter Chunk Overlap": "Unesite preklapanje dijelova",
"Enter Chunk Size": "Unesite veličinu dijela",
"Enter Github Raw URL": "Unesite Github sirovi URL",
@@ -199,9 +200,10 @@
"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
"Enter Score": "Unesite ocjenu",
"Enter Searxng Query URL": "Unos URL-a upita Searxng",
"Enter Serper API Key": "Unesite API ključ serpera",
"Enter Serpstack API Key": "Unesite API ključ Serpstack",
"Enter Searxng Query URL": "Unesite URL upita Searxng",
"Enter Serper API Key": "Unesite Serper API ključ",
"Enter Serply API Key": "Unesite Serply API ključ",
"Enter Serpstack API Key": "Unesite Serpstack API ključ",
"Enter stop sequence": "Unesite sekvencu zaustavljanja",
"Enter Top K": "Unesite Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Unesite URL (npr. http://127.0.0.1:7860/)",
@@ -214,15 +216,16 @@
"Experimental": "Eksperimentalno",
"Export": "Izvoz",
"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
"Export chat (.json)": "",
"Export chat (.json)": "Izvoz četa (.json)",
"Export Chats": "Izvoz razgovora",
"Export Documents Mapping": "Izvoz mapiranja dokumenata",
"Export Models": "Izvezi modele",
"Export Models": "Izvoz modela",
"Export Prompts": "Izvoz prompta",
"External Models": "",
"Export Tools": "Izvoz alata",
"External Models": "Vanjski modeli",
"Failed to create API Key.": "Neuspješno stvaranje API ključa.",
"Failed to read clipboard contents": "Neuspješno čitanje sadržaja međuspremnika",
"Failed to update settings": "",
"Failed to update settings": "Greška kod ažuriranja postavki",
"February": "Veljača",
"Feel free to add specific details": "Slobodno dodajte specifične detalje",
"File Mode": "Način datoteke",
@@ -235,7 +238,7 @@
"Frequency Penalty": "Kazna za učestalost",
"General": "Općenito",
"General Settings": "Opće postavke",
"Generate Image": "",
"Generate Image": "Gneriraj sliku",
"Generating search query": "Generiranje upita za pretraživanje",
"Generation Info": "Informacije o generaciji",
"Good Response": "Dobar odgovor",
@@ -256,11 +259,12 @@
"Import Documents Mapping": "Uvoz mapiranja dokumenata",
"Import Models": "Uvoz modela",
"Import Prompts": "Uvoz prompta",
"Import Tools": "Uvoz alata",
"Include `--api` flag when running stable-diffusion-webui": "Uključite zastavicu `--api` prilikom pokretanja stable-diffusion-webui",
"Info": "Informacije",
"Input commands": "Unos naredbi",
"Install from Github URL": "Instaliraj s Github URL-a",
"Instant Auto-Send After Voice Transcription": "",
"Instant Auto-Send After Voice Transcription": "Trenutačno automatsko slanje nakon glasovne transkripcije",
"Interface": "Sučelje",
"Invalid Tag": "Nevažeća oznaka",
"January": "Siječanj",
@@ -273,17 +277,17 @@
"JWT Token": "JWT token",
"Keep Alive": "Održavanje živim",
"Keyboard shortcuts": "Tipkovnički prečaci",
"Knowledge": "",
"Knowledge": "Znanje",
"Language": "Jezik",
"Last Active": "Zadnja aktivnost",
"Light": "Svijetlo",
"Listening...": "",
"Listening...": "Slušam...",
"LLMs can make mistakes. Verify important information.": "LLM-ovi mogu pogriješiti. Provjerite važne informacije.",
"Local Models": "",
"Local Models": "Lokalni modeli",
"LTR": "LTR",
"Made by OpenWebUI Community": "Izradio OpenWebUI Community",
"Make sure to enclose them with": "Provjerite da ih zatvorite s",
"Manage": "",
"Manage": "Upravljaj",
"Manage Models": "Upravljanje modelima",
"Manage Ollama Models": "Upravljanje Ollama modelima",
"Manage Pipelines": "Upravljanje cjevovodima",
@@ -303,13 +307,13 @@
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' je uspješno preuzet.",
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je već u redu za preuzimanje.",
"Model {{modelId}} not found": "Model {{modelId}} nije pronađen",
"Model {{modelName}} is not vision capable": "Model {{modelName}} nije sposoban za vid",
"Model {{modelName}} is not vision capable": "Model {{modelName}} ne čita vizualne impute",
"Model {{name}} is now {{status}}": "Model {{name}} sada je {{status}}",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Otkriven put datotečnog sustava modela. Kratko ime modela je potrebno za ažuriranje, nije moguće nastaviti.",
"Model ID": "ID modela",
"Model not selected": "Model nije odabran",
"Model Params": "Model Params",
"Model Whitelisting": "Bijela lista modela",
"Model Params": "Model parametri",
"Model Whitelisting": "Model - Bijela lista",
"Model(s) Whitelisted": "Model(i) na bijeloj listi",
"Modelfile Content": "Sadržaj datoteke modela",
"Models": "Modeli",
@@ -319,11 +323,11 @@
"Name your model": "Dodijelite naziv modelu",
"New Chat": "Novi razgovor",
"New Password": "Nova lozinka",
"No documents found": "",
"No documents found": "Dokumenti nisu pronađeni",
"No results found": "Nema rezultata",
"No search query generated": "Nije generiran upit za pretraživanje",
"No source available": "Nema dostupnog izvora",
"None": "Nijedan",
"None": "Ništa",
"Not factually correct": "Nije činjenično točno",
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
"Notifications": "Obavijesti",
@@ -336,7 +340,7 @@
"Ollama": "Ollama",
"Ollama API": "Ollama API",
"Ollama API disabled": "Ollama API je onemogućen",
"Ollama API is disabled": "",
"Ollama API is disabled": "Ollama API je onemogućen",
"Ollama Version": "Ollama verzija",
"On": "Uključeno",
"Only": "Samo",
@@ -359,12 +363,12 @@
"PDF document (.pdf)": "PDF dokument (.pdf)",
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
"pending": "u tijeku",
"Permission denied when accessing media devices": "",
"Permission denied when accessing microphone": "",
"Permission denied when accessing media devices": "Dopuštenje je odbijeno prilikom pristupa medijskim uređajima",
"Permission denied when accessing microphone": "Dopuštenje je odbijeno prilikom pristupa mikrofonu",
"Permission denied when accessing microphone: {{error}}": "Pristup mikrofonu odbijen: {{error}}",
"Personalization": "Prilagodba",
"Pipelines": "Cjevovodima",
"Pipelines Valves": "Cjevovodi, ventili",
"Pipelines": "Cjevovodi",
"Pipelines Valves": "Ventili za cjevovode",
"Plain text (.txt)": "Običan tekst (.txt)",
"Playground": "Igralište",
"Positive attitude": "Pozitivan stav",
@@ -383,7 +387,7 @@
"Read Aloud": "Čitaj naglas",
"Record voice": "Snimanje glasa",
"Redirecting you to OpenWebUI Community": "Preusmjeravanje na OpenWebUI zajednicu",
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Nazivajte se \"Korisnik\" (npr. \"Korisnik uči španjolski\")",
"Refused when it shouldn't have": "Odbijen kada nije trebao biti",
"Regenerate": "Regeneriraj",
"Release Notes": "Bilješke o izdanju",
@@ -395,14 +399,14 @@
"Reranking Model": "Model za ponovno rangiranje",
"Reranking model disabled": "Model za ponovno rangiranje onemogućen",
"Reranking model set to \"{{reranking_model}}\"": "Model za ponovno rangiranje postavljen na \"{{reranking_model}}\"",
"Reset Upload Directory": "",
"Reset Upload Directory": "Poništi upload direktorij",
"Reset Vector Storage": "Resetiraj pohranu vektora",
"Response AutoCopy to Clipboard": "Automatsko kopiranje odgovora u međuspremnik",
"Role": "Uloga",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "RTL",
"Running": "",
"Running": "Pokrenuto",
"Save": "Spremi",
"Save & Create": "Spremi i stvori",
"Save & Update": "Spremi i ažuriraj",
@@ -414,35 +418,38 @@
"Search a model": "Pretraži model",
"Search Chats": "Pretraži razgovore",
"Search Documents": "Pretraga dokumenata",
"Search Models": "Modeli pretraživanja",
"Search Models": "Pretražite modele",
"Search Prompts": "Pretraga prompta",
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Query Generation Prompt": "Upit za generiranje upita za pretraživanje",
"Search Query Generation Prompt Length Threshold": "Prag duljine upita za generiranje upita za pretraživanje",
"Search Result Count": "Broj rezultata pretraživanja",
"Search Tools": "Alati za pretraživanje",
"Searched {{count}} sites_one": "Pretraženo {{count}} sites_one",
"Searched {{count}} sites_few": "Pretraženo {{count}} sites_few",
"Searched {{count}} sites_other": "Pretraženo {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Traženje '{{searchQuery}}' na webu",
"Searxng Query URL": "URL upita Searxng",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng URL upita",
"See readme.md for instructions": "Pogledajte readme.md za upute",
"See what's new": "Pogledajte što je novo",
"Seed": "Sjeme",
"Select a base model": "Odabir osnovnog modela",
"Select a engine": "",
"Select a engine": "Odaberite pogon",
"Select a mode": "Odaberite način",
"Select a model": "Odaberite model",
"Select a pipeline": "Odabir kanala",
"Select a pipeline url": "Odabir URL-a kanala",
"Select an Ollama instance": "Odaberite Ollama instancu",
"Select Documents": "Odaberite dokumente",
"Select model": "Odaberite model",
"Select only one model to call": "",
"Select only one model to call": "Odaberite samo jedan model za poziv",
"Selected model(s) do not support image inputs": "Odabrani modeli ne podržavaju unose slika",
"Send": "Pošalji",
"Send a Message": "Pošaljite poruku",
"Send message": "Pošalji poruku",
"September": "Rujan",
"Serper API Key": "Serper API ključ",
"Serpstack API Key": "Tipka API za serpstack",
"Serply API Key": "Serply API ključ",
"Serpstack API Key": "Serpstack API API ključ",
"Server connection verified": "Veza s poslužiteljem potvrđena",
"Set as default": "Postavi kao zadano",
"Set Default Model": "Postavi zadani model",
@@ -450,11 +457,11 @@
"Set Image Size": "Postavi veličinu slike",
"Set reranking model (e.g. {{model}})": "Postavi model za ponovno rangiranje (npr. {{model}})",
"Set Steps": "Postavi korake",
"Set Task Model": "Postavi model zadatka",
"Set Task Model": "Postavite model zadatka",
"Set Voice": "Postavi glas",
"Settings": "Postavke",
"Settings saved successfully!": "Postavke su uspješno spremljene!",
"Settings updated successfully": "",
"Settings updated successfully": "Postavke uspješno ažurirane",
"Share": "Podijeli",
"Share Chat": "Podijeli razgovor",
"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",
@@ -472,7 +479,7 @@
"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
"Speech-to-Text Engine": "Stroj za prepoznavanje govora",
"Stop Sequence": "Zaustavi sekvencu",
"STT Model": "",
"STT Model": "STT model",
"STT Settings": "STT postavke",
"Submit": "Pošalji",
"Subtitle (e.g. about the Roman Empire)": "Podnaslov (npr. o Rimskom carstvu)",
@@ -491,9 +498,9 @@
"Thanks for your feedback!": "Hvala na povratnim informacijama!",
"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",
"Thinking...": "",
"Thinking...": "Razmišljam",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ovo osigurava da su vaši vrijedni razgovori sigurno spremljeni u bazu podataka. Hvala vam!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ovo je eksperimentalna značajka, možda neće funkcionirati prema očekivanjima i podložna je promjenama u bilo kojem trenutku.",
"This setting does not sync across browsers or devices.": "Ova postavka se ne sinkronizira između preglednika ili uređaja.",
"Thorough explanation": "Detaljno objašnjenje",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Savjet: Ažurirajte više mjesta za varijable uzastopno pritiskom na tipku tab u unosu razgovora nakon svake zamjene.",
@@ -505,17 +512,20 @@
"to": "do",
"To access the available model names for downloading,": "Za pristup dostupnim nazivima modela za preuzimanje,",
"To access the GGUF models available for downloading,": "Za pristup GGUF modelima dostupnim za preuzimanje,",
"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.": "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 chat input.": "u unos razgovora.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Danas",
"Toggle settings": "Prebaci postavke",
"Toggle sidebar": "Prebaci bočnu traku",
"Tools": "Alati",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemi s pristupom Ollama?",
"TTS Model": "",
"TTS Model": "TTS model",
"TTS Settings": "TTS postavke",
"TTS Voice": "",
"TTS Voice": "TTS glas",
"Type": "Tip",
"Type Hugging Face Resolve (Download) URL": "Upišite Hugging Face Resolve (Download) URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Pojavio se problem s povezivanjem na {{provider}}.",
@@ -523,8 +533,8 @@
"Update and Copy Link": "Ažuriraj i kopiraj vezu",
"Update password": "Ažuriraj lozinku",
"Upload a GGUF model": "Učitaj GGUF model",
"Upload Files": "Prenesi datoteke",
"Upload Pipeline": "",
"Upload Files": "Prijenos datoteka",
"Upload Pipeline": "Prijenos kanala",
"Upload Progress": "Napredak učitavanja",
"URL Mode": "URL način",
"Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.",
@@ -543,31 +553,31 @@
"Warning": "Upozorenje",
"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 API": "",
"Web API": "Web API",
"Web Loader Settings": "Postavke web učitavanja",
"Web Params": "Web parametri",
"Web Search": "Web-pretraživanje",
"Web Search Engine": "Web-tražilica",
"Web Search": "Internet pretraga",
"Web Search Engine": "Web tražilica",
"Webhook URL": "URL webkuke",
"WebUI Add-ons": "Dodaci za WebUI",
"WebUI Settings": "WebUI postavke",
"WebUI will make requests to": "WebUI će slati zahtjeve na",
"Whats New in": "Što je novo u",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kada je povijest isključena, novi razgovori na ovom pregledniku neće se pojaviti u vašoj povijesti na bilo kojem od vaših uređaja.",
"Whisper (Local)": "",
"Widescreen Mode": "",
"Whisper (Local)": "Whisper (lokalno)",
"Widescreen Mode": "Mod širokog zaslona",
"Workspace": "Radna ploča",
"Write a prompt suggestion (e.g. Who are you?)": "Napišite prijedlog prompta (npr. Tko si ti?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Napišite sažetak u 50 riječi koji sažima [temu ili ključnu riječ].",
"Yesterday": "Jučer",
"You": "Vi",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Možete personalizirati svoje interakcije s LLM-ima dodavanjem uspomena putem gumba 'Upravljanje' u nastavku, čineći ih korisnijima i prilagođenijima vama.",
"You cannot clone a base model": "Ne možete klonirati osnovni model",
"You have no archived conversations.": "Nemate arhiviranih razgovora.",
"You have shared this chat": "Podijelili ste ovaj razgovor",
"You're a helpful assistant.": "Vi ste korisni asistent.",
"You're now logged in.": "Sada ste prijavljeni.",
"Your account status is currently pending activation.": "",
"Your account status is currently pending activation.": "Status vašeg računa trenutno čeka aktivaciju.",
"Youtube": "YouTube",
"Youtube Loader Settings": "YouTube postavke učitavanja"
}
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Pannello di amministrazione",
"Admin Settings": "Impostazioni amministratore",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Parametri avanzati",
"Advanced Params": "Parametri avanzati",
"all": "tutti",
@@ -201,6 +202,7 @@
"Enter Score": "Inserisci il punteggio",
"Enter Searxng Query URL": "Immettere l'URL della query Searxng",
"Enter Serper API Key": "Inserisci la chiave API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Inserisci la chiave API Serpstack",
"Enter stop sequence": "Inserisci la sequenza di arresto",
"Enter Top K": "Inserisci Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Esporta mappatura documenti",
"Export Models": "Esporta modelli",
"Export Prompts": "Esporta prompt",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Impossibile creare la chiave API.",
"Failed to read clipboard contents": "Impossibile leggere il contenuto degli appunti",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importa mappatura documenti",
"Import Models": "Importazione di modelli",
"Import Prompts": "Importa prompt",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Includi il flag `--api` quando esegui stable-diffusion-webui",
"Info": "Informazioni",
"Input commands": "Comandi di input",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Conteggio dei risultati della ricerca",
"Search Tools": "",
"Searched {{count}} sites_one": "Ricercato {{count}} sites_one",
"Searched {{count}} sites_many": "Ricercato {{count}} sites_many",
"Searched {{count}} sites_other": "Ricercato {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Ricerca sul web di '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng Query URL",
"See readme.md for instructions": "Vedi readme.md per le istruzioni",
"See what's new": "Guarda le novità",
@@ -434,6 +439,7 @@
"Select a pipeline": "Selezionare una tubazione",
"Select a pipeline url": "Selezionare l'URL di una pipeline",
"Select an Ollama instance": "Seleziona un'istanza Ollama",
"Select Documents": "",
"Select model": "Seleziona modello",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "I modelli selezionati non supportano l'input di immagini",
@@ -442,6 +448,7 @@
"Send message": "Invia messaggio",
"September": "Settembre",
"Serper API Key": "Chiave API Serper",
"Serply API Key": "",
"Serpstack API Key": "Chiave API Serpstack",
"Server connection verified": "Connessione al server verificata",
"Set as default": "Imposta come predefinito",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Per accedere ai nomi dei modelli disponibili per il download,",
"To access the GGUF models available for downloading,": "Per accedere ai modelli GGUF disponibili per il download,",
"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 chat input.": "all'input della chat.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Oggi",
"Toggle settings": "Attiva/disattiva impostazioni",
"Toggle sidebar": "Attiva/disattiva barra laterale",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemi di accesso a Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "管理者パネル",
"Admin Settings": "管理者設定",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "詳細パラメーター",
"Advanced Params": "高度なパラメータ",
"all": "すべて",
@@ -201,6 +202,7 @@
"Enter Score": "スコアを入力してください",
"Enter Searxng Query URL": "SearxngクエリURLを入力",
"Enter Serper API Key": "Serper APIキーの入力",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack APIキーの入力",
"Enter stop sequence": "ストップシーケンスを入力してください",
"Enter Top K": "トップ K を入力してください",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
"Export Models": "モデルのエクスポート",
"Export Prompts": "プロンプトをエクスポート",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "APIキーの作成に失敗しました。",
"Failed to read clipboard contents": "クリップボードの内容を読み取れませんでした",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "ドキュメントマッピングをインポート",
"Import Models": "モデルのインポート",
"Import Prompts": "プロンプトをインポート",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webuiを実行する際に`--api`フラグを含める",
"Info": "情報",
"Input commands": "入力コマンド",
@@ -419,8 +423,9 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "検索結果数",
"Search Tools": "",
"Searched {{count}} sites_other": "{{count}} sites_other検索",
"Searching the web for '{{searchQuery}}'": "ウェブで '{{searchQuery}}' を検索する",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng クエリ URL",
"See readme.md for instructions": "手順については readme.md を参照してください",
"See what's new": "新機能を見る",
@@ -432,6 +437,7 @@
"Select a pipeline": "パイプラインの選択",
"Select a pipeline url": "パイプラインの URL を選択する",
"Select an Ollama instance": "Ollama インスタンスを選択",
"Select Documents": "",
"Select model": "モデルを選択",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "一部のモデルは画像入力をサポートしていません",
@@ -440,6 +446,7 @@
"Send message": "メッセージを送信",
"September": "9月",
"Serper API Key": "Serper APIキー",
"Serply API Key": "",
"Serpstack API Key": "Serpstack APIキー",
"Server connection verified": "サーバー接続が確認されました",
"Set as default": "デフォルトに設定",
@@ -504,10 +511,13 @@
"To access the available model names for downloading,": "ダウンロード可能なモデル名にアクセスするには、",
"To access the GGUF models available for downloading,": "ダウンロード可能な GGUF モデルにアクセスするには、",
"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 chat input.": "チャット入力へ。",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "今日",
"Toggle settings": "設定を切り替え",
"Toggle sidebar": "サイドバーを切り替え",
"Tools": "",
"Top K": "トップ K",
"Top P": "トップ P",
"Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "ადმინ პანელი",
"Admin Settings": "ადმინისტრატორის ხელსაწყოები",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "დამატებითი პარამეტრები",
"Advanced Params": "მოწინავე პარამები",
"all": "ყველა",
@@ -201,6 +202,7 @@
"Enter Score": "შეიყვანეთ ქულა",
"Enter Searxng Query URL": "შეიყვანეთ Searxng Query URL",
"Enter Serper API Key": "შეიყვანეთ Serper API Key",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key",
"Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა",
"Enter Top K": "შეიყვანეთ Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
"Export Models": "ექსპორტის მოდელები",
"Export Prompts": "მოთხოვნების ექსპორტი",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API ღილაკის შექმნა ვერ მოხერხდა.",
"Failed to read clipboard contents": "ბუფერში შიგთავსის წაკითხვა ვერ მოხერხდა",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "დოკუმენტების კავშირის იმპორტი",
"Import Models": "იმპორტის მოდელები",
"Import Prompts": "მოთხოვნების იმპორტი",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "ჩართეთ `--api` დროშა stable-diffusion-webui-ის გაშვებისას",
"Info": "ინფორმაცია",
"Input commands": "შეყვანით ბრძანებებს",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "ძიების შედეგების რაოდენობა",
"Search Tools": "",
"Searched {{count}} sites_one": "Searched {{count}} sites_one",
"Searched {{count}} sites_other": "Searched {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "ეძებს ვებ '{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng Query URL",
"See readme.md for instructions": "იხილეთ readme.md ინსტრუქციებისთვის",
"See what's new": "სიახლეების ნახვა",
@@ -433,6 +438,7 @@
"Select a pipeline": "აირჩიეთ მილსადენი",
"Select a pipeline url": "აირჩიეთ მილსადენის url",
"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
"Select Documents": "",
"Select model": "მოდელის არჩევა",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "შერჩეული მოდელი (ებ) ი არ უჭერს მხარს გამოსახულების შეყვანას",
@@ -441,6 +447,7 @@
"Send message": "შეტყობინების გაგზავნა",
"September": "სექტემბერი",
"Serper API Key": "Serper API Key",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API Key",
"Server connection verified": "სერვერთან კავშირი დადასტურებულია",
"Set as default": "დეფოლტად დაყენება",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "ჩამოტვირთვისთვის ხელმისაწვდომი მოდელების სახელებზე წვდომისთვის",
"To access the GGUF models available for downloading,": "ჩასატვირთად ხელმისაწვდომი GGUF მოდელებზე წვდომისთვის",
"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 chat input.": "ჩატში",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "დღეს",
"Toggle settings": "პარამეტრების გადართვა",
"Toggle sidebar": "გვერდითი ზოლის გადართვა",
"Tools": "",
"Top K": "ტოპ K",
"Top P": "ტოპ P",
"Trouble accessing Ollama?": "Ollama-ს ვერ უკავშირდები?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "관리자 패널",
"Admin Settings": "관리자 설정",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "고급 매개변수",
"Advanced Params": "고급 매개 변수",
"all": "모두",
@@ -201,6 +202,7 @@
"Enter Score": "점수 입력",
"Enter Searxng Query URL": "Searxng 쿼리 URL 입력",
"Enter Serper API Key": "Serper API Key 입력",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack API Key 입력",
"Enter stop sequence": "중지 시퀀스 입력",
"Enter Top K": "Top K 입력",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "문서 매핑 내보내기",
"Export Models": "모델 내보내기",
"Export Prompts": "프롬프트 내보내기",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API 키 생성에 실패했습니다.",
"Failed to read clipboard contents": "클립보드 내용을 읽는 데 실패했습니다.",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "문서 매핑 가져오기",
"Import Models": "모델 가져오기",
"Import Prompts": "프롬프트 가져오기",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui를 실행할 때 '--api' 플래그 포함",
"Info": "정보",
"Input commands": "입력 명령",
@@ -419,8 +423,9 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "검색 결과 개수",
"Search Tools": "",
"Searched {{count}} sites_other": "{{count}} sites_other 검색됨",
"Searching the web for '{{searchQuery}}'": "웹에서 '{{searchQuery}}' 검색",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng 쿼리 URL",
"See readme.md for instructions": "설명은 readme.md를 참조하세요.",
"See what's new": "새로운 기능 보기",
@@ -432,6 +437,7 @@
"Select a pipeline": "파이프라인 선택",
"Select a pipeline url": "파이프라인 URL 선택",
"Select an Ollama instance": "Ollama 인스턴스 선택",
"Select Documents": "",
"Select model": "모델 선택",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "선택한 모델은 이미지 입력을 지원하지 않습니다.",
@@ -440,6 +446,7 @@
"Send message": "메시지 보내기",
"September": "9월",
"Serper API Key": "Serper API 키",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API 키",
"Server connection verified": "서버 연결 확인됨",
"Set as default": "기본값으로 설정",
@@ -504,10 +511,13 @@
"To access the available model names for downloading,": "다운로드 가능한 모델명을 확인하려면,",
"To access the GGUF models available for downloading,": "다운로드 가능한 GGUF 모델을 확인하려면,",
"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 chat input.": "채팅 입력으로.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "오늘",
"Toggle settings": "설정 전환",
"Toggle sidebar": "사이드바 전환",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Ollama에 접근하는 데 문제가 있나요?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Administratorių panelė",
"Admin Settings": "Administratorių nustatymai",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Gilieji nustatymai",
"Advanced Params": "",
"all": "visi",
@@ -201,6 +202,7 @@
"Enter Score": "Įveskite rezultatą",
"Enter Searxng Query URL": "",
"Enter Serper API Key": "",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "",
"Enter stop sequence": "Įveskite pabaigos sekvenciją",
"Enter Top K": "Įveskite Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Eksportuoti dokumentų žemėlapį",
"Export Models": "",
"Export Prompts": "Eksportuoti užklausas",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Nepavyko sukurti API rakto",
"Failed to read clipboard contents": "Nepavyko perskaityti kopijuoklės",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importuoti dokumentų žemėlapį",
"Import Models": "",
"Import Prompts": "Importuoti užklausas",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Pridėti `--api` kai vykdomas stable-diffusion-webui",
"Info": "",
"Input commands": "Įvesties komandos",
@@ -419,11 +423,12 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "",
"Search Tools": "",
"Searched {{count}} sites_one": "",
"Searched {{count}} sites_few": "",
"Searched {{count}} sites_many": "",
"Searched {{count}} sites_other": "",
"Searching the web for '{{searchQuery}}'": "",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "",
"See readme.md for instructions": "Žiūrėti readme.md papildomoms instrukcijoms",
"See what's new": "Žiūrėti naujoves",
@@ -435,6 +440,7 @@
"Select a pipeline": "",
"Select a pipeline url": "",
"Select an Ollama instance": "Pasirinkti Ollama instanciją",
"Select Documents": "",
"Select model": "Pasirinkti modelį",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "",
@@ -443,6 +449,7 @@
"Send message": "Siųsti žinutę",
"September": "rugsėjis",
"Serper API Key": "",
"Serply API Key": "",
"Serpstack API Key": "",
"Server connection verified": "Serverio sujungimas patvirtintas",
"Set as default": "Nustatyti numatytąjį",
@@ -507,10 +514,13 @@
"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 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 chat input.": "į pokalbio įvestį",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Šiandien",
"Toggle settings": "Atverti/užverti parametrus",
"Toggle sidebar": "Atverti/užverti šoninį meniu",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemos prieinant prie Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Administrasjonspanel",
"Admin Settings": "Administrasjonsinnstillinger",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Avanserte parametere",
"Advanced Params": "Avanserte parametere",
"all": "alle",
@@ -201,6 +202,7 @@
"Enter Score": "Skriv inn poengsum",
"Enter Searxng Query URL": "Skriv inn Searxng forespørsels-URL",
"Enter Serper API Key": "Skriv inn Serper API-nøkkel",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Skriv inn Serpstack API-nøkkel",
"Enter stop sequence": "Skriv inn stoppsekvens",
"Enter Top K": "Skriv inn Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Eksporter dokumentkartlegging",
"Export Models": "Eksporter modeller",
"Export Prompts": "Eksporter prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Kunne ikke opprette API-nøkkel.",
"Failed to read clipboard contents": "Kunne ikke lese utklippstavleinnhold",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importer dokumentkartlegging",
"Import Models": "Importer modeller",
"Import Prompts": "Importer prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api`-flagget når du kjører stable-diffusion-webui",
"Info": "Info",
"Input commands": "Inntast kommandoer",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Antall søkeresultater",
"Search Tools": "",
"Searched {{count}} sites_one": "Søkte på {{count}} side",
"Searched {{count}} sites_other": "Søkte på {{count}} sider",
"Searching the web for '{{searchQuery}}'": "Søker på nettet etter '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng forespørsels-URL",
"See readme.md for instructions": "Se readme.md for instruksjoner",
"See what's new": "Se hva som er nytt",
@@ -433,6 +438,7 @@
"Select a pipeline": "Velg en pipeline",
"Select a pipeline url": "Velg en pipeline-URL",
"Select an Ollama instance": "Velg en Ollama-instans",
"Select Documents": "",
"Select model": "Velg modell",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
@@ -441,6 +447,7 @@
"Send message": "Send melding",
"September": "September",
"Serper API Key": "Serper API-nøkkel",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API-nøkkel",
"Server connection verified": "Servertilkobling bekreftet",
"Set as default": "Sett som standard",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "For å få tilgang til tilgjengelige modelnavn for nedlasting,",
"To access the GGUF models available for downloading,": "For å få tilgang til GGUF-modellene som er tilgjengelige for nedlasting,",
"To access the 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 chat input.": "til chatinput.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "I dag",
"Toggle settings": "Veksle innstillinger",
"Toggle sidebar": "Veksle sidefelt",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemer med tilgang til Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Administratieve Paneel",
"Admin Settings": "Administratieve Settings",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Geavanceerde Parameters",
"Advanced Params": "Geavanceerde parameters",
"all": "alle",
@@ -201,6 +202,7 @@
"Enter Score": "Voeg score toe",
"Enter Searxng Query URL": "Voer de URL van de Searxng-query in",
"Enter Serper API Key": "Voer de Serper API-sleutel in",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Voer de Serpstack API-sleutel in",
"Enter stop sequence": "Zet stop sequentie",
"Enter Top K": "Voeg Top K toe",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exporteer Documenten Mapping",
"Export Models": "Modellen exporteren",
"Export Prompts": "Exporteer Prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Kan API Key niet aanmaken.",
"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importeer Documenten Mapping",
"Import Models": "Modellen importeren",
"Import Prompts": "Importeer Prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
"Info": "Info",
"Input commands": "Voer commando's in",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Aantal zoekresultaten",
"Search Tools": "",
"Searched {{count}} sites_one": "Gezocht op {{count}} sites_one",
"Searched {{count}} sites_other": "Gezocht op {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Zoeken op internet naar '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng Query URL",
"See readme.md for instructions": "Zie readme.md voor instructies",
"See what's new": "Zie wat er nieuw is",
@@ -433,6 +438,7 @@
"Select a pipeline": "Selecteer een pijplijn",
"Select a pipeline url": "Selecteer een pijplijn-URL",
"Select an Ollama instance": "Selecteer een Ollama instantie",
"Select Documents": "",
"Select model": "Selecteer een model",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer",
@@ -441,6 +447,7 @@
"Send message": "Stuur bericht",
"September": "September",
"Serper API Key": "Serper API-sleutel",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API-sleutel",
"Server connection verified": "Server verbinding geverifieerd",
"Set as default": "Stel in als standaard",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
"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 chat input.": "naar chat input.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Vandaag",
"Toggle settings": "Wissel instellingen",
"Toggle sidebar": "Wissel sidebar",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemen met toegang tot Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "ਪ੍ਰਬੰਧਕ ਪੈਨਲ",
"Admin Settings": "ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "ਉੱਚ ਸਤਰ ਦੇ ਪੈਰਾਮੀਟਰ",
"Advanced Params": "ਐਡਵਾਂਸਡ ਪਰਮਜ਼",
"all": "ਸਾਰੇ",
@@ -201,6 +202,7 @@
"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
"Enter Searxng Query URL": "Searxng Query URL ਦਾਖਲ ਕਰੋ",
"Enter Serper API Key": "Serper API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
"Enter stop sequence": "ਰੋਕਣ ਦਾ ਕ੍ਰਮ ਦਰਜ ਕਰੋ",
"Enter Top K": "ਸਿਖਰ K ਦਰਜ ਕਰੋ",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
"Export Models": "ਨਿਰਯਾਤ ਮਾਡਲ",
"Export Prompts": "ਪ੍ਰੰਪਟ ਨਿਰਯਾਤ ਕਰੋ",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API ਕੁੰਜੀ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ।",
"Failed to read clipboard contents": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਪੜ੍ਹਣ ਵਿੱਚ ਅਸਫਲ",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਆਯਾਤ ਕਰੋ",
"Import Models": "ਮਾਡਲ ਆਯਾਤ ਕਰੋ",
"Import Prompts": "ਪ੍ਰੰਪਟ ਆਯਾਤ ਕਰੋ",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "ਸਟੇਬਲ-ਡਿਫਿਊਸ਼ਨ-ਵੈਬਯੂਆਈ ਚਲਾਉਣ ਸਮੇਂ `--api` ਝੰਡਾ ਸ਼ਾਮਲ ਕਰੋ",
"Info": "ਜਾਣਕਾਰੀ",
"Input commands": "ਇਨਪੁਟ ਕਮਾਂਡਾਂ",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "ਖੋਜ ਨਤੀਜੇ ਦੀ ਗਿਣਤੀ",
"Search Tools": "",
"Searched {{count}} sites_one": "ਖੋਜਿਆ {{count}} sites_one",
"Searched {{count}} sites_other": "ਖੋਜਿਆ {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' ਲਈ ਵੈੱਬ 'ਤੇ ਖੋਜ ਕਰਨਾ",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng Query URL",
"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
@@ -433,6 +438,7 @@
"Select a pipeline": "ਪਾਈਪਲਾਈਨ ਚੁਣੋ",
"Select a pipeline url": "ਪਾਈਪਲਾਈਨ URL ਚੁਣੋ",
"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
"Select Documents": "",
"Select model": "ਮਾਡਲ ਚੁਣੋ",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "ਚੁਣੇ ਗਏ ਮਾਡਲ(ਆਂ) ਚਿੱਤਰ ਇਨਪੁੱਟਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ",
@@ -441,6 +447,7 @@
"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
"September": "ਸਤੰਬਰ",
"Serper API Key": "Serper API ਕੁੰਜੀ",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API ਕੁੰਜੀ",
"Server connection verified": "ਸਰਵਰ ਕਨੈਕਸ਼ਨ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ",
"Set as default": "ਮੂਲ ਵਜੋਂ ਸੈੱਟ ਕਰੋ",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਮਾਡਲ ਨਾਮਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
"To access the GGUF models available for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ GGUF ਮਾਡਲਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
"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 chat input.": "ਗੱਲਬਾਤ ਇਨਪੁਟ ਲਈ।",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "ਅੱਜ",
"Toggle settings": "ਸੈਟਿੰਗਾਂ ਟੌਗਲ ਕਰੋ",
"Toggle sidebar": "ਸਾਈਡਬਾਰ ਟੌਗਲ ਕਰੋ",
"Tools": "",
"Top K": "ਸਿਖਰ K",
"Top P": "ਸਿਖਰ P",
"Trouble accessing Ollama?": "ਓਲਾਮਾ ਤੱਕ ਪਹੁੰਚਣ ਵਿੱਚ ਮੁਸ਼ਕਲ?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Panel administracyjny",
"Admin Settings": "Ustawienia administratora",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Zaawansowane parametry",
"Advanced Params": "Zaawansowane parametry",
"all": "wszyscy",
@@ -201,6 +202,7 @@
"Enter Score": "Wprowadź wynik",
"Enter Searxng Query URL": "Wprowadź adres URL zapytania Searxng",
"Enter Serper API Key": "Wprowadź klucz API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Wprowadź klucz API Serpstack",
"Enter stop sequence": "Wprowadź sekwencję zatrzymania",
"Enter Top K": "Wprowadź Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Eksportuj mapowanie dokumentów",
"Export Models": "Eksportuj modele",
"Export Prompts": "Eksportuj prompty",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Nie udało się utworzyć klucza API.",
"Failed to read clipboard contents": "Nie udało się odczytać zawartości schowka",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importuj mapowanie dokumentów",
"Import Models": "Importowanie modeli",
"Import Prompts": "Importuj prompty",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Dołącz flagę `--api` podczas uruchamiania stable-diffusion-webui",
"Info": "Informacji",
"Input commands": "Wprowadź komendy",
@@ -419,11 +423,12 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Liczba wyników wyszukiwania",
"Search Tools": "",
"Searched {{count}} sites_one": "Wyszukiwano {{count}} sites_one",
"Searched {{count}} sites_few": "Wyszukiwano {{count}} sites_few",
"Searched {{count}} sites_many": "Wyszukiwano {{count}} sites_many",
"Searched {{count}} sites_other": "Wyszukiwano {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Wyszukiwanie w Internecie \"{{searchQuery}}\"",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Adres URL zapytania Searxng",
"See readme.md for instructions": "Zajrzyj do readme.md po instrukcje",
"See what's new": "Zobacz co nowego",
@@ -435,6 +440,7 @@
"Select a pipeline": "Wybieranie potoku",
"Select a pipeline url": "Wybieranie adresu URL potoku",
"Select an Ollama instance": "Wybierz instancję Ollama",
"Select Documents": "",
"Select model": "Wybierz model",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych obrazu",
@@ -443,6 +449,7 @@
"Send message": "Wyślij wiadomość",
"September": "Wrzesień",
"Serper API Key": "Klucz API Serper",
"Serply API Key": "",
"Serpstack API Key": "Klucz API Serpstack",
"Server connection verified": "Połączenie z serwerem zweryfikowane",
"Set as default": "Ustaw jako domyślne",
@@ -507,10 +514,13 @@
"To access the available model names for downloading,": "Aby uzyskać dostęp do dostępnych nazw modeli do pobrania,",
"To access the GGUF models available for downloading,": "Aby uzyskać dostęp do dostępnych modeli GGUF do pobrania,",
"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 chat input.": "do pola wprowadzania czatu.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Dzisiaj",
"Toggle settings": "Przełącz ustawienia",
"Toggle sidebar": "Przełącz panel boczny",
"Tools": "",
"Top K": "Najlepsze K",
"Top P": "Najlepsze P",
"Trouble accessing Ollama?": "Problemy z dostępem do Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Painel do Administrador",
"Admin Settings": "Configurações do Administrador",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Parâmetros Avançados",
"Advanced Params": "Params Avançados",
"all": "todos",
@@ -201,6 +202,7 @@
"Enter Score": "Digite a Pontuação",
"Enter Searxng Query URL": "Insira a URL de consulta do Searxng",
"Enter Serper API Key": "Digite a chave da API do Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Digite a chave da API Serpstack",
"Enter stop sequence": "Digite a sequência de parada",
"Enter Top K": "Digite o Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exportar Mapeamento de Documentos",
"Export Models": "Modelos de Exportação",
"Export Prompts": "Exportar Prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Falha ao criar a Chave da API.",
"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importar Mapeamento de Documentos",
"Import Models": "Modelos de Importação",
"Import Prompts": "Importar Prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
"Info": "Informação",
"Input commands": "Comandos de entrada",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Contagem de resultados de pesquisa",
"Search Tools": "",
"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL de consulta Searxng",
"See readme.md for instructions": "Consulte readme.md para obter instruções",
"See what's new": "Veja o que há de novo",
@@ -434,6 +439,7 @@
"Select a pipeline": "Selecione um pipeline",
"Select a pipeline url": "Selecione uma URL de pipeline",
"Select an Ollama instance": "Selecione uma instância Ollama",
"Select Documents": "",
"Select model": "Selecione um modelo",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entrada(s) de imagem",
@@ -442,6 +448,7 @@
"Send message": "Enviar mensagem",
"September": "Setembro",
"Serper API Key": "Chave de API Serper",
"Serply API Key": "",
"Serpstack API Key": "Chave de API Serpstack",
"Server connection verified": "Conexão com o servidor verificada",
"Set as default": "Definir como padrão",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
"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 chat input.": "para a entrada de bate-papo.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Hoje",
"Toggle settings": "Alternar configurações",
"Toggle sidebar": "Alternar barra lateral",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
+221 -211
View File
@@ -5,16 +5,16 @@
"(latest)": "(mais recente)",
"{{ models }}": "{{ modelos }}",
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Não é possível excluir um modelo base",
"{{modelName}} is thinking...": "{{modelName}} está pensando...",
"{{modelName}} is thinking...": "{{modelName}} está a pensar...",
"{{user}}'s Chats": "{{user}}'s Chats",
"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao executar tarefas como gerar títulos para bate-papos e consultas de pesquisa na Web",
"a user": "um usuário",
"About": "Sobre",
"a user": "um utilizador",
"About": "Acerca de",
"Account": "Conta",
"Account Activation Pending": "",
"Account Activation Pending": "Ativação da Conta Pendente",
"Accurate information": "Informações precisas",
"Active Users": "",
"Active Users": "Utilizadores Ativos",
"Add": "Adicionar",
"Add a model id": "Adicionar um ID de modelo",
"Add a short description about what this model does": "Adicione uma breve descrição sobre o que este modelo faz",
@@ -22,30 +22,31 @@
"Add a tag": "Adicionar uma tag",
"Add custom prompt": "Adicionar um prompt curto",
"Add Docs": "Adicionar Documentos",
"Add Files": "Adicionar Arquivos",
"Add Files": "Adicionar Ficheiros",
"Add Memory": "Adicionar memória",
"Add message": "Adicionar mensagem",
"Add Model": "Adicionar modelo",
"Add Tags": "adicionar tags",
"Add User": "Adicionar Usuário",
"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os usuários.",
"Add User": "Adicionar Utilizador",
"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os utilizadores.",
"admin": "administrador",
"Admin": "",
"Admin": "Admin",
"Admin Panel": "Painel do Administrador",
"Admin Settings": "Configurações do Administrador",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Parâmetros Avançados",
"Advanced Params": "Params Avançados",
"all": "todos",
"All Documents": "Todos os Documentos",
"All Users": "Todos os Usuários",
"All Users": "Todos os utilizadores",
"Allow": "Permitir",
"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
"Allow non-local voices": "",
"Allow Chat Deletion": "Permitir Exclusão de Conversa",
"Allow non-local voices": "Permitir vozes não locais",
"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
"Already have an account?": "Já tem uma conta?",
"an assistant": "um assistente",
"and": "e",
"and create a new shared link.": "e criar um novo link compartilhado.",
"and create a new shared link.": "e criar um novo link partilhado.",
"API Base URL": "URL Base da API",
"API Key": "Chave da API",
"API Key created.": "Chave da API criada.",
@@ -53,69 +54,69 @@
"April": "Abril",
"Archive": "Arquivo",
"Archive All Chats": "Arquivar todos os chats",
"Archived Chats": "Bate-papos arquivados",
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
"Are you sure?": "Tem certeza?",
"Attach file": "Anexar arquivo",
"Archived Chats": "Conversas arquivadas",
"are allowed - Activate this command by typing": "são permitidos - Ative este comando escrevendo",
"Are you sure?": "Tem a certeza?",
"Attach file": "Anexar ficheiro",
"Attention to detail": "Detalhado",
"Audio": "Áudio",
"August": "Agosto",
"Auto-playback response": "Reprodução automática da resposta",
"AUTOMATIC1111 Base URL": "URL Base do AUTOMATIC1111",
"AUTOMATIC1111 Base URL is required.": "A URL Base do AUTOMATIC1111 é obrigatória.",
"AUTOMATIC1111 Base URL is required.": "O URL Base do AUTOMATIC1111 é obrigatório.",
"available!": "disponível!",
"Back": "Voltar",
"Bad Response": "Resposta ruim",
"Bad Response": "Resposta má",
"Banners": "Estandartes",
"Base Model (From)": "Modelo Base (De)",
"before": "antes",
"Being lazy": "Ser preguiçoso",
"Brave Search API Key": "Chave da API de Pesquisa Admirável",
"Brave Search API Key": "Chave da API de Pesquisa Brave",
"Bypass SSL verification for Websites": "Ignorar verificação SSL para sites",
"Call": "",
"Call feature is not supported when using Web STT engine": "",
"Camera": "",
"Call": "Chamar",
"Call feature is not supported when using Web STT engine": "A funcionalide de Chamar não é suportada quando usa um motor Web STT",
"Camera": "Camera",
"Cancel": "Cancelar",
"Capabilities": "Capacidades",
"Change Password": "Alterar Senha",
"Chat": "Bate-papo",
"Chat Bubble UI": "UI de Bala de Bate-papo",
"Chat direction": "Direção do Bate-papo",
"Chat History": "Histórico de Bate-papo",
"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
"Chats": "Bate-papos",
"Chat": "Conversa",
"Chat Bubble UI": "Bolha UI da Conversa",
"Chat direction": "Direção da Conversa",
"Chat History": "Histórico da Conversa",
"Chat History is off for this browser.": "O histórico da conversa está desativado para este navegador.",
"Chats": "Conversas",
"Check Again": "Verifique novamente",
"Check for updates": "Verificar atualizações",
"Checking for updates...": "Verificando atualizações...",
"Choose a model before saving...": "Escolha um modelo antes de salvar...",
"Choose a model before saving...": "Escolha um modelo antes de guardar...",
"Chunk Overlap": "Sobreposição de Fragmento",
"Chunk Params": "Parâmetros de Fragmento",
"Chunk Size": "Tamanho do Fragmento",
"Citation": "Citação",
"Clear memory": "",
"Clear memory": "Limpar memória",
"Click here for help.": "Clique aqui para obter ajuda.",
"Click here to": "Clique aqui para",
"Click here to select": "Clique aqui para selecionar",
"Click here to select a csv file.": "Clique aqui para selecionar um arquivo csv.",
"Click here to select a py file.": "",
"Click here to select a csv file.": "Clique aqui para selecionar um ficheiro csv.",
"Click here to select a py file.": "Clique aqui para selecionar um ficheiro py",
"Click here to select documents.": "Clique aqui para selecionar documentos.",
"click here.": "clique aqui.",
"Click on the user role button to change a user's role.": "Clique no botão de função do usuário para alterar a função de um usuário.",
"Clone": "Clone",
"Click on the user role button to change a user's role.": "Clique no botão de função do utilizador para alterar a função de um utilizador.",
"Clone": "Clonar",
"Close": "Fechar",
"Collection": "Coleção",
"ComfyUI": "ComfyUI",
"ComfyUI Base URL": "URL Base do ComfyUI",
"ComfyUI Base URL is required.": "A URL Base do ComfyUI é obrigatória.",
"ComfyUI Base URL is required.": "O URL Base do ComfyUI é obrigatório.",
"Command": "Comando",
"Concurrent Requests": "Solicitações simultâneas",
"Confirm Password": "Confirmar Senha",
"Connections": "Conexões",
"Contact Admin for WebUI Access": "",
"Contact Admin for WebUI Access": "Contatar Admin para acesso ao WebUI",
"Content": "Conteúdo",
"Context Length": "Comprimento do Contexto",
"Continue Response": "Continuar resposta",
"Copied shared chat URL to clipboard!": "URL de bate-papo compartilhado copiada com sucesso!",
"Copied shared chat URL to clipboard!": "URL de Conversa partilhado copiada com sucesso!",
"Copy": "Copiar",
"Copy last code block": "Copiar último bloco de código",
"Copy last response": "Copiar última resposta",
@@ -132,8 +133,8 @@
"Custom": "Personalizado",
"Customize models for a specific purpose": "Personalizar modelos para uma finalidade específica",
"Dark": "Escuro",
"Dashboard": "",
"Database": "Banco de dados",
"Dashboard": "Painel",
"Database": "Base de dados",
"December": "Dezembro",
"Default": "Padrão",
"Default (Automatic1111)": "Padrão (Automatic1111)",
@@ -141,126 +142,129 @@
"Default Model": "Modelo padrão",
"Default model updated": "Modelo padrão atualizado",
"Default Prompt Suggestions": "Sugestões de Prompt Padrão",
"Default User Role": "Função de Usuário Padrão",
"delete": "excluir",
"Delete": "Excluir",
"Delete a model": "Excluir um modelo",
"Delete All Chats": "Excluir todos os chats",
"Delete chat": "Excluir bate-papo",
"Delete Chat": "Excluir Bate-papo",
"delete this link": "excluir este link",
"Delete User": "Excluir Usuário",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
"Deleted {{name}}": "Suprimido {{name}}",
"Default User Role": "Função de Utilizador Padrão",
"delete": "apagar",
"Delete": "Apagar",
"Delete a model": "Apagar um modelo",
"Delete All Chats": "Apagar todas as conversas",
"Delete chat": "Apagar conversa",
"Delete Chat": "Apagar Conversa",
"delete this link": "apagar este link",
"Delete User": "Apagar Utilizador",
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} apagado",
"Deleted {{name}}": "Apagado {{name}}",
"Description": "Descrição",
"Didn't fully follow instructions": "Não seguiu instruções com precisão",
"Discover a model": "Descubra um modelo",
"Discover a prompt": "Descobrir um prompt",
"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
"Dismissible": "",
"Display the username instead of You in the Chat": "Exibir o nome de usuário em vez de Você no Bate-papo",
"Discover, download, and explore custom prompts": "Descubra, descarregue e explore prompts personalizados",
"Discover, download, and explore model presets": "Descubra, descarregue e explore predefinições de modelo",
"Dismissible": "Dispensável",
"Display the username instead of You in the Chat": "Exibir o nome de utilizador em vez de Você na Conversa",
"Document": "Documento",
"Document Settings": "Configurações de Documento",
"Documentation": "",
"Documentation": "Documentação",
"Documents": "Documentos",
"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e seus dados permanecem seguros em seu servidor hospedado localmente.",
"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e os seus dados permanecem seguros no seu servidor alojado localmente.",
"Don't Allow": "Não Permitir",
"Don't have an account?": "Não tem uma conta?",
"Don't like the style": "Não gosta do estilo",
"Download": "Baixar",
"Download": "Descarregar",
"Download canceled": "Download cancelado",
"Download Database": "Baixar Banco de Dados",
"Drop any files here to add to the conversation": "Solte os arquivos aqui para adicionar à conversa",
"Download Database": "Descarregar Base de Dados",
"Drop any files here to add to the conversation": "Largue os ficheiros aqui para adicionar à conversa",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
"Edit": "Editar",
"Edit Doc": "Editar Documento",
"Edit User": "Editar Usuário",
"Edit User": "Editar Utilizador",
"Email": "E-mail",
"Embedding Batch Size": "",
"Embedding Batch Size": "Tamanho do Lote do Embedding",
"Embedding Model": "Modelo de Embedding",
"Embedding Model Engine": "Motor de Modelo de Embedding",
"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding definido como \"{{embedding_model}}\"",
"Enable Chat History": "Ativar Histórico de Bate-papo",
"Enable Community Sharing": "Habilite o compartilhamento da comunidade",
"Enable Chat History": "Ativar Histórico de Conversas",
"Enable Community Sharing": "Active a Partilha da Comunidade",
"Enable New Sign Ups": "Ativar Novas Inscrições",
"Enable Web Search": "Ativar pesquisa na Web",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Garanta que seu arquivo CSV inclua 4 colunas nesta ordem: Nome, E-mail, Senha, Função.",
"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
"Enter a detail about yourself for your LLMs to recall": "Digite um detalhe sobre você para que seus LLMs possam lembrá-lo",
"Enter Brave Search API Key": "Insira a chave da API do Brave Search",
"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
"Enter Chunk Size": "Digite o Tamanho do Fragmento",
"Enter Github Raw URL": "Insira o URL bruto do Github",
"Enter Google PSE API Key": "Insira a chave da API PSE do Google",
"Enter Google PSE Engine Id": "Insira o ID do mecanismo PSE do Google",
"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
"Enter language codes": "Digite os códigos de idioma",
"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Digite o Número de Etapas (por exemplo, 50)",
"Enter Score": "Digite a Pontuação",
"Enter Searxng Query URL": "Insira o URL da Consulta Searxng",
"Enter Serper API Key": "Insira a chave da API Serper",
"Enter Serpstack API Key": "Insira a chave da API Serpstack",
"Enter stop sequence": "Digite a sequência de parada",
"Enter Top K": "Digite o Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "Digite a URL (por exemplo, http://localhost:11434)",
"Enter Your Email": "Digite seu E-mail",
"Enter Your Full Name": "Digite seu Nome Completo",
"Enter Your Password": "Digite sua Senha",
"Enter Your Role": "Digite sua Função",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Confirme que o seu ficheiro CSV inclui 4 colunas nesta ordem: Nome, E-mail, Senha, Função.",
"Enter {{role}} message here": "Escreva a mensagem de {{role}} aqui",
"Enter a detail about yourself for your LLMs to recall": "Escreva um detalhe sobre você para que os seus LLMs possam lembrar-se",
"Enter Brave Search API Key": "Escreva a chave da API do Brave Search",
"Enter Chunk Overlap": "Escreva a Sobreposição de Fragmento",
"Enter Chunk Size": "Escreva o Tamanho do Fragmento",
"Enter Github Raw URL": "Escreva o URL cru do Github",
"Enter Google PSE API Key": "Escreva a chave da API PSE do Google",
"Enter Google PSE Engine Id": "Escreva o ID do mecanismo PSE do Google",
"Enter Image Size (e.g. 512x512)": "Escreva o Tamanho da Imagem (por exemplo, 512x512)",
"Enter language codes": "Escreva os códigos de idioma",
"Enter model tag (e.g. {{modelTag}})": "Escreva a tag do modelo (por exemplo, {{modelTag}})",
"Enter Number of Steps (e.g. 50)": "Escreva o Número de Etapas (por exemplo, 50)",
"Enter Score": "Escreva a Pontuação",
"Enter Searxng Query URL": "Escreva o URL da Pesquisa Searxng",
"Enter Serper API Key": "Escreva a chave da API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Escreva a chave da API Serpstack",
"Enter stop sequence": "Escreva a sequência de paragem",
"Enter Top K": "Escreva o Top K",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Escreva o URL (por exemplo, http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "Escreva o URL (por exemplo, http://localhost:11434)",
"Enter Your Email": "Escreva o seu E-mail",
"Enter Your Full Name": "Escreva o seu Nome Completo",
"Enter Your Password": "Escreva a sua Senha",
"Enter Your Role": "Escreva a sua Função",
"Error": "Erro",
"Experimental": "Experimental",
"Export": "Exportação",
"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
"Export chat (.json)": "",
"Export Chats": "Exportar Bate-papos",
"Export": "Exportar",
"Export All Chats (All Users)": "Exportar Todas as Conversas (Todos os Utilizadores)",
"Export chat (.json)": "Exportar Conversa (.json)",
"Export Chats": "Exportar Conversas",
"Export Documents Mapping": "Exportar Mapeamento de Documentos",
"Export Models": "Modelos de Exportação",
"Export Prompts": "Exportar Prompts",
"External Models": "",
"Export Tools": "",
"External Models": "Modelos Externos",
"Failed to create API Key.": "Falha ao criar a Chave da API.",
"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
"Failed to update settings": "",
"Failed to update settings": "Falha ao atualizar as definições",
"February": "Fevereiro",
"Feel free to add specific details": "Sinta-se à vontade para adicionar detalhes específicos",
"File Mode": "Modo de Arquivo",
"File not found.": "Arquivo não encontrado.",
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Impostação de impressão digital detectada: Não é possível usar iniciais como avatar. Padronizando para imagem de perfil padrão.",
"File Mode": "Modo de Ficheiro",
"File not found.": "Ficheiro não encontrado.",
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Detectada falsificação da impressão digital: Não é possível usar iniciais como avatar. A usar a imagem de perfil padrão.",
"Fluidly stream large external response chunks": "Transmita com fluidez grandes blocos de resposta externa",
"Focus chat input": "Focar entrada de bate-papo",
"Focus chat input": "Focar na conversa",
"Followed instructions perfectly": "Seguiu instruções perfeitamente",
"Format your variables using square brackets like this:": "Formate suas variáveis usando colchetes como este:",
"Format your variables using square brackets like this:": "Formate as suas variáveis usando parenteses rectos como este:",
"Frequency Penalty": "Penalidade de Frequência",
"General": "Geral",
"General Settings": "Configurações Gerais",
"Generate Image": "",
"Generating search query": "Gerar consulta de pesquisa",
"Generate Image": "Gerar imagem",
"Generating search query": "A gerar a consulta da pesquisa",
"Generation Info": "Informações de Geração",
"Good Response": "Boa Resposta",
"Google PSE API Key": "Chave da API PSE do Google",
"Google PSE Engine Id": "ID do mecanismo PSE do Google",
"h:mm a": "h:mm a",
"has no conversations.": "não possui bate-papos.",
"has no conversations.": "não possui conversas.",
"Hello, {{name}}": "Olá, {{name}}",
"Help": "Help",
"Help": "Ajuda",
"Hide": "Ocultar",
"How can I help you today?": "Como posso ajudá-lo hoje?",
"Hybrid Search": "Pesquisa Híbrida",
"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
"Image Generation Engine": "Mecanismo de Geração de Imagens",
"Image Settings": "Configurações de Imagem",
"Image Settings": "Configurações da Imagem",
"Images": "Imagens",
"Import Chats": "Importar Bate-papos",
"Import Chats": "Importar Conversas",
"Import Documents Mapping": "Importar Mapeamento de Documentos",
"Import Models": "Importar Modelos",
"Import Prompts": "Importar Prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
"Info": "Informação",
"Input commands": "Comandos de entrada",
"Install from Github URL": "Instalar a partir do URL do Github",
"Instant Auto-Send After Voice Transcription": "",
"Instant Auto-Send After Voice Transcription": "Enviar automaticamente depois da transcrição da voz",
"Interface": "Interface",
"Invalid Tag": "Etiqueta Inválida",
"January": "Janeiro",
@@ -273,55 +277,55 @@
"JWT Token": "Token JWT",
"Keep Alive": "Manter Vivo",
"Keyboard shortcuts": "Atalhos de teclado",
"Knowledge": "",
"Knowledge": "Conhecimento",
"Language": "Idioma",
"Last Active": "Último Ativo",
"Light": "Claro",
"Listening...": "",
"Listening...": "A escutar...",
"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
"Local Models": "",
"Local Models": "Modelos Locais",
"LTR": "LTR",
"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
"Make sure to enclose them with": "Certifique-se de colocá-los entre",
"Manage": "",
"Manage Models": "Gerenciar Modelos",
"Manage Ollama Models": "Gerenciar Modelos Ollama",
"Manage Pipelines": "Gerenciar pipelines",
"Manage": "Gerir",
"Manage Models": "Gerir Modelos",
"Manage Ollama Models": "Gerir Modelos Ollama",
"Manage Pipelines": "Gerir pipelines",
"March": "Março",
"Max Tokens (num_predict)": "Max Tokens (num_predict)",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
"Max Tokens (num_predict)": "Máx Tokens (num_predict)",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "O máximo de 3 modelos podem ser descarregados simultaneamente. Tente novamente mais tarde.",
"May": "Maio",
"Memories accessible by LLMs will be shown here.": "Memórias acessíveis por LLMs serão mostradas aqui.",
"Memory": "Memória",
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens que você enviar após criar seu link não serão compartilhadas. Os usuários com o URL poderão visualizar o bate-papo compartilhado.",
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens que você enviar após criar o seu link não serão partilhadas. Os utilizadores com o URL poderão visualizar a conversa partilhada.",
"Minimum Score": "Mínimo de Pontuação",
"Mirostat": "Mirostat",
"Mirostat Eta": "Mirostat Eta",
"Mirostat Tau": "Mirostat Tau",
"MMMM DD, YYYY": "DD/MM/YYYY",
"MMMM DD, YYYY HH:mm": "DD/MM/YYYY HH:mm",
"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi descarregado com sucesso.",
"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para descarregar.",
"Model {{modelId}} not found": "Modelo {{modelId}} não foi encontrado",
"Model {{modelName}} is not vision capable": "O modelo {{modelName}} não é capaz de visão",
"Model {{name}} is now {{status}}": "Modelo {{name}} agora é {{status}}",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Caminho do sistema de arquivos do modelo detectado. É necessário o nome curto do modelo para atualização, não é possível continuar.",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Dtectado caminho do sistema de ficheiros do modelo. É necessário o nome curto do modelo para atualização, não é possível continuar.",
"Model ID": "ID do modelo",
"Model not selected": "Modelo não selecionado",
"Model Params": "Params Modelo",
"Model Whitelisting": "Lista de Permissões de Modelo",
"Model Whitelisting": "Lista de Permissões do Modelo",
"Model(s) Whitelisted": "Modelo(s) na Lista de Permissões",
"Modelfile Content": "Conteúdo do Arquivo de Modelo",
"Modelfile Content": "Conteúdo do Ficheiro do Modelo",
"Models": "Modelos",
"More": "Mais",
"Name": "Nome",
"Name Tag": "Tag de Nome",
"Name Tag": "Etiqueta de Nome",
"Name your model": "Atribua um nome ao seu modelo",
"New Chat": "Novo Bate-papo",
"New Chat": "Nova Conversa",
"New Password": "Nova Senha",
"No documents found": "",
"No results found": "Nenhum resultado encontrado",
"No search query generated": "Nenhuma consulta de pesquisa gerada",
"No documents found": "Não foram encontrados documentos",
"No results found": "Não foram encontrados resultados",
"No search query generated": "Não foi gerada nenhuma consulta de pesquisa",
"No source available": "Nenhuma fonte disponível",
"None": "Nenhum",
"Not factually correct": "Não é correto em termos factuais",
@@ -336,18 +340,18 @@
"Ollama": "Ollama",
"Ollama API": "Ollama API",
"Ollama API disabled": "API do Ollama desativada",
"Ollama API is disabled": "",
"Ollama API is disabled": "A API do Ollama está desactivada",
"Ollama Version": "Versão do Ollama",
"On": "Ligado",
"Only": "Somente",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Somente caracteres alfanuméricos e hífens são permitidos na string de comando.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Opa! Aguente firme! Seus arquivos ainda estão no forno de processamento. Estamos cozinhando-os com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Opa! Parece que a URL é inválida. Verifique novamente e tente outra vez.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Opa! Você está usando um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
"Only": "Apenas",
"Only alphanumeric characters and hyphens are allowed in the command string.": "Apenas caracteres alfanuméricos e hífens são permitidos na string de comando.",
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Epá! Segura-te! Os teus ficheiros ainda estão no forno de processamento. Estamos a cozinhá-los com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Epá! Parece que o URL é inválido. Verifique novamente e tente outra vez.",
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Epá! Você está a usar um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
"Open": "Abrir",
"Open AI": "OpenAI",
"Open AI (Dall-E)": "OpenAI (Dall-E)",
"Open new chat": "Abrir novo bate-papo",
"Open AI": "Open AI",
"Open AI (Dall-E)": "Open AI (Dall-E)",
"Open new chat": "Abrir nova conversa",
"OpenAI": "OpenAI",
"OpenAI API": "API OpenAI",
"OpenAI API Config": "Configuração da API OpenAI",
@@ -359,31 +363,31 @@
"PDF document (.pdf)": "Documento PDF (.pdf)",
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
"pending": "pendente",
"Permission denied when accessing media devices": "",
"Permission denied when accessing microphone": "",
"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
"Permission denied when accessing media devices": "A permissão foi negada ao aceder aos dispositivos de media",
"Permission denied when accessing microphone": "A permissão foi negada ao aceder ao microfone",
"Permission denied when accessing microphone: {{error}}": "A permissão foi negada ao aceder o microfone: {{error}}",
"Personalization": "Personalização",
"Pipelines": "Condutas",
"Pipelines Valves": "Válvulas de Condutas",
"Plain text (.txt)": "Texto sem formatação (.txt)",
"Playground": "Parque infantil",
"Playground": "Recreio",
"Positive attitude": "Atitude Positiva",
"Previous 30 days": "Últimos 30 dias",
"Previous 7 days": "Últimos 7 dias",
"Profile Image": "Imagem de Perfil",
"Prompt": "Prompt",
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ex.: Dê-me um fatídico sobre o Império Romano)",
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ex.: Dê-me um facto divertido sobre o Império Romano)",
"Prompt Content": "Conteúdo do Prompt",
"Prompt suggestions": "Sugestões de Prompt",
"Prompts": "Prompts",
"Pull \"{{searchValue}}\" from Ollama.com": "Extrair \"{{searchValue}}\" do Ollama.com",
"Pull a model from Ollama.com": "Extrair um modelo do Ollama.com",
"Pull \"{{searchValue}}\" from Ollama.com": "Puxar \"{{searchValue}}\" do Ollama.com",
"Pull a model from Ollama.com": "Puxar um modelo do Ollama.com",
"Query Params": "Parâmetros de Consulta",
"RAG Template": "Modelo RAG",
"Read Aloud": "Ler em Voz Alta",
"Record voice": "Gravar voz",
"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
"Redirecting you to OpenWebUI Community": "Redirecionando-o para a Comunidade OpenWebUI",
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Refera-se a si próprio como \"User\" (por exemplo, \"User está a aprender Espanhol\")",
"Refused when it shouldn't have": "Recusado quando não deveria",
"Regenerate": "Regenerar",
"Release Notes": "Notas de Lançamento",
@@ -391,57 +395,60 @@
"Remove Model": "Remover Modelo",
"Rename": "Renomear",
"Repeat Last N": "Repetir Últimos N",
"Request Mode": "Modo de Solicitação",
"Request Mode": "Modo de Pedido",
"Reranking Model": "Modelo de Reranking",
"Reranking model disabled": "Modelo de Reranking desativado",
"Reranking model set to \"{{reranking_model}}\"": "Modelo de Reranking definido como \"{{reranking_model}}\"",
"Reset Upload Directory": "",
"Reset Upload Directory": "Limpar Pasta de Carregamento",
"Reset Vector Storage": "Redefinir Armazenamento de Vetor",
"Response AutoCopy to Clipboard": "Cópia Automática da Resposta para a Área de Transferência",
"Role": "Função",
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "RTL",
"Running": "",
"Save": "Salvar",
"Save & Create": "Salvar e Criar",
"Save & Update": "Salvar e Atualizar",
"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": "Salvar logs de bate-papo diretamente no armazenamento do seu navegador não é mais suportado. Reserve um momento para baixar e excluir seus logs de bate-papo clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar seus logs de bate-papo para o backend através de",
"Running": "A correr",
"Save": "Guardar",
"Save & Create": "Guardar e Criar",
"Save & Update": "Guardar e Atualizar",
"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": "Guardar o registo das conversas diretamente no armazenamento do seu navegador não é suportado. Reserve um momento para descarregar e eliminar os seus registos de conversas clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar os seus registos de conversas para o backend através de",
"Scan": "Digitalizar",
"Scan complete!": "Digitalização concluída!",
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
"Search": "Pesquisar",
"Search a model": "Pesquisar um modelo",
"Search Chats": "Pesquisar Chats",
"Search Chats": "Pesquisar Conversas",
"Search Documents": "Pesquisar Documentos",
"Search Models": "Modelos de pesquisa",
"Search Prompts": "Pesquisar Prompts",
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Query Generation Prompt": "Prompt de geração de consulta de pesquisa",
"Search Query Generation Prompt Length Threshold": "Limite de comprimento do prompt de geração de consulta de pesquisa",
"Search Result Count": "Contagem de resultados da pesquisa",
"Search Tools": "",
"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL de consulta Searxng",
"See readme.md for instructions": "Consulte readme.md para obter instruções",
"See what's new": "Veja o que há de novo",
"Seed": "Semente",
"Select a base model": "Selecione um modelo base",
"Select a engine": "",
"Select a engine": "Selecione um motor",
"Select a mode": "Selecione um modo",
"Select a model": "Selecione um modelo",
"Select a pipeline": "Selecione um pipeline",
"Select a pipeline url": "Selecione um URL de pipeline",
"Select an Ollama instance": "Selecione uma instância Ollama",
"Select model": "Selecione um modelo",
"Select only one model to call": "",
"Select Documents": "",
"Select model": "Selecione o modelo",
"Select only one model to call": "Selecione apenas um modelo para a chamada",
"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entradas de imagem",
"Send": "Enviar",
"Send a Message": "Enviar uma Mensagem",
"Send message": "Enviar mensagem",
"September": "Setembro",
"Serper API Key": "Chave API Serper",
"Serply API Key": "",
"Serpstack API Key": "Chave da API Serpstack",
"Server connection verified": "Conexão com o servidor verificada",
"Set as default": "Definir como padrão",
@@ -453,26 +460,26 @@
"Set Task Model": "Definir modelo de tarefa",
"Set Voice": "Definir Voz",
"Settings": "Configurações",
"Settings saved successfully!": "Configurações salvas com sucesso!",
"Settings updated successfully": "",
"Share": "Compartilhar",
"Share Chat": "Compartilhar Bate-papo",
"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
"Settings saved successfully!": "Configurações guardadas com sucesso!",
"Settings updated successfully": "Configurações atualizadas com sucesso",
"Share": "Partilhar",
"Share Chat": "Partilhar Conversa",
"Share to OpenWebUI Community": "Partilhar com a Comunidade OpenWebUI",
"short-summary": "resumo-curto",
"Show": "Mostrar",
"Show Admin Details in Account Pending Overlay": "",
"Show shortcuts": "Mostrar",
"Show Admin Details in Account Pending Overlay": "Mostrar Detalhes do Administrador na sobreposição de Conta Pendente",
"Show shortcuts": "Mostrar atalhos",
"Showcased creativity": "Criatividade Exibida",
"sidebar": "barra lateral",
"Sign in": "Entrar",
"Sign Out": "Sair",
"Sign up": "Inscrever-se",
"Signing in": "Entrando",
"Signing in": "A entrar",
"Source": "Fonte",
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
"Speech-to-Text Engine": "Mecanismo de Fala para Texto",
"Stop Sequence": "Sequência de Parada",
"STT Model": "",
"Speech-to-Text Engine": "Motor de Fala para Texto",
"Stop Sequence": "Sequência de Paragem",
"STT Model": "Modelo STT",
"STT Settings": "Configurações STT",
"Submit": "Enviar",
"Subtitle (e.g. about the Roman Empire)": "Subtítulo (ex.: sobre o Império Romano)",
@@ -481,69 +488,72 @@
"Suggested": "Sugerido",
"System": "Sistema",
"System Prompt": "Prompt do Sistema",
"Tags": "Tags",
"Tell us more:": "Dê-nos mais:",
"Tags": "Etiquetas",
"Tell us more:": "Diga-nos mais:",
"Temperature": "Temperatura",
"Template": "Modelo",
"Text Completion": "Complemento de Texto",
"Text-to-Speech Engine": "Mecanismo de Texto para Fala",
"Text Completion": "Conclusão de Texto",
"Text-to-Speech Engine": "Motor de Texto para Fala",
"Tfs Z": "Tfs Z",
"Thanks for your feedback!": "Obrigado pelo feedback!",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "O score deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
"Thanks for your feedback!": "Obrigado pelo seu feedback!",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "A pontuação deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
"Theme": "Tema",
"Thinking...": "",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isso garante que suas conversas valiosas sejam salvas com segurança em seu banco de dados de backend. Obrigado!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
"Thinking...": "A pensar...",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isto garante que suas conversas valiosas sejam guardadas com segurança na sua base de dados de backend. Obrigado!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Isto é um recurso experimental, pode não funcionar conforme o esperado e está sujeito a alterações a qualquer momento.",
"This setting does not sync across browsers or devices.": "Esta configuração não sincroniza entre navegadores ou dispositivos.",
"Thorough explanation": "Explicação Completa",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada de bate-papo após cada substituição.",
"Thorough explanation": "Explicação Minuciosa",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada da conversa após cada substituição.",
"Title": "Título",
"Title (e.g. Tell me a fun fact)": "Título (ex.: Dê-me um fatídico fatídico)",
"Title (e.g. Tell me a fun fact)": "Título (ex.: Diz-me um facto divertido)",
"Title Auto-Generation": "Geração Automática de Título",
"Title cannot be an empty string.": "Título não pode ser uma string vazia.",
"Title Generation Prompt": "Prompt de Geração de Título",
"to": "para",
"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
"to chat input.": "para a entrada de bate-papo.",
"To access the available model names for downloading,": "Para aceder aos nomes de modelo disponíveis para descarregar,",
"To access the GGUF models available for downloading,": "Para aceder aos modelos GGUF disponíveis para descarregar,",
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para aceder ao WebUI, entre em contato com o administrador. Os administradores podem gerir o status dos utilizadores no Painel de Administração.",
"To add documents here, upload them to the \"Documents\" workspace first.": "",
"to chat input.": "para a entrada da conversa.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Hoje",
"Toggle settings": "Alternar configurações",
"Toggle sidebar": "Alternar barra lateral",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
"TTS Model": "",
"Trouble accessing Ollama?": "Problemas a aceder ao Ollama?",
"TTS Model": "Modelo TTS",
"TTS Settings": "Configurações TTS",
"TTS Voice": "",
"TTS Voice": "Voz TTS",
"Type": "Tipo",
"Type Hugging Face Resolve (Download) URL": "Digite a URL do Hugging Face Resolve (Download)",
"Uh-oh! There was an issue connecting to {{provider}}.": "Opa! Houve um problema ao conectar-se a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de arquivo desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
"Type Hugging Face Resolve (Download) URL": "Escreva o URL do Hugging Face Resolve (Descarregar)",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Houve um problema ao conectar a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de ficheiro desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
"Update and Copy Link": "Atualizar e Copiar Link",
"Update password": "Atualizar senha",
"Upload a GGUF model": "Carregar um modelo GGUF",
"Upload Files": "Carregar ficheiros",
"Upload Pipeline": "",
"Upload Pipeline": "Carregar Pipeline",
"Upload Progress": "Progresso do Carregamento",
"URL Mode": "Modo de URL",
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar os seus documentos.",
"Use Gravatar": "Usar Gravatar",
"Use Initials": "Usar Iniciais",
"use_mlock (Ollama)": "use_mlock (Ollama)",
"use_mmap (Ollama)": "use_mmap (Ollama)",
"user": "usuário",
"User Permissions": "Permissões do Usuário",
"Users": "Usuários",
"user": "utilizador",
"User Permissions": "Permissões do Utilizador",
"Users": "Utilizadores",
"Utilize": "Utilizar",
"Valid time units:": "Unidades de tempo válidas:",
"variable": "variável",
"variable to have them replaced with clipboard content.": "variável para que sejam substituídos pelo conteúdo da área de transferência.",
"Version": "Versão",
"Warning": "Advertência",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar seu modelo de vetorização, você precisará reimportar todos os documentos.",
"Warning": "Aviso",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar o seu modelo de vetorização, você tem de reimportar todos os documentos.",
"Web": "Web",
"Web API": "",
"Web API": "Web API",
"Web Loader Settings": "Configurações do Carregador da Web",
"Web Params": "Parâmetros da Web",
"Web Search": "Pesquisa na Web",
@@ -551,23 +561,23 @@
"Webhook URL": "URL do Webhook",
"WebUI Add-ons": "Complementos WebUI",
"WebUI Settings": "Configurações WebUI",
"WebUI will make requests to": "WebUI fará solicitações para",
"WebUI will make requests to": "WebUI fará pedidos a",
"Whats New in": "O que há de novo em",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novos bate-papos neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
"Whisper (Local)": "",
"Widescreen Mode": "",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novas conversas neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
"Whisper (Local)": "Whisper (Local)",
"Widescreen Mode": "Modo Widescreen",
"Workspace": "Espaço de Trabalho",
"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem és tu?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
"Yesterday": "Ontem",
"You": "Você",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Você pode personalizar as suas interações com LLMs adicionando memórias através do botão Gerir abaixo, tornando-as mais úteis e personalizadas para você.",
"You cannot clone a base model": "Não é possível clonar um modelo base",
"You have no archived conversations.": "Você não tem bate-papos arquivados.",
"You have shared this chat": "Você compartilhou este bate-papo",
"You have no archived conversations.": "Você não tem conversas arquivadas.",
"You have shared this chat": "Você partilhou esta conversa",
"You're a helpful assistant.": "Você é um assistente útil.",
"You're now logged in.": "Você está conectado agora.",
"Your account status is currently pending activation.": "",
"You're now logged in.": "Você agora está conectado.",
"Your account status is currently pending activation.": "O status da sua conta está atualmente com a ativação pendente.",
"Youtube": "Youtube",
"Youtube Loader Settings": "Configurações do Carregador do Youtube"
}
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Панель админ",
"Admin Settings": "Настройки админ",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Расширенные Параметры",
"Advanced Params": "Расширенные параметры",
"all": "всё",
@@ -201,6 +202,7 @@
"Enter Score": "Введите оценку",
"Enter Searxng Query URL": "Введите URL-адрес запроса Searxng",
"Enter Serper API Key": "Введите ключ API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Введите ключ API Serpstack",
"Enter stop sequence": "Введите последовательность остановки",
"Enter Top K": "Введите Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Экспортировать отображение документов",
"Export Models": "Экспорт моделей",
"Export Prompts": "Экспортировать промты",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Не удалось создать ключ API.",
"Failed to read clipboard contents": "Не удалось прочитать содержимое буфера обмена",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Импорт сопоставления документов",
"Import Models": "Импорт моделей",
"Import Prompts": "Импорт подсказок",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui",
"Info": "Информация",
"Input commands": "Введите команды",
@@ -419,11 +423,12 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Количество результатов поиска",
"Search Tools": "",
"Searched {{count}} sites_one": "Поиск {{count}} sites_one",
"Searched {{count}} sites_few": "Поиск {{count}} sites_few",
"Searched {{count}} sites_many": "Поиск {{count}} sites_many",
"Searched {{count}} sites_other": "Поиск {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Поиск в Интернете по запросу '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL-адрес запроса Searxng",
"See readme.md for instructions": "Смотрите readme.md для инструкций",
"See what's new": "Посмотреть, что нового",
@@ -435,6 +440,7 @@
"Select a pipeline": "Выбор конвейера",
"Select a pipeline url": "Выберите URL-адрес конвейера",
"Select an Ollama instance": "Выберите экземпляр Ollama",
"Select Documents": "",
"Select model": "Выберите модель",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Выбранные модели не поддерживают ввод изображений",
@@ -443,6 +449,7 @@
"Send message": "Отправить сообщение",
"September": "Сентябрь",
"Serper API Key": "Ключ API Serper",
"Serply API Key": "",
"Serpstack API Key": "Ключ API Serpstack",
"Server connection verified": "Соединение с сервером проверено",
"Set as default": "Установить по умолчанию",
@@ -507,10 +514,13 @@
"To access the available model names for downloading,": "Чтобы получить доступ к доступным для загрузки именам моделей,",
"To access the GGUF models available for downloading,": "Чтобы получить доступ к моделям GGUF, доступным для загрузки,",
"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 chat input.": "в чате.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Сегодня",
"Toggle settings": "Переключить настройки",
"Toggle sidebar": "Переключить боковую панель",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Проблемы с доступом к Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Админ табла",
"Admin Settings": "Админ подешавања",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Напредни параметри",
"Advanced Params": "Напредни парамови",
"all": "сви",
@@ -201,6 +202,7 @@
"Enter Score": "Унесите резултат",
"Enter Searxng Query URL": "Унесите УРЛ адресу Сеарxнг упита",
"Enter Serper API Key": "Унесите Серпер АПИ кључ",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Унесите Серпстацк АПИ кључ",
"Enter stop sequence": "Унесите секвенцу заустављања",
"Enter Top K": "Унесите Топ К",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Извези мапирање докумената",
"Export Models": "Извези моделе",
"Export Prompts": "Извези упите",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Неуспешно стварање API кључа.",
"Failed to read clipboard contents": "Неуспешно читање садржаја оставе",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Увези мапирање докумената",
"Import Models": "Увези моделе",
"Import Prompts": "Увези упите",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Укључи `--api` заставицу при покретању stable-diffusion-webui",
"Info": "Инфо",
"Input commands": "Унеси наредбе",
@@ -419,10 +423,11 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Број резултата претраге",
"Search Tools": "",
"Searched {{count}} sites_one": "Претражио {{цоунт}} ситес_оне",
"Searched {{count}} sites_few": "Претражио {{цоунт}} ситес_феw",
"Searched {{count}} sites_other": "Претражио {{цоунт}} ситес_отхер",
"Searching the web for '{{searchQuery}}'": "Претраживање Веба у потрази за \"{{сеарцхQуерy}}\"",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "УРЛ адреса Сеарxнг упита",
"See readme.md for instructions": "Погледај readme.md за упутства",
"See what's new": "Погледај шта је ново",
@@ -434,6 +439,7 @@
"Select a pipeline": "Избор цевовода",
"Select a pipeline url": "Избор урл адресе цевовода",
"Select an Ollama instance": "Изабери Ollama инстанцу",
"Select Documents": "",
"Select model": "Изабери модел",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Изабрани модели не подржавају уносе слика",
@@ -442,6 +448,7 @@
"Send message": "Пошаљи поруку",
"September": "Септембар",
"Serper API Key": "Серпер АПИ кључ",
"Serply API Key": "",
"Serpstack API Key": "Серпстацк АПИ кључ",
"Server connection verified": "Веза са сервером потврђена",
"Set as default": "Подеси као подразумевано",
@@ -506,10 +513,13 @@
"To access the available model names for downloading,": "Да бисте приступили доступним именима модела за преузимање,",
"To access the GGUF models available for downloading,": "Да бисте приступили GGUF моделима доступним за преузимање,",
"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 chat input.": "у унос ћаскања.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Данас",
"Toggle settings": "Пребаци подешавања",
"Toggle sidebar": "Пребаци бочну траку",
"Tools": "",
"Top K": "Топ К",
"Top P": "Топ П",
"Trouble accessing Ollama?": "Проблеми са приступом Ollama-и?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Administrationspanel",
"Admin Settings": "Administratörsinställningar",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Avancerade parametrar",
"Advanced Params": "Avancerade parametrar",
"all": "alla",
@@ -201,6 +202,7 @@
"Enter Score": "Ange poäng",
"Enter Searxng Query URL": "Ange Searxng Query URL",
"Enter Serper API Key": "Ange Serper API-nyckel",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Ange Serpstack API-nyckel",
"Enter stop sequence": "Ange stoppsekvens",
"Enter Top K": "Ange Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Exportera dokumentmappning",
"Export Models": "Exportera modeller",
"Export Prompts": "Exportera prompts",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "Misslyckades med att skapa API-nyckel.",
"Failed to read clipboard contents": "Misslyckades med att läsa urklippsinnehåll",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Importera dokumentmappning",
"Import Models": "Importera modeller",
"Import Prompts": "Importera prompts",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Inkludera `--api`-flagga när du kör stabil-diffusion-webui",
"Info": "Information",
"Input commands": "Indatakommandon",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Antal sökresultat",
"Search Tools": "",
"Searched {{count}} sites_one": "Sökte på {{count}} sites_one",
"Searched {{count}} sites_other": "Sökte på {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Söka på webben efter '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng Query URL",
"See readme.md for instructions": "Se readme.md för instruktioner",
"See what's new": "Se vad som är nytt",
@@ -433,6 +438,7 @@
"Select a pipeline": "Välj en pipeline",
"Select a pipeline url": "Välj en pipeline-URL",
"Select an Ollama instance": "Välj en Ollama-instans",
"Select Documents": "",
"Select model": "Välj en modell",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Valda modeller stöder inte bildinmatningar",
@@ -441,6 +447,7 @@
"Send message": "Skicka meddelande",
"September": "september",
"Serper API Key": "Serper API-nyckel",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API-nyckel",
"Server connection verified": "Serveranslutning verifierad",
"Set as default": "Ange som standard",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "För att komma åt de tillgängliga modellnamnen för nedladdning,",
"To access the GGUF models available for downloading,": "För att komma åt de GGUF-modeller som finns tillgängliga för nedladdning,",
"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 chat input.": "till chattinmatning.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Idag",
"Toggle settings": "Växla inställningar",
"Toggle sidebar": "Växla sidofält",
"Tools": "",
"Top K": "Topp K",
"Top P": "Topp P",
"Trouble accessing Ollama?": "Problem med att komma åt Ollama?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "",
"Admin Settings": "",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "",
"Advanced Params": "",
"all": "",
@@ -201,6 +202,7 @@
"Enter Score": "",
"Enter Searxng Query URL": "",
"Enter Serper API Key": "",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "",
"Enter stop sequence": "",
"Enter Top K": "",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "",
"Export Models": "",
"Export Prompts": "",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "",
"Failed to read clipboard contents": "",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "",
"Import Models": "",
"Import Prompts": "",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "",
"Info": "",
"Input commands": "",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "",
"Search Tools": "",
"Searched {{count}} sites_one": "",
"Searched {{count}} sites_other": "",
"Searching the web for '{{searchQuery}}'": "",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "",
"See readme.md for instructions": "",
"See what's new": "",
@@ -433,6 +438,7 @@
"Select a pipeline": "",
"Select a pipeline url": "",
"Select an Ollama instance": "",
"Select Documents": "",
"Select model": "",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "",
@@ -441,6 +447,7 @@
"Send message": "",
"September": "",
"Serper API Key": "",
"Serply API Key": "",
"Serpstack API Key": "",
"Server connection verified": "",
"Set as default": "",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "",
"To access the GGUF models available for downloading,": "",
"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 chat input.": "",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "",
"Toggle settings": "",
"Toggle sidebar": "",
"Tools": "",
"Top K": "",
"Top P": "",
"Trouble accessing Ollama?": "",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "Yönetici Paneli",
"Admin Settings": "Yönetici Ayarları",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Gelişmiş Parametreler",
"Advanced Params": "Gelişmiş Parametreler",
"all": "tümü",
@@ -201,6 +202,7 @@
"Enter Score": "Skoru Girin",
"Enter Searxng Query URL": "Searxng Sorgu URL'sini girin",
"Enter Serper API Key": "Serper API Anahtarını Girin",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Serpstack API Anahtarını Girin",
"Enter stop sequence": "Durdurma dizisini girin",
"Enter Top K": "Top K'yı girin",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Belge Eşlemesini Dışa Aktar",
"Export Models": "Modelleri Dışa Aktar",
"Export Prompts": "Promptları Dışa Aktar",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "API Anahtarı oluşturulamadı.",
"Failed to read clipboard contents": "Pano içeriği okunamadı",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Belge Eşlemesini İçe Aktar",
"Import Models": "Modelleri İçe Aktar",
"Import Prompts": "Promptları İçe Aktar",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui çalıştırılırken `--api` bayrağını dahil edin",
"Info": "Bilgi",
"Input commands": "Giriş komutları",
@@ -419,9 +423,10 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Arama Sonucu Sayısı",
"Search Tools": "",
"Searched {{count}} sites_one": "Arandı {{count}} sites_one",
"Searched {{count}} sites_other": "Arandı {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Web'de '{{searchQuery}}' aranıyor",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng Sorgu URL'si",
"See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın",
"See what's new": "Yeniliklere göz atın",
@@ -433,6 +438,7 @@
"Select a pipeline": "Bir pipeline seç",
"Select a pipeline url": "Bir pipeline URL'si seç",
"Select an Ollama instance": "Bir Ollama örneği seçin",
"Select Documents": "",
"Select model": "Model seç",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "Seçilen model(ler) görüntü girişlerini desteklemiyor",
@@ -441,6 +447,7 @@
"Send message": "Mesaj gönder",
"September": "Eylül",
"Serper API Key": "Serper API Anahtarı",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API Anahtarı",
"Server connection verified": "Sunucu bağlantısı doğrulandı",
"Set as default": "Varsayılan olarak ayarla",
@@ -505,10 +512,13 @@
"To access the available model names for downloading,": "İndirilebilir mevcut model adlarına erişmek için,",
"To access the GGUF models available for downloading,": "İndirilebilir mevcut GGUF modellerine erişmek için,",
"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 chat input.": "sohbet girişine.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Bugün",
"Toggle settings": "Ayarları Aç/Kapat",
"Toggle sidebar": "Kenar Çubuğunu Aç/Kapat",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Ollama'ya erişmede sorun mu yaşıyorsunuz?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "Адмін",
"Admin Panel": "Адмін-панель",
"Admin Settings": "Налаштування адміністратора",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Розширені параметри",
"Advanced Params": "Розширені параметри",
"all": "всі",
@@ -201,6 +202,7 @@
"Enter Score": "Введіть бал",
"Enter Searxng Query URL": "Введіть URL-адресу запиту Searxng",
"Enter Serper API Key": "Введіть ключ API Serper",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "Введіть ключ API Serpstack",
"Enter stop sequence": "Введіть символ зупинки",
"Enter Top K": "Введіть Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "Експортувати відображення документів",
"Export Models": "Експорт моделей",
"Export Prompts": "Експортувати промти",
"Export Tools": "",
"External Models": "Зовнішні моделі",
"Failed to create API Key.": "Не вдалося створити API ключ.",
"Failed to read clipboard contents": "Не вдалося прочитати вміст буфера обміну",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "Імпортувати відображення документів",
"Import Models": "Імпорт моделей",
"Import Prompts": "Імпортувати промти",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
"Info": "Інфо",
"Input commands": "Команди вводу",
@@ -419,11 +423,12 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "Кількість результатів пошуку",
"Search Tools": "",
"Searched {{count}} sites_one": "Переглянуто {{count}} сайт",
"Searched {{count}} sites_few": "Переглянуто {{count}} сайти",
"Searched {{count}} sites_many": "Переглянуто {{count}} сайтів",
"Searched {{count}} sites_other": "Переглянуто {{count}} сайтів",
"Searching the web for '{{searchQuery}}'": "Пошук в Інтернеті за запитом '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "URL-адреса запиту Searxng",
"See readme.md for instructions": "Див. readme.md для інструкцій",
"See what's new": "Подивіться, що нового",
@@ -435,6 +440,7 @@
"Select a pipeline": "Виберіть pipeline",
"Select a pipeline url": "Виберіть адресу pipeline",
"Select an Ollama instance": "Виберіть екземпляр Ollama",
"Select Documents": "",
"Select model": "Вибрати модель",
"Select only one model to call": "Виберіть лише одну модель для виклику",
"Selected model(s) do not support image inputs": "Вибрані модель(і) не підтримують вхідні зображення",
@@ -443,6 +449,7 @@
"Send message": "Надіслати повідомлення",
"September": "Вересень",
"Serper API Key": "Ключ API Serper",
"Serply API Key": "",
"Serpstack API Key": "Ключ API Serpstack",
"Server connection verified": "З'єднання з сервером підтверджено",
"Set as default": "Встановити за замовчуванням",
@@ -507,10 +514,13 @@
"To access the available model names for downloading,": "Щоб отримати доступ до назв доступних для завантаження моделей,",
"To access the GGUF models available for downloading,": "Щоб отримати доступ до моделей GGUF, які можна завантажити,,",
"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 chat input.": "в чаті.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Сьогодні",
"Toggle settings": "Переключити налаштування",
"Toggle sidebar": "Переключити бокову панель",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Проблеми з доступом до Ollama?",
+49 -39
View File
@@ -12,9 +12,9 @@
"a user": "người sử dụng",
"About": "Giới thiệu",
"Account": "Tài khoản",
"Account Activation Pending": "",
"Account Activation Pending": "Tài khoản đang chờ kích hoạt",
"Accurate information": "Thông tin chính xác",
"Active Users": "",
"Active Users": "Người dùng đang hoạt động",
"Add": "Thêm",
"Add a model id": "Thêm model id",
"Add a short description about what this model does": "Thêm mô tả ngắn về những khả năng của model",
@@ -30,9 +30,10 @@
"Add User": "Thêm người dùng",
"Adjusting these settings will apply changes universally to all users.": "Các thay đổi cài đặt này sẽ áp dụng cho tất cả người sử dụng.",
"admin": "quản trị viên",
"Admin": "",
"Admin": "Quản trị",
"Admin Panel": "Trang Quản trị",
"Admin Settings": "Cài đặt hệ thống",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "Các tham số Nâng cao",
"Advanced Params": "Các tham số Nâng cao",
"all": "tất cả",
@@ -72,8 +73,8 @@
"Being lazy": "Lười biếng",
"Brave Search API Key": "Khóa API tìm kiếm dũng cảm",
"Bypass SSL verification for Websites": "Bỏ qua xác thực SSL cho các trang web",
"Call": "",
"Call feature is not supported when using Web STT engine": "",
"Call": "Gọi",
"Call feature is not supported when using Web STT engine": "Tính năng gọi điện không được hỗ trợ khi sử dụng công cụ Web STT",
"Camera": "",
"Cancel": "Hủy bỏ",
"Capabilities": "Năng lực",
@@ -92,12 +93,12 @@
"Chunk Params": "Tham số khối (chunk)",
"Chunk Size": "Kích thước khối (size)",
"Citation": "Trích dẫn",
"Clear memory": "",
"Clear memory": "Xóa bộ nhớ",
"Click here for help.": "Bấm vào đây để được trợ giúp.",
"Click here to": "Nhấn vào đây để",
"Click here to select": "Bấm vào đây để chọn",
"Click here to select a csv file.": "Nhấn vào đây để chọn tệp csv",
"Click here to select a py file.": "",
"Click here to select a py file.": "Nhấn vào đây để chọn tệp py",
"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
"click here.": "bấm vào đây.",
"Click on the user role button to change a user's role.": "Bấm vào nút trong cột VAI TRÒ để thay đổi quyền của người sử dụng.",
@@ -111,7 +112,7 @@
"Concurrent Requests": "Các truy vấn đồng thời",
"Confirm Password": "Xác nhận Mật khẩu",
"Connections": "Kết nối",
"Contact Admin for WebUI Access": "",
"Contact Admin for WebUI Access": "Liên hệ với Quản trị viên để được cấp quyền truy cập",
"Content": "Nội dung",
"Context Length": "Độ dài ngữ cảnh (Context Length)",
"Continue Response": "Tiếp tục trả lời",
@@ -158,11 +159,11 @@
"Discover a prompt": "Khám phá thêm prompt mới",
"Discover, download, and explore custom prompts": "Tìm kiếm, tải về và khám phá thêm các prompt tùy chỉnh",
"Discover, download, and explore model presets": "Tìm kiếm, tải về và khám phá thêm các thiết lập mô hình sẵn",
"Dismissible": "",
"Dismissible": "Có thể loại bỏ",
"Display the username instead of You in the Chat": "Hiển thị tên người sử dụng thay vì 'Bạn' trong nội dung chat",
"Document": "Tài liệu",
"Document Settings": "Cấu hình kho tài liệu",
"Documentation": "",
"Documentation": "Tài liệu",
"Documents": "Tài liệu",
"does not make any external connections, and your data stays securely on your locally hosted server.": "không thực hiện bất kỳ kết nối ngoài nào, và dữ liệu của bạn vẫn được lưu trữ an toàn trên máy chủ lưu trữ cục bộ của bạn.",
"Don't Allow": "Không Cho phép",
@@ -201,6 +202,7 @@
"Enter Score": "Nhập Score",
"Enter Searxng Query URL": "Nhập Query URL cho Searxng",
"Enter Serper API Key": "Nhập Serper API Key",
"Enter Serply API Key": "Nhập Serply API Key",
"Enter Serpstack API Key": "Nhập Serpstack API Key",
"Enter stop sequence": "Nhập stop sequence",
"Enter Top K": "Nhập Top K",
@@ -214,15 +216,16 @@
"Experimental": "Thử nghiệm",
"Export": "Xuất khẩu",
"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
"Export chat (.json)": "",
"Export chat (.json)": "Tải chat (.json)",
"Export Chats": "Tải nội dung chat về máy",
"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
"Export Models": "Tải Models về máy",
"Export Prompts": "Tải các prompt về máy",
"External Models": "",
"Export Tools": "",
"External Models": "Các model ngoài",
"Failed to create API Key.": "Lỗi khởi tạo API Key",
"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
"Failed to update settings": "",
"Failed to update settings": "Lỗi khi cập nhật các cài đặt",
"February": "Tháng 2",
"Feel free to add specific details": "Mô tả chi tiết về chất lượng của câu hỏi và phương án trả lời",
"File Mode": "Chế độ Tệp văn bản",
@@ -235,7 +238,7 @@
"Frequency Penalty": "Hình phạt tần số",
"General": "Cài đặt chung",
"General Settings": "Cấu hình chung",
"Generate Image": "",
"Generate Image": "Sinh ảnh",
"Generating search query": "Tạo truy vấn tìm kiếm",
"Generation Info": "Thông tin chung",
"Good Response": "Trả lời tốt",
@@ -256,11 +259,12 @@
"Import Documents Mapping": "Nạp cấu trúc tài liệu",
"Import Models": "Nạp model",
"Import Prompts": "Nạp các prompt lên hệ thống",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "Bao gồm flag `--api` khi chạy stable-diffusion-webui",
"Info": "Thông tin",
"Input commands": "Nhập các câu lệnh",
"Install from Github URL": "Cài đặt từ Github URL",
"Instant Auto-Send After Voice Transcription": "",
"Instant Auto-Send After Voice Transcription": "Tự động gửi ngay lập tức sau khi phiên dịch giọng nói",
"Interface": "Giao diện",
"Invalid Tag": "Tag không hợp lệ",
"January": "Tháng 1",
@@ -273,17 +277,17 @@
"JWT Token": "Token JWT",
"Keep Alive": "Giữ kết nối",
"Keyboard shortcuts": "Phím tắt",
"Knowledge": "",
"Knowledge": "Kiến thức",
"Language": "Ngôn ngữ",
"Last Active": "Truy cập gần nhất",
"Light": "Sáng",
"Listening...": "",
"Listening...": "Đang nghe...",
"LLMs can make mistakes. Verify important information.": "Hệ thống có thể tạo ra nội dung không chính xác hoặc sai. Hãy kiểm chứng kỹ lưỡng thông tin trước khi tiếp nhận và sử dụng.",
"Local Models": "",
"LTR": "LTR",
"Made by OpenWebUI Community": "Được tạo bởi Cộng đồng OpenWebUI",
"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
"Manage": "",
"Manage": "Quản lý",
"Manage Models": "Quản lý mô hình",
"Manage Ollama Models": "Quản lý mô hình với Ollama",
"Manage Pipelines": "Quản lý Pipelines",
@@ -319,7 +323,7 @@
"Name your model": "Tên model",
"New Chat": "Tạo chat mới",
"New Password": "Mật khẩu mới",
"No documents found": "",
"No documents found": "Không tìm thấy tài liệu nào",
"No results found": "Không tìm thấy kết quả",
"No search query generated": "Không có truy vấn tìm kiếm nào được tạo ra",
"No source available": "Không có nguồn",
@@ -336,7 +340,7 @@
"Ollama": "Ollama",
"Ollama API": "Ollama API",
"Ollama API disabled": "API Ollama bị vô hiệu hóa",
"Ollama API is disabled": "",
"Ollama API is disabled": "Ollama API đang bị vô hiệu hóa",
"Ollama Version": "Phiên bản Ollama",
"On": "Bật",
"Only": "Only",
@@ -359,12 +363,12 @@
"PDF document (.pdf)": "Tập tin PDF (.pdf)",
"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
"pending": "đang chờ phê duyệt",
"Permission denied when accessing media devices": "",
"Permission denied when accessing microphone": "",
"Permission denied when accessing media devices": "Quyền truy cập các thiết bị đa phương tiện bị từ chối",
"Permission denied when accessing microphone": "Quyền truy cập micrô bị từ chối",
"Permission denied when accessing microphone: {{error}}": "Quyền truy cập micrô bị từ chối: {{error}}",
"Personalization": "Cá nhân hóa",
"Pipelines": "Đường ống",
"Pipelines Valves": "Van đường ống",
"Pipelines": "",
"Pipelines Valves": "",
"Plain text (.txt)": "Văn bản thô (.txt)",
"Playground": "Thử nghiệm (Playground)",
"Positive attitude": "Thái độ tích cực",
@@ -383,7 +387,7 @@
"Read Aloud": "Đọc ra loa",
"Record voice": "Ghi âm",
"Redirecting you to OpenWebUI Community": "Đang chuyển hướng bạn đến Cộng đồng OpenWebUI",
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Hãy coi bản thân mình như \"Người dùng\" (ví dụ: \"Người dùng đang học Tiếng Tây Ban Nha\")",
"Refused when it shouldn't have": "Từ chối trả lời mà nhẽ không nên làm vậy",
"Regenerate": "Tạo sinh lại câu trả lời",
"Release Notes": "Mô tả những cập nhật mới",
@@ -402,7 +406,7 @@
"Rosé Pine": "Rosé Pine",
"Rosé Pine Dawn": "Rosé Pine Dawn",
"RTL": "RTL",
"Running": "",
"Running": "Đang chạy",
"Save": "Lưu",
"Save & Create": "Lưu & Tạo",
"Save & Update": "Lưu & Cập nhật",
@@ -416,30 +420,33 @@
"Search Documents": "Tìm tài liệu",
"Search Models": "Tìm model",
"Search Prompts": "Tìm prompt",
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Query Generation Prompt": "Prompt tạo câu truy vấn, tìm kiếm",
"Search Query Generation Prompt Length Threshold": "Ngưỡng độ dài prompt tạo câu truy vấn, tìm kiếm",
"Search Result Count": "Số kết quả tìm kiếm",
"Search Tools": "",
"Searched {{count}} sites_other": "Đã tìm {{count}} sites_other",
"Searching the web for '{{searchQuery}}'": "Tìm kiếm web cho '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "Đang tìm \"{{searchQuery}}\"",
"Searxng Query URL": "URL truy vấn Searxng",
"See readme.md for instructions": "Xem readme.md để biết hướng dẫn",
"See what's new": "Xem những cập nhật mới",
"Seed": "Seed",
"Select a base model": "Chọn một base model",
"Select a engine": "",
"Select a engine": "Chọn dịch vụ",
"Select a mode": "Chọn một chế độ",
"Select a model": "Chọn mô hình",
"Select a pipeline": "Chọn một quy trình",
"Select a pipeline url": "Chọn url quy trình",
"Select an Ollama instance": "Chọn một thực thể Ollama",
"Select Documents": "Chọn tài liệu",
"Select model": "Chọn model",
"Select only one model to call": "",
"Select only one model to call": "Chọn model để gọi",
"Selected model(s) do not support image inputs": "Model được lựa chọn không hỗ trợ đầu vào là hình ảnh",
"Send": "Gửi",
"Send a Message": "Gửi yêu cầu",
"Send message": "Gửi yêu cầu",
"September": "Tháng 9",
"Serper API Key": "Khóa API Serper",
"Serply API Key": "",
"Serpstack API Key": "Khóa API Serpstack",
"Server connection verified": "Kết nối máy chủ đã được xác minh",
"Set as default": "Đặt làm mặc định",
@@ -452,13 +459,13 @@
"Set Voice": "Đặt Giọng nói",
"Settings": "Cài đặt",
"Settings saved successfully!": "Cài đặt đã được lưu thành công!",
"Settings updated successfully": "",
"Settings updated successfully": "Các cài đặt đã được cập nhật thành công",
"Share": "Chia sẻ",
"Share Chat": "Chia sẻ Chat",
"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",
"short-summary": "tóm tắt ngắn",
"Show": "Hiển thị",
"Show Admin Details in Account Pending Overlay": "",
"Show Admin Details in Account Pending Overlay": "Hiển thị thông tin của Quản trị viên trên màn hình hiển thị Tài khoản đang chờ xử lý",
"Show shortcuts": "Hiển thị phím tắt",
"Showcased creativity": "Thể hiện sự sáng tạo",
"sidebar": "thanh bên",
@@ -489,9 +496,9 @@
"Thanks for your feedback!": "Cám ơn bạn đã gửi phản hồi!",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Điểm (score) phải có giá trị từ 0,0 (0%) đến 1,0 (100%).",
"Theme": "Chủ đề",
"Thinking...": "",
"Thinking...": "Đang suy luận...",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Điều này đảm bảo rằng các nội dung chat có giá trị của bạn được lưu an toàn vào cơ sở dữ liệu backend của bạn. Cảm ơn bạn!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Đây là tính năng thử nghiệm, có thể không hoạt động như mong đợi và có thể thay đổi bất kỳ lúc nào.",
"This setting does not sync across browsers or devices.": "Cài đặt này không đồng bộ hóa trên các trình duyệt hoặc thiết bị.",
"Thorough explanation": "Giải thích kỹ lưỡng",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Mẹo: Cập nhật nhiều khe biến liên tiếp bằng cách nhấn phím tab trong đầu vào trò chuyện sau mỗi việc thay thế.",
@@ -503,11 +510,14 @@
"to": " - ",
"To access the available model names for downloading,": "Để truy cập các tên mô hình có sẵn để tải xuống,",
"To access the GGUF models available for downloading,": "Để truy cập các mô hình GGUF có sẵn để tải xuống,",
"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.": "Để truy cập vui lòng liên hệ với quản trị viên.",
"To add documents here, upload them to the \"Documents\" workspace first.": "Để thêm tài liệu, trước tiên hãy upload chúng lên khu vực \"Tài liệu\".",
"to chat input.": "đến đầu vào trò chuyện.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "Hôm nay",
"Toggle settings": "Bật/tắt cài đặt",
"Toggle sidebar": "Bật/tắt thanh bên",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "Gặp vấn đề khi truy cập Ollama?",
@@ -553,19 +563,19 @@
"Whats New in": "Thông tin mới về",
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Khi chế độ lịch sử chat đã tắt, các nội dung chat mới trên trình duyệt này sẽ không xuất hiện trên bất kỳ thiết bị nào của bạn.",
"Whisper (Local)": "",
"Widescreen Mode": "",
"Widescreen Mode": "Chế độ màn hình rộng",
"Workspace": "Workspace",
"Write a prompt suggestion (e.g. Who are you?)": "Hãy viết một prompt (vd: Bạn là ai?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "Viết một tóm tắt trong vòng 50 từ cho [chủ đề hoặc từ khóa].",
"Yesterday": "Hôm qua",
"You": "Bạn",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Bạn có thể cá nhân hóa các tương tác của mình với LLM bằng cách thêm bộ nhớ thông qua nút 'Quản lý' bên dưới, làm cho chúng hữu ích hơn và phù hợp với bạn hơn.",
"You cannot clone a base model": "Bạn không thể nhân bản base model",
"You have no archived conversations.": "Bạn chưa lưu trữ một nội dung chat nào",
"You have shared this chat": "Bạn vừa chia sẻ chat này",
"You're a helpful assistant.": "Bạn là một trợ lý hữu ích.",
"You're now logged in.": "Bạn đã đăng nhập.",
"Your account status is currently pending activation.": "",
"Your account status is currently pending activation.": "Tài khoản của bạn hiện đang ở trạng thái chờ kích hoạt.",
"Youtube": "Youtube",
"Youtube Loader Settings": "Cài đặt Youtube Loader"
}
+16 -6
View File
@@ -33,6 +33,7 @@
"Admin": "管理员联系方式",
"Admin Panel": "管理员面板",
"Admin Settings": "管理员设置",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "高级参数",
"Advanced Params": "高级参数",
"all": "所有",
@@ -74,7 +75,7 @@
"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
"Call": "呼叫",
"Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能。",
"Camera": "",
"Camera": "摄像头",
"Cancel": "取消",
"Capabilities": "能力",
"Change Password": "更改密码",
@@ -201,6 +202,7 @@
"Enter Score": "输入评分",
"Enter Searxng Query URL": "输入 Searxng 查询地址",
"Enter Serper API Key": "输入 Serper API 密钥",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "输入 Serpstack API 密钥",
"Enter stop sequence": "输入停止序列 (Stop Sequence)",
"Enter Top K": "输入 Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "导出文档映射",
"Export Models": "导出模型",
"Export Prompts": "导出提示词",
"Export Tools": "导出工具",
"External Models": "外部模型",
"Failed to create API Key.": "无法创建 API 密钥。",
"Failed to read clipboard contents": "无法读取剪贴板内容",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "导入文档映射",
"Import Models": "导入模型",
"Import Prompts": "导入提示词",
"Import Tools": "导入工具",
"Include `--api` flag when running stable-diffusion-webui": "运行 stable-diffusion-webui 时包含 `--api` 标志",
"Info": "信息",
"Input commands": "输入命令",
@@ -273,7 +277,7 @@
"JWT Token": "JWT 令牌",
"Keep Alive": "保持活动",
"Keyboard shortcuts": "键盘快捷键",
"Knowledge": "",
"Knowledge": "知识库",
"Language": "语言",
"Last Active": "最后在线时间",
"Light": "浅色",
@@ -319,7 +323,7 @@
"Name your model": "为您的模型命名",
"New Chat": "新对话",
"New Password": "新密码",
"No documents found": "",
"No documents found": "未找到文档",
"No results found": "未找到结果",
"No search query generated": "未生成搜索查询",
"No source available": "没有可用来源",
@@ -416,11 +420,12 @@
"Search Documents": "搜索文档",
"Search Models": "搜索模型",
"Search Prompts": "搜索提示词",
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Query Generation Prompt": "搜索查询生成提示",
"Search Query Generation Prompt Length Threshold": "搜索查询生成提示长度阈值",
"Search Result Count": "搜索结果数量",
"Search Tools": "搜索工具",
"Searched {{count}} sites_other": "检索到 {{count}} 个网站",
"Searching the web for '{{searchQuery}}'": "在网络中搜索 '{{searchQuery}}' ",
"Searching \"{{searchQuery}}\"": "搜索 \"{{searchQuery}}\" 中",
"Searxng Query URL": "Searxng 查询 URL",
"See readme.md for instructions": "查看 readme.md 以获取说明",
"See what's new": "查阅最新更新内容",
@@ -432,6 +437,7 @@
"Select a pipeline": "选择一个管道",
"Select a pipeline url": "选择一个管道 URL",
"Select an Ollama instance": "选择一个 Ollama 实例",
"Select Documents": "选择文档",
"Select model": "选择模型",
"Select only one model to call": "请仅选择一个模型来呼叫",
"Selected model(s) do not support image inputs": "已选择的模型不支持发送图像",
@@ -440,6 +446,7 @@
"Send message": "发送消息",
"September": "九月",
"Serper API Key": "Serper API 密钥",
"Serply API Key": "Serply API 密钥",
"Serpstack API Key": "Serpstack API 密钥",
"Server connection verified": "已验证服务器连接",
"Set as default": "设为默认",
@@ -504,10 +511,13 @@
"To access the available model names for downloading,": "要访问可下载的模型名称,",
"To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,",
"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 chat input.": "到对话输入。",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "今天",
"Toggle settings": "切换设置",
"Toggle sidebar": "切换侧边栏",
"Tools": "工具",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "访问 Ollama 时遇到问题?",
+11 -1
View File
@@ -33,6 +33,7 @@
"Admin": "",
"Admin Panel": "管理員控制台",
"Admin Settings": "管理設定",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
"Advanced Parameters": "進階參數",
"Advanced Params": "進階參數",
"all": "所有",
@@ -201,6 +202,7 @@
"Enter Score": "輸入分數",
"Enter Searxng Query URL": "輸入 Searxng 查詢 URL",
"Enter Serper API Key": "輸入 Serper API Key",
"Enter Serply API Key": "",
"Enter Serpstack API Key": "輸入 Serpstack API Key",
"Enter stop sequence": "輸入停止序列",
"Enter Top K": "輸入 Top K",
@@ -219,6 +221,7 @@
"Export Documents Mapping": "匯出文件映射",
"Export Models": "匯出模型",
"Export Prompts": "匯出提示詞",
"Export Tools": "",
"External Models": "",
"Failed to create API Key.": "無法創建 API 金鑰。",
"Failed to read clipboard contents": "無法讀取剪貼簿內容",
@@ -256,6 +259,7 @@
"Import Documents Mapping": "匯入文件映射",
"Import Models": "匯入模型",
"Import Prompts": "匯入提示詞",
"Import Tools": "",
"Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
"Info": "資訊",
"Input commands": "輸入命令",
@@ -419,8 +423,9 @@
"Search Query Generation Prompt": "",
"Search Query Generation Prompt Length Threshold": "",
"Search Result Count": "搜尋結果數量",
"Search Tools": "",
"Searched {{count}} sites_other": "掃描 {{count}} 個網站_其他",
"Searching the web for '{{searchQuery}}'": "搜尋網站 '{{searchQuery}}'",
"Searching \"{{searchQuery}}\"": "",
"Searxng Query URL": "Searxng 查詢 URL",
"See readme.md for instructions": "查看 readme.md 獲取指南",
"See what's new": "查看最新內容",
@@ -432,6 +437,7 @@
"Select a pipeline": "選擇管道",
"Select a pipeline url": "選擇管道 URL",
"Select an Ollama instance": "選擇 Ollama 實例",
"Select Documents": "",
"Select model": "選擇模型",
"Select only one model to call": "",
"Selected model(s) do not support image inputs": "已選擇模型不支持圖像輸入",
@@ -440,6 +446,7 @@
"Send message": "傳送訊息",
"September": "九月",
"Serper API Key": "Serper API Key",
"Serply API Key": "",
"Serpstack API Key": "Serpstack API Key",
"Server connection verified": "已驗證伺服器連線",
"Set as default": "設為預設",
@@ -504,10 +511,13 @@
"To access the available model names for downloading,": "若想查看可供下載的模型名稱,",
"To access the GGUF models available for downloading,": "若想查看可供下載的 GGUF 模型名稱,",
"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 chat input.": "到聊天輸入框來啟動此命令。",
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
"Today": "今天",
"Toggle settings": "切換設定",
"Toggle sidebar": "切換側邊欄",
"Tools": "",
"Top K": "Top K",
"Top P": "Top P",
"Trouble accessing Ollama?": "存取 Ollama 時遇到問題?",
+10 -16
View File
@@ -23,24 +23,11 @@ export const chatId = writable('');
export const chats = writable([]);
export const tags = writable([]);
export const models: Writable<Model[]> = writable([]);
export const modelfiles = writable([]);
export const models: Writable<Model[]> = writable([]);
export const prompts: Writable<Prompt[]> = writable([]);
export const documents = writable([
{
collection_name: 'collection_name',
filename: 'filename',
name: 'name',
title: 'title'
},
{
collection_name: 'collection_name1',
filename: 'filename1',
name: 'name1',
title: 'title1'
}
]);
export const documents: Writable<Document[]> = writable([]);
export const tools = writable([]);
export const banners: Writable<Banner[]> = writable([]);
@@ -135,6 +122,13 @@ type Prompt = {
timestamp: number;
};
type Document = {
collection_name: string;
filename: string;
name: string;
title: string;
};
type Config = {
status: boolean;
name: string;
+12 -18
View File
@@ -8,12 +8,15 @@
import { goto } from '$app/navigation';
import { getModels as _getModels } from '$lib/apis';
import { getOllamaVersion } from '$lib/apis/ollama';
import { getPrompts } from '$lib/apis/prompts';
import { getDocs } from '$lib/apis/documents';
import { getAllChatTags } from '$lib/apis/chats';
import { getPrompts } from '$lib/apis/prompts';
import { getDocs } from '$lib/apis/documents';
import { getTools } from '$lib/apis/tools';
import { getBanners } from '$lib/apis/configs';
import { getUserSettings } from '$lib/apis/users';
import {
user,
showSettings,
@@ -25,33 +28,21 @@
banners,
showChangelog,
config,
showCallOverlay
showCallOverlay,
tools
} from '$lib/stores';
import { REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants';
import { compareVersion } from '$lib/utils';
import SettingsModal from '$lib/components/chat/SettingsModal.svelte';
import Sidebar from '$lib/components/layout/Sidebar.svelte';
import ShortcutsModal from '$lib/components/chat/ShortcutsModal.svelte';
import ChangelogModal from '$lib/components/ChangelogModal.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import { getBanners } from '$lib/apis/configs';
import { getUserSettings } from '$lib/apis/users';
import Help from '$lib/components/layout/Help.svelte';
import AccountPending from '$lib/components/layout/Overlay/AccountPending.svelte';
import { error } from '@sveltejs/kit';
import CallOverlay from '$lib/components/chat/MessageInput/CallOverlay.svelte';
const i18n = getContext('i18n');
let ollamaVersion = '';
let loaded = false;
let showShortcutsButtonElement: HTMLButtonElement;
let DB = null;
let localDBChats = [];
let showShortcuts = false;
const getModels = async () => {
return _getModels(localStorage.token);
};
@@ -99,6 +90,9 @@
(async () => {
documents.set(await getDocs(localStorage.token));
})(),
(async () => {
tools.set(await getTools(localStorage.token));
})(),
(async () => {
banners.set(await getBanners(localStorage.token));
})(),
+14 -1
View File
@@ -14,7 +14,11 @@
</title>
</svelte:head>
<div class=" flex flex-col w-full min-h-screen max-h-screen">
<div
class=" flex flex-col w-full min-h-screen max-h-screen {$showSidebar
? 'md:max-w-[calc(100%-260px)]'
: ''}"
>
<div class=" px-4 pt-3 mt-0.5 mb-1">
<div class=" flex items-center gap-1">
<div class="{$showSidebar ? 'md:hidden' : ''} mr-1 self-start flex flex-none items-center">
@@ -61,6 +65,15 @@
{$i18n.t('Documents')}
</a>
<a
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/tools')
? 'bg-gray-50 dark:bg-gray-850'
: ''} transition"
href="/workspace/tools"
>
{$i18n.t('Tools')}
</a>
<a
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/playground')
? 'bg-gray-50 dark:bg-gray-850'
@@ -2,7 +2,7 @@
import { v4 as uuidv4 } from 'uuid';
import { toast } from 'svelte-sonner';
import { goto } from '$app/navigation';
import { settings, user, config, models } from '$lib/stores';
import { settings, user, config, models, tools } from '$lib/stores';
import { onMount, tick, getContext } from 'svelte';
import { addNewModel, getModelById, getModelInfos } from '$lib/apis/models';
@@ -12,6 +12,8 @@
import Checkbox from '$lib/components/common/Checkbox.svelte';
import Tags from '$lib/components/common/Tags.svelte';
import Knowledge from '$lib/components/workspace/Models/Knowledge.svelte';
import ToolsSelector from '$lib/components/workspace/Models/ToolsSelector.svelte';
import { stringify } from 'postcss';
const i18n = getContext('i18n');
@@ -54,16 +56,16 @@
vision: true
};
let toolIds = [];
let knowledge = [];
$: if (name) {
id = name.replace(/\s+/g, '-').toLowerCase();
}
let baseModel = null;
$: {
baseModel = $models.find((m) => m.id === info.base_model_id);
console.log(baseModel);
const addUsage = (base_model_id) => {
const baseModel = $models.find((m) => m.id === base_model_id);
if (baseModel) {
if (baseModel.owned_by === 'openai') {
capabilities.usage = baseModel.info?.meta?.capabilities?.usage ?? false;
@@ -72,7 +74,7 @@
}
capabilities = capabilities;
}
}
};
const submitHandler = async () => {
loading = true;
@@ -89,6 +91,14 @@
}
}
if (toolIds.length > 0) {
info.meta.toolIds = toolIds;
} else {
if (info.meta.toolIds) {
delete info.meta.toolIds;
}
}
info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
Object.keys(info.params).forEach((key) => {
if (info.params[key] === '' || info.params[key] === null) {
@@ -155,6 +165,7 @@
params.stop = params?.stop ? (params?.stop ?? []).join(',') : null;
capabilities = { ...capabilities, ...(model?.info?.meta?.capabilities ?? {}) };
toolIds = model?.info?.meta?.toolIds ?? [];
info = {
...info,
@@ -360,6 +371,9 @@
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
placeholder="Select a base model (e.g. llama3, gpt-4o)"
bind:value={info.base_model_id}
on:change={(e) => {
addUsage(e.target.value);
}}
required
>
<option value={null} class=" text-gray-900">{$i18n.t('Select a base model')}</option>
@@ -445,6 +459,7 @@
{#if showAdvanced}
<div class="my-2">
<AdvancedParams
admin={true}
bind:params
on:change={(e) => {
info.params = { ...info.params, ...params };
@@ -551,6 +566,10 @@
<Knowledge bind:knowledge />
</div>
<div class="my-2">
<ToolsSelector bind:selectedToolIds={toolIds} tools={$tools} />
</div>
<div class="my-1">
<div class="flex w-full justify-between mb-1">
<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>
@@ -5,7 +5,7 @@
import { onMount, getContext } from 'svelte';
import { page } from '$app/stores';
import { settings, user, config, models } from '$lib/stores';
import { settings, user, config, models, tools } from '$lib/stores';
import { splitStream } from '$lib/utils';
import { getModelInfos, updateModelById } from '$lib/apis/models';
@@ -15,6 +15,7 @@
import Checkbox from '$lib/components/common/Checkbox.svelte';
import Tags from '$lib/components/common/Tags.svelte';
import Knowledge from '$lib/components/workspace/Models/Knowledge.svelte';
import ToolsSelector from '$lib/components/workspace/Models/ToolsSelector.svelte';
const i18n = getContext('i18n');
@@ -60,6 +61,7 @@
};
let knowledge = [];
let toolIds = [];
const updateHandler = async () => {
loading = true;
@@ -76,6 +78,14 @@
}
}
if (toolIds.length > 0) {
info.meta.toolIds = toolIds;
} else {
if (info.meta.toolIds) {
delete info.meta.toolIds;
}
}
info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
Object.keys(info.params).forEach((key) => {
if (info.params[key] === '' || info.params[key] === null) {
@@ -133,6 +143,10 @@
knowledge = [...model?.info?.meta?.knowledge];
}
if (model?.info?.meta?.toolIds) {
toolIds = [...model?.info?.meta?.toolIds];
}
if (model?.owned_by === 'openai') {
capabilities.usage = false;
}
@@ -408,6 +422,7 @@
{#if showAdvanced}
<div class="my-2">
<AdvancedParams
admin={true}
bind:params
on:change={(e) => {
info.params = { ...info.params, ...params };
@@ -514,6 +529,10 @@
<Knowledge bind:knowledge />
</div>
<div class="my-2">
<ToolsSelector bind:selectedToolIds={toolIds} tools={$tools} />
</div>
<div class="my-2">
<div class="flex w-full justify-between mb-1">
<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>
@@ -0,0 +1,5 @@
<script>
import Tools from '$lib/components/workspace/Tools.svelte';
</script>
<Tools />

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