From 03cf9cf5c60ef418d6bc83f8e2f0504847b702f4 Mon Sep 17 00:00:00 2001 From: Jun Siang Cheah Date: Sat, 25 May 2024 15:20:53 +0100 Subject: [PATCH 01/41] feat: add missing env vars to doc --- docs/getting-started/env-configuration.md | 53 ++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/env-configuration.md b/docs/getting-started/env-configuration.md index f1b8ed6..890e75c 100644 --- a/docs/getting-started/env-configuration.md +++ b/docs/getting-started/env-configuration.md @@ -16,7 +16,7 @@ Here is a list of supported environment variables used by `backend/config.py` in - **Docker Default**: `prod` - Description: Environment setting. -### `WEBUI_AUTH` +#### `WEBUI_AUTH` - Default Setting: `True` - Description: This setting enables or disables authentication. If set to False, authentication is disabled. However, it's important to note that turning off authentication is only possible for fresh installations without any existing users. If there are already users registered, you cannot disable authentication directly. Ensure that no users are present in the database if you intend to turn off `WEBUI_AUTH`. @@ -109,6 +109,12 @@ Here is a list of supported environment variables used by `backend/config.py` in - Docker Default: Randomly generated on first start - Description: Overrides the randomly generated string used for JSON Web Token. +#### `JWT_EXPIRES_IN` + +- Default: `-1` +- Description: Sets the JWT expiration time in seconds. A value of -1 disables expiration. + + #### `USE_CUDA_DOCKER` - Default: `False` @@ -280,6 +286,41 @@ Query: [query] - Description: Template to use when injecting RAG documents into chat completion +#### `RAG_RERANKING_MODEL` + +- Default: `` +- Description: Sets a model for reranking results. Locally, a Sentence-Transformer model is used. + +#### `RAG_RERANKING_MODEL_AUTO_UPDATE` + +- Default: `False` +- Description: Toggles automatic update of the reranking model. + +#### `RAG_RERANKING_MODEL_TRUST_REMOTE_CODE` + +- Default: `False` +- Description: Determines whether or not to allow custom models defined on the Hub in their own modeling files for reranking. + +#### `RAG_OPENAI_API_BASE_URL` + +- Default: `${OPENAI_API_BASE_URL}` +- Description: Sets the OpenAI base API URL to use for RAG embeddings. + +#### `RAG_OPENAI_API_KEY` + +- Default: `${OPENAI_API_KEY}` +- Description: Sets the OpenAI API key to use for RAG embeddings. + +#### `ENABLE_RAG_LOCAL_WEB_FETCH` + +- Default: `False` +- Description: Enables local web fetching for RAG. Enabling this allows Server Side Request Forgery attacks against local network resources. + +#### `YOUTUBE_LOADER_LANGUAGE` + +- Default: `en` +- Description: Sets the language to use for YouTube video loading. + #### `CHUNK_SIZE` - Default: `1500` @@ -319,6 +360,16 @@ Query: [query] - Default: `${OPENAI_API_KEY}` - Description: Sets the API key to use for text-to-speech. +#### `AUDIO_OPENAI_API_MODEL` + +- Default: `tts-1` +- Description: Specifies the OpenAI text-to-speech model to use. + +#### `AUDIO_OPENAI_API_VOICE` + +- Default: `alloy` +- Description: Sets the OpenAI text-to-speech voice to use. + ### Image Generation #### `ENABLE_IMAGE_GENERATION` From ce6d03e032030e7bb45cefc47586bc381f3c90e7 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 18:22:51 +0000 Subject: [PATCH 02/41] Create features.md This will need some revision --- features.md | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 features.md diff --git a/features.md b/features.md new file mode 100644 index 0000000..d276956 --- /dev/null +++ b/features.md @@ -0,0 +1,159 @@ +## Key Features of Open WebUI ⭐ + +- πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. In its alpha phase, occasional issues may arise as we actively refine and enhance this feature to ensure optimal performance and reliability. **Revolutionize chat interactions with RAG support**. + +- πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. **Take control of your document interactions**. + +- 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by the URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions. **Surf the web within your chat**. + +- πŸ€– **Multiple Model Support**: Seamlessly switch between different chat models for diverse interactions. **Explore multiple perspectives in a single chat**. + +- 🧩 **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. **Design your ideal chat model**. + +- πŸ‘₯ **'@' Model Integration**: Harness the collective intelligence of multiple models in a single chat by seamlessly switching to any acessible local or external model during conversations by using the `@` command to specify the model by name. **Unlock the power of multiple models**. + +- 🎨 **Image Generation Integration**: Seamlessly incorporate image generation capabilities using options such as AUTOMATIC1111 API or ComfyUI (local), and OpenAI's DALL-E (external), enriching your chat experience with dynamic visual content. **Bring your chats to life with images**. + +- 🀝 **OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the Ollama API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. **Tap into the power of OpenAI**. + +- πŸ”„ **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). **Experience the future of chat interactions**. + +- βš™οΈ **Fine-Tuned Control with Advanced Parameters**: Gain a deeper level of control by adjusting parameters such as temperature, context length, and seed, and define your system prompts to tailor the conversation to your specific preferences and needs. **Tailor your conversations to your needs**. + +- 🌐🌍 **Multilingual Support**: Experience Open WebUI in your preferred language with our internationalization (i18n) support. Join us in expanding our supported languages! We're actively seeking contributors! **Chat in your native tongue**. + +- ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences. **Accommodate diverse language preferences**. + +- 🌟 **Continuous Updates**: We are committed to improving Open WebUI with regular updates, fixes, and new features. **Enjoy the latest innovations in chat technology**. + +
+ And many more remarkable features including... ⚑️ + +
+ 🌈 User Experience + +- πŸ–₯️ **Intuitive Interface**: Our chat interface takes inspiration from ChatGPT user interface, ensuring a user-friendly experience. + +- πŸ“± **Responsive Design**: Enjoy a seamless experience across Desktop PC, Laptop, and Mobile devices. + +- ⚑ **Swift Responsiveness**: Enjoy reliably fast and responsive performance. + +- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience. + +- πŸ“¦ **Pip Install Method (Soon/WIP)**: Install Open WebUI using pip, simplifying the installation process and making it even easier for newcomers to get started. + +- 🌈 **Theme Customization**: Choose from a variety of solid, yet sleek themes to personalize your Open WebUI experience. Choose between either Light, Dark, or OLED Dark mode; or simply let your device choose for you! + +- πŸ’» **Code Syntax Highlighting**: Enjoy enhanced code readability with our syntax highlighting feature. + +- βœ’οΈπŸ”’ **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction. + +
+ +
+ πŸ’¬ Conversations + +- πŸ“œ **Prompt Preset Support**: Instantly access preset prompts using the `/` command in the chat input. Load predefined conversation starters effortlessly and expedite your interactions. Effortlessly import prompts through [Open WebUI Community](https://openwebui.com/) integration. + +- πŸ‘πŸ‘Ž **RLHF Annotation**: Empower your messages by rating them with thumbs up and thumbs down, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (RLHF). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. + +- 🏷️ **Conversation Tagging**: Effortlessly categorize and locate specific chats for quick reference and streamlined data collection. + +- ⬆️ **GGUF File Model Creation**: Effortlessly create Ollama models by uploading GGUF files directly from the Web UI. Streamlined process with options to upload from your machine or download GGUF files from Hugging Face. + +- βš™οΈ **Many Models Conversations**: Effortlessly engage with various models simultaneously, harnessing their unique strengths for optimal responses. Enhance your experience by leveraging a diverse set of models in parallel. + +- 🧠 **Experimental Memory Feature**: Manually input personal information you want LLMs to remember via Settings > Personalization > Memory. + +- πŸ“œ **Citations in RAG Feature**: Easily track the context fed to the LLM with added citations in the RAG feature. + +- πŸ“Ή **Youtube RAG Pipeline**: Dedicated RAG pipeline for Youtube videos, enabling interaction with video transcriptions directly. + +
+ +
+ πŸ’» Model Management + +- πŸ“₯πŸ—‘οΈ **Download/Delete Models**: Easily download or delete models directly from Open WebUI. + +- πŸ”„ **Update All Ollama Models**: Easily update locally installed models all at once with a convenient button, streamlining model management. + +
+ +
+ πŸ‘₯ Collaboration + +- πŸ—¨οΈ **Local Chat Sharing**: Generate and share chat links seamlessly between users, enhancing collaboration and communication. + +
+ +
+ πŸ“š History and Archive + +- πŸ”„ **Regeneration History Access**: Easily revisit and explore your entire regeneration history. + +- πŸ“œ **Chat History**: Effortlessly access and manage your conversation history. + +- πŸ“¬ **Archive Chats**: Effortlessly store away completed conversations with LLMs for future reference, maintaining a tidy and clutter-free chat interface while allowing for easy retrieval and reference. + +- πŸ“€πŸ“₯ **Import/Export Chat History**: Seamlessly move your chat data in and out of the platform. + +
+ +
+ πŸŽ™οΈ Accessibility + +- πŸ—£οΈ **Voice Input Support**: Engage with your model through voice interactions; enjoy the convenience of talking to your model directly. Additionally, explore the option for sending voice input automatically after 3 seconds of silence for a streamlined experience. + +- πŸ”Š **Configurable Text-to-Speech Endpoint**: Customize your Text-to-Speech experience with configurable OpenAI endpoints. + +
+ +
+ 🐍 Code Execution + +- 🐍 **Python Code Execution**: Execute Python code locally in the browser with libraries like 'requests', 'beautifulsoup4', 'numpy', 'pandas', 'seaborn', 'matplotlib', 'scikit-learn', 'scipy', 'regex'. + +- πŸš€ **Flexible, UI-Agnostic OpenAI-Compatible Pipelines (WIP)**: Seamlessly integrate and customize pipelines for efficient data processing and model training, ensuring ultimate flexibility and scalability. + +
+ +
+ πŸ”“ Integration and Security + +- ✨ **Multiple OpenAI-Compatible API Support**: Seamlessly integrate and customize various OpenAI-compatible APIs, enhancing the versatility of your chat interactions. + +- πŸ”‘ **Simplified API Key Management**: Easily generate and manage secret keys to leverage Open WebUI with OpenAI libraries, streamlining integration and development. + +- πŸŒπŸ”— **External Ollama Server Connectivity**: Seamlessly link to an external Ollama server hosted on a different address by configuring the environment variable. + +- πŸ”€ **Multiple Ollama Instance Load Balancing**: Effortlessly distribute chat requests across multiple Ollama instances for enhanced performance and reliability. + +
+ +
+ πŸ‘‘ Administration + +- πŸ‘‘ **Super Admin Assignment**: Automatically assign the first signup as a super admin as an unchangeable role that cannot be modified by other admins. + +- πŸ›‘οΈ **Granular User Permissions**: Restrict user actions and access with customizable role-based permissions, ensuring that only authorized individuals can perform specific tasks. + +- πŸ‘₯ **Multi-User Management**: Seamlessly manage multiple users through our intuitive admin panel, streamlining user administration and simplifying user lifecycle management. + +- πŸ”§ **Admin Panel**: Streamlined user management with options to add users directly or in bulk via CSV import, making user onboarding and management efficient. + +- πŸ”— **Webhook Integration**: Subscribe to new user sign-up events via webhook (compatible with Discord, Google Chat and Microsoft Teams), providing real-time notifications and automation capabilities. + +- πŸ›‘οΈ **Model Whitelisting**: Enhance security and access control by allowing admins to whitelist models for users with the `user` role, ensuring that only authorized models can be accessed. + +- πŸ“§ **Trusted Email Authentication**: Authenticate using a trusted email header, adding an extra layer of security and authentication to protect your Web UI. + +- πŸ” **Role-Based Access Control (RBAC)**: Ensure secure access with restricted permissions; only authorized individuals can access your Ollama, and exclusive model creation/pulling rights are reserved for administrators. + +- πŸ”’ **Backend Reverse Proxy Support**: Bolster security through direct communication between Open WebUI backend and Ollama. This key feature eliminates the need to expose Ollama over LAN. Requests made to the '/ollama/api' route from the Web UI are seamlessly redirected to Ollama from the backend, enhancing overall system security. + +- πŸ”“ **Optional Authentication**: Enjoy the flexibility to disable authentication by setting WEBUI_AUTH to False, ideal for fresh installations without existing users. + +
+ +
From a9eac547f353f53e39b21549608efeba5164bd86 Mon Sep 17 00:00:00 2001 From: DevTechBytes Date: Sun, 26 May 2024 14:11:30 -0500 Subject: [PATCH 03/41] added tutorial for accessing Open WebUI from other computers on your network --- docs/tutorial-deployment/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/tutorial-deployment/index.md b/docs/tutorial-deployment/index.md index e86fd79..32851f2 100644 --- a/docs/tutorial-deployment/index.md +++ b/docs/tutorial-deployment/index.md @@ -12,6 +12,8 @@ title: "☁️ Deployment" πŸ‘‹ Calling all youtubers! Want to showcase Open WebUI's features in a video? We'll feature it at the top of our guide section! ::: + + From 8c51d58a0fc06ac0af67bcd7a4d829649ffafd94 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 20:14:25 +0000 Subject: [PATCH 04/41] Update index.md 2 --> 200 --- docs/getting-started/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 4598558..13d76b5 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 200 title: "πŸš€ Getting Started" --- From fe7487594a9b645ed30bd9216b22b0745e265bfa Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 20:15:21 +0000 Subject: [PATCH 05/41] Update index.md 3 --> 300 --- docs/troubleshooting/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/troubleshooting/index.md b/docs/troubleshooting/index.md index d7e3ae3..462964a 100644 --- a/docs/troubleshooting/index.md +++ b/docs/troubleshooting/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 300 title: "πŸ› οΈ Troubleshooting" --- From 961fbd07dee29f107eb3d854fb7975ed8788ec9e Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 20:15:53 +0000 Subject: [PATCH 06/41] Update index.md 4 --> 400 --- docs/tutorial-deployment/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial-deployment/index.md b/docs/tutorial-deployment/index.md index e86fd79..38c79f0 100644 --- a/docs/tutorial-deployment/index.md +++ b/docs/tutorial-deployment/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 400 title: "☁️ Deployment" --- From ca559087c1507c3c702d5e07f33cb8d27260e22e Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 20:58:32 +0000 Subject: [PATCH 07/41] Update features.md Added sidebar positioning (blank for now) --- features.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features.md b/features.md index d276956..9ef9a02 100644 --- a/features.md +++ b/features.md @@ -1,3 +1,8 @@ +--- +sidebar_position: # +title: "⭐ Features" +--- + ## Key Features of Open WebUI ⭐ - πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. In its alpha phase, occasional issues may arise as we actively refine and enhance this feature to ensure optimal performance and reliability. **Revolutionize chat interactions with RAG support**. From e9f8b01a72233d970930171a4fee768d0ebacaa2 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 20:59:26 +0000 Subject: [PATCH 08/41] Update features.md Position 200 --- features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features.md b/features.md index 9ef9a02..8c88423 100644 --- a/features.md +++ b/features.md @@ -1,5 +1,5 @@ --- -sidebar_position: # +sidebar_position: 200 title: "⭐ Features" --- From 85e0f4da4163690565fd33171714814403a8a710 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 20:59:43 +0000 Subject: [PATCH 09/41] Update index.md Position 300 --- docs/getting-started/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 13d76b5..87ad256 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 200 +sidebar_position: 300 title: "πŸš€ Getting Started" --- From c48219442a9d936cfbe1e45436de82df38407784 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:00:08 +0000 Subject: [PATCH 10/41] Update index.md Position 400 --- docs/troubleshooting/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/troubleshooting/index.md b/docs/troubleshooting/index.md index 462964a..b9d58b4 100644 --- a/docs/troubleshooting/index.md +++ b/docs/troubleshooting/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 300 +sidebar_position: 400 title: "πŸ› οΈ Troubleshooting" --- From 27085c967b8e74e8c92ea20076f49eebe822833e Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:00:45 +0000 Subject: [PATCH 11/41] Update index.md Position 500 --- docs/tutorial-deployment/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial-deployment/index.md b/docs/tutorial-deployment/index.md index 38c79f0..6240d74 100644 --- a/docs/tutorial-deployment/index.md +++ b/docs/tutorial-deployment/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 400 +sidebar_position: 500 title: "☁️ Deployment" --- From 46b55fb6a32f1b3ce6af1e4f602562e765e8c3c8 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:01:24 +0000 Subject: [PATCH 12/41] Update faq.md Position 600 --- docs/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.md b/docs/faq.md index e9b369d..db40508 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 600 title: "πŸ“‹ FAQ" --- From c01c615a52356855c351e2a71efa6ecc5b573037 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:01:59 +0000 Subject: [PATCH 13/41] Update roadmap.md Position 700 --- docs/roadmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/roadmap.md b/docs/roadmap.md index 436e23b..a9f14fe 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 700 title: "πŸ›£οΈ Roadmap" --- From f5dfb50a3cde7d0be73136c7aaa35612fc4d169c Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:02:19 +0000 Subject: [PATCH 14/41] Update migration.md Position 800 --- docs/migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/migration.md b/docs/migration.md index 9b27f9d..40b0c1a 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 800 title: "πŸ”„ Migration" --- From 33ced9bd29774d06fbdd501ef3d510c103b2299b Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:02:37 +0000 Subject: [PATCH 15/41] Update research.md Position 900 --- docs/research.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/research.md b/docs/research.md index 1cad10e..fcd2cda 100644 --- a/docs/research.md +++ b/docs/research.md @@ -1,5 +1,5 @@ --- -sidebar_position: 8 +sidebar_position: 900 title: "πŸ§‘β€πŸ”¬ Open WebUI for Research" --- From c39d21c7ab1082dfb685dc2fca44a432a3850b74 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:02:56 +0000 Subject: [PATCH 16/41] Update contributing.md Position 1000 --- docs/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contributing.md b/docs/contributing.md index 65d6a67..5004f66 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,5 +1,5 @@ --- -sidebar_position: 9 +sidebar_position: 1000 title: "🀝 Contributing" --- From 3da258a51e5d0d4c873fcc23998ad796c1eff628 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:16:11 +0000 Subject: [PATCH 17/41] Update langfuse.md Fix positioning from 7 to 6. --- docs/tutorial/langfuse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/langfuse.md b/docs/tutorial/langfuse.md index 47edc90..fb0fe9c 100644 --- a/docs/tutorial/langfuse.md +++ b/docs/tutorial/langfuse.md @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 6 title: "Monitoring with Langfuse" --- From f9bda80b701c8d06941a7a90e738ce9568c7e6b2 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:17:09 +0000 Subject: [PATCH 18/41] Update apache.md Add sidebar position in dropdown --- docs/tutorial/apache.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/tutorial/apache.md b/docs/tutorial/apache.md index 4a82f26..07947cd 100644 --- a/docs/tutorial/apache.md +++ b/docs/tutorial/apache.md @@ -1,3 +1,8 @@ +--- +sidebar_position: 7 +title: "Hosting UI and Models separately" +--- + # Hosting UI and Models separately :::note From 624d93b914014dcad945ed855edbcb2fd95df2ed Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:18:12 +0000 Subject: [PATCH 19/41] Update rag.md Add sidebar position in dropdown --- docs/tutorial/rag.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/tutorial/rag.md b/docs/tutorial/rag.md index 8710866..54bd80a 100644 --- a/docs/tutorial/rag.md +++ b/docs/tutorial/rag.md @@ -1,3 +1,8 @@ +--- +sidebar_position: 8 +title: "Retrieval Augmented Generation (RAG)" +--- + # Retrieval Augmented Generation (RAG) Retrieval Augmented Generation (RAG) allows context from other diverse sources to be included in chats. Text from different sources is combined with the RAG template and prefixed to the user's prompt. From 0d98d6d45dc9c5590d4b0546fb4ad1a992788e51 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Sun, 26 May 2024 21:18:44 +0000 Subject: [PATCH 20/41] Update sso.md Add sidebar position in dropdown --- docs/tutorial/sso.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorial/sso.md b/docs/tutorial/sso.md index 44ee1bb..2d1e895 100644 --- a/docs/tutorial/sso.md +++ b/docs/tutorial/sso.md @@ -1,4 +1,5 @@ --- +sidebar_position: 9 title: "Federated Authentication Support" --- From 99e5eb4f4b07433651c6a73a6c96707e1fc30d1b Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 00:45:03 +0000 Subject: [PATCH 21/41] Update features.md Adjustments --- features.md | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/features.md b/features.md index 8c88423..e662685 100644 --- a/features.md +++ b/features.md @@ -5,31 +5,30 @@ title: "⭐ Features" ## Key Features of Open WebUI ⭐ -- πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. In its alpha phase, occasional issues may arise as we actively refine and enhance this feature to ensure optimal performance and reliability. **Revolutionize chat interactions with RAG support**. -- πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. **Take control of your document interactions**. +- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience. -- 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by the URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions. **Surf the web within your chat**. +- 🀝 **Ollama/OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the Ollama API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. -- πŸ€– **Multiple Model Support**: Seamlessly switch between different chat models for diverse interactions. **Explore multiple perspectives in a single chat**. +- πŸ“± **Responsive Design**: Enjoy a seamless experience across Desktop PC, Laptop, and Mobile devices. -- 🧩 **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. **Design your ideal chat model**. +- βœ’οΈπŸ”’ **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction. -- πŸ‘₯ **'@' Model Integration**: Harness the collective intelligence of multiple models in a single chat by seamlessly switching to any acessible local or external model during conversations by using the `@` command to specify the model by name. **Unlock the power of multiple models**. +- 🧩 **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. -- 🎨 **Image Generation Integration**: Seamlessly incorporate image generation capabilities using options such as AUTOMATIC1111 API or ComfyUI (local), and OpenAI's DALL-E (external), enriching your chat experience with dynamic visual content. **Bring your chats to life with images**. +- πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. -- 🀝 **OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the Ollama API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. **Tap into the power of OpenAI**. +- 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by the URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions. -- πŸ”„ **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). **Experience the future of chat interactions**. +- 🎨 **Image Generation Integration**: Seamlessly incorporate image generation capabilities using options such as AUTOMATIC1111 API or ComfyUI (local), and OpenAI's DALL-E (external), enriching your chat experience with dynamic visual content. -- βš™οΈ **Fine-Tuned Control with Advanced Parameters**: Gain a deeper level of control by adjusting parameters such as temperature, context length, and seed, and define your system prompts to tailor the conversation to your specific preferences and needs. **Tailor your conversations to your needs**. +- πŸ€– **Multiple Model Support**: Seamlessly switch between different chat models for diverse interactions. -- 🌐🌍 **Multilingual Support**: Experience Open WebUI in your preferred language with our internationalization (i18n) support. Join us in expanding our supported languages! We're actively seeking contributors! **Chat in your native tongue**. +- πŸ” **Role-Based Access Control (RBAC)**: Ensure secure access with restricted permissions; only authorized individuals can access your Ollama, and exclusive model creation/pulling rights are reserved for administrators. -- ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences. **Accommodate diverse language preferences**. +- 🌐🌍 **Multilingual Support**: Experience Open WebUI in your preferred language with our internationalization (i18n) support. Join us in expanding our supported languages! We're actively seeking contributors! -- 🌟 **Continuous Updates**: We are committed to improving Open WebUI with regular updates, fixes, and new features. **Enjoy the latest innovations in chat technology**. +- 🌟 **Continuous Updates**: We are committed to improving Open WebUI with regular updates, fixes, and new features.
And many more remarkable features including... ⚑️ @@ -58,6 +57,16 @@ title: "⭐ Features"
πŸ’¬ Conversations +- πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. In its alpha phase, occasional issues may arise as we actively refine and enhance this feature to ensure optimal performance and reliability. + +- πŸ‘₯ **'@' Model Integration**: Harness the collective intelligence of multiple models in a single chat by seamlessly switching to any acessible local or external model during conversations by using the `@` command to specify the model by name. + +- πŸ”„ **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). + +- βš™οΈ **Fine-Tuned Control with Advanced Parameters**: Gain a deeper level of control by adjusting parameters such as temperature, context length, and seed, and define your system prompts to tailor the conversation to your specific preferences and needs. + +- ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences. + - πŸ“œ **Prompt Preset Support**: Instantly access preset prompts using the `/` command in the chat input. Load predefined conversation starters effortlessly and expedite your interactions. Effortlessly import prompts through [Open WebUI Community](https://openwebui.com/) integration. - πŸ‘πŸ‘Ž **RLHF Annotation**: Empower your messages by rating them with thumbs up and thumbs down, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (RLHF). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. From 02c382342e96d7b6ed4c8bbd76bbfbdfb473ceb0 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 00:55:00 +0000 Subject: [PATCH 22/41] Update features.md adjustments --- features.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/features.md b/features.md index e662685..c7ca623 100644 --- a/features.md +++ b/features.md @@ -52,30 +52,26 @@ title: "⭐ Features" - βœ’οΈπŸ”’ **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction. +- ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences. +
πŸ’¬ Conversations -- πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. In its alpha phase, occasional issues may arise as we actively refine and enhance this feature to ensure optimal performance and reliability. - -- πŸ‘₯ **'@' Model Integration**: Harness the collective intelligence of multiple models in a single chat by seamlessly switching to any acessible local or external model during conversations by using the `@` command to specify the model by name. +- πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. - πŸ”„ **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). +- βš™οΈ **Many Models Conversations**: Effortlessly engage with various models simultaneously, harnessing their unique strengths for optimal responses. Enhance your experience by leveraging a diverse set of models in parallel. + - βš™οΈ **Fine-Tuned Control with Advanced Parameters**: Gain a deeper level of control by adjusting parameters such as temperature, context length, and seed, and define your system prompts to tailor the conversation to your specific preferences and needs. -- ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences. - -- πŸ“œ **Prompt Preset Support**: Instantly access preset prompts using the `/` command in the chat input. Load predefined conversation starters effortlessly and expedite your interactions. Effortlessly import prompts through [Open WebUI Community](https://openwebui.com/) integration. - -- πŸ‘πŸ‘Ž **RLHF Annotation**: Empower your messages by rating them with thumbs up and thumbs down, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (RLHF). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. - - 🏷️ **Conversation Tagging**: Effortlessly categorize and locate specific chats for quick reference and streamlined data collection. -- ⬆️ **GGUF File Model Creation**: Effortlessly create Ollama models by uploading GGUF files directly from the Web UI. Streamlined process with options to upload from your machine or download GGUF files from Hugging Face. +- πŸ“œ **Prompt Preset Support**: Instantly access preset prompts using the `/` command in the chat input. Load predefined conversation starters effortlessly and expedite your interactions. Effortlessly import prompts through [Open WebUI Community](https://openwebui.com/) integration. -- βš™οΈ **Many Models Conversations**: Effortlessly engage with various models simultaneously, harnessing their unique strengths for optimal responses. Enhance your experience by leveraging a diverse set of models in parallel. +- ⬆️ **GGUF File Model Creation**: Effortlessly create Ollama models by uploading GGUF files directly from the Web UI. Streamlined process with options to upload from your machine or download GGUF files from Hugging Face. - 🧠 **Experimental Memory Feature**: Manually input personal information you want LLMs to remember via Settings > Personalization > Memory. @@ -99,6 +95,8 @@ title: "⭐ Features" - πŸ—¨οΈ **Local Chat Sharing**: Generate and share chat links seamlessly between users, enhancing collaboration and communication. +- πŸ‘πŸ‘Ž **RLHF Annotation**: Empower your messages by rating them with thumbs up and thumbs down, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (RLHF). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. +
@@ -119,6 +117,8 @@ title: "⭐ Features" - πŸ—£οΈ **Voice Input Support**: Engage with your model through voice interactions; enjoy the convenience of talking to your model directly. Additionally, explore the option for sending voice input automatically after 3 seconds of silence for a streamlined experience. +- πŸ‘₯ **'@' Model Integration**: Harness the collective intelligence of multiple models in a single chat by seamlessly switching to any acessible local or external model during conversations by using the `@` command to specify the model by name. + - πŸ”Š **Configurable Text-to-Speech Endpoint**: Customize your Text-to-Speech experience with configurable OpenAI endpoints.
From 4eb389554191de69a2189e1666e33e2cc164fe62 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 01:00:48 +0000 Subject: [PATCH 23/41] Update features.md fix --- features.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/features.md b/features.md index c7ca623..0d6f9ac 100644 --- a/features.md +++ b/features.md @@ -38,20 +38,14 @@ title: "⭐ Features" - πŸ–₯️ **Intuitive Interface**: Our chat interface takes inspiration from ChatGPT user interface, ensuring a user-friendly experience. -- πŸ“± **Responsive Design**: Enjoy a seamless experience across Desktop PC, Laptop, and Mobile devices. - - ⚑ **Swift Responsiveness**: Enjoy reliably fast and responsive performance. -- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience. - - πŸ“¦ **Pip Install Method (Soon/WIP)**: Install Open WebUI using pip, simplifying the installation process and making it even easier for newcomers to get started. - 🌈 **Theme Customization**: Choose from a variety of solid, yet sleek themes to personalize your Open WebUI experience. Choose between either Light, Dark, or OLED Dark mode; or simply let your device choose for you! - πŸ’» **Code Syntax Highlighting**: Enjoy enhanced code readability with our syntax highlighting feature. -- βœ’οΈπŸ”’ **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction. - - ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences.
@@ -162,8 +156,6 @@ title: "⭐ Features" - πŸ“§ **Trusted Email Authentication**: Authenticate using a trusted email header, adding an extra layer of security and authentication to protect your Web UI. -- πŸ” **Role-Based Access Control (RBAC)**: Ensure secure access with restricted permissions; only authorized individuals can access your Ollama, and exclusive model creation/pulling rights are reserved for administrators. - - πŸ”’ **Backend Reverse Proxy Support**: Bolster security through direct communication between Open WebUI backend and Ollama. This key feature eliminates the need to expose Ollama over LAN. Requests made to the '/ollama/api' route from the Web UI are seamlessly redirected to Ollama from the backend, enhancing overall system security. - πŸ”“ **Optional Authentication**: Enjoy the flexibility to disable authentication by setting WEBUI_AUTH to False, ideal for fresh installations without existing users. From 89e53a3ee194cf246f9bfb3dbc329bb7c1c3504d Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 02:37:54 +0000 Subject: [PATCH 24/41] Update features.md Fixes --- features.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/features.md b/features.md index 0d6f9ac..ffd601d 100644 --- a/features.md +++ b/features.md @@ -16,13 +16,13 @@ title: "⭐ Features" - 🧩 **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. -- πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. +- πŸ“š **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 Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by the URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions. +- 🌐 **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. - 🎨 **Image Generation Integration**: Seamlessly incorporate image generation capabilities using options such as AUTOMATIC1111 API or ComfyUI (local), and OpenAI's DALL-E (external), enriching your chat experience with dynamic visual content. -- πŸ€– **Multiple Model Support**: Seamlessly switch between different chat models for diverse interactions. +- βš™οΈ **Many Models Conversations**: Effortlessly engage with various models simultaneously, harnessing their unique strengths for optimal responses. Enhance your experience by leveraging a diverse set of models in parallel. - πŸ” **Role-Based Access Control (RBAC)**: Ensure secure access with restricted permissions; only authorized individuals can access your Ollama, and exclusive model creation/pulling rights are reserved for administrators. @@ -53,11 +53,11 @@ title: "⭐ Features"
πŸ’¬ Conversations -- πŸ“š **Local RAG Integration**: Dive into the future of chat interactions with the 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 `#` command in the prompt. +- πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. - πŸ”„ **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). -- βš™οΈ **Many Models Conversations**: Effortlessly engage with various models simultaneously, harnessing their unique strengths for optimal responses. Enhance your experience by leveraging a diverse set of models in parallel. +- πŸ€– **Multiple Model Support**: Seamlessly switch between different chat models for diverse interactions. - βš™οΈ **Fine-Tuned Control with Advanced Parameters**: Gain a deeper level of control by adjusting parameters such as temperature, context length, and seed, and define your system prompts to tailor the conversation to your specific preferences and needs. From e99a810792ade6be75eb916d0c2396924781fc5d Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 04:48:51 +0000 Subject: [PATCH 25/41] Update features.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - πŸ” **Model Selector**: Easily find and select custom models with search filter and detailed model information. --- features.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features.md b/features.md index ffd601d..c2121ba 100644 --- a/features.md +++ b/features.md @@ -78,6 +78,8 @@ title: "⭐ Features"
πŸ’» Model Management +- πŸ” **Model Selector**: Easily find and select custom models with search filter and detailed model information. + - πŸ“₯πŸ—‘οΈ **Download/Delete Models**: Easily download or delete models directly from Open WebUI. - πŸ”„ **Update All Ollama Models**: Easily update locally installed models all at once with a convenient button, streamlining model management. From a1dc2d49df37571cd5e67d751db86a4a26a4dfd3 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 05:13:27 +0000 Subject: [PATCH 26/41] Update features.md Weew --- features.md | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/features.md b/features.md index c2121ba..f0c00cf 100644 --- a/features.md +++ b/features.md @@ -6,7 +6,7 @@ title: "⭐ Features" ## Key Features of Open WebUI ⭐ -- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience. +- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both ':ollama' and ':cuda' tagged images. - 🀝 **Ollama/OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the Ollama API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. @@ -40,19 +40,27 @@ title: "⭐ Features" - ⚑ **Swift Responsiveness**: Enjoy reliably fast and responsive performance. +- 🎨 **Splash Screen**: A simple loading splash screen for a smoother user experience. + - πŸ“¦ **Pip Install Method (Soon/WIP)**: Install Open WebUI using pip, simplifying the installation process and making it even easier for newcomers to get started. -- 🌈 **Theme Customization**: Choose from a variety of solid, yet sleek themes to personalize your Open WebUI experience. Choose between either Light, Dark, or OLED Dark mode; or simply let your device choose for you! +- 🌈 **Theme Customization**: Choose from a variety of solid, yet sleek themes to personalize your Open WebUI experience. Choose between either Light, Dark, or OLED Dark mode; or simply let your system choose for you! - πŸ’» **Code Syntax Highlighting**: Enjoy enhanced code readability with our syntax highlighting feature. - ↕️ **Bi-Directional Chat Support**: Easily switch between left-to-right and right-to-left chat directions to accommodate various language preferences. +- πŸ“± **Mobile Accessibility**: Seamlessly open and close the sidebar on mobile devices with intuitive swipe gestures. + +- πŸ’Ύ **Persistent Settings**: Enjoy the convenience of saved settings, stored in a config.json file for easy access and reuse. +
πŸ’¬ Conversations +- πŸ“‚ **Unified Workspace**: Access all your model files, documents, prompts, and playground in one convenient location, streamlining your workflow. + - πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. - πŸ”„ **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). @@ -71,7 +79,9 @@ title: "⭐ Features" - πŸ“œ **Citations in RAG Feature**: Easily track the context fed to the LLM with added citations in the RAG feature. -- πŸ“Ή **Youtube RAG Pipeline**: Dedicated RAG pipeline for Youtube videos, enabling interaction with video transcriptions directly. +- 🌟 **Enhanced RAG Pipeline**: With hybrid searching via 'BM25', reranking powered by 'CrossEncoder', and configurable relevance score thresholds. + +- πŸ“Ή **Youtube RAG Pipeline**: Dedicated RAG pipeline for YouTube videos, enabling interaction with video transcriptions directly.
@@ -82,6 +92,8 @@ title: "⭐ Features" - πŸ“₯πŸ—‘οΈ **Download/Delete Models**: Easily download or delete models directly from Open WebUI. +- πŸ”„ **Seamless Integration**: Copy `ollama run {model:tag}` directly from a model's page on [Ollama library](https://ollama.com/library/) to easily select and pull models. + - πŸ”„ **Update All Ollama Models**: Easily update locally installed models all at once with a convenient button, streamlining model management.
@@ -102,10 +114,12 @@ title: "⭐ Features" - πŸ“œ **Chat History**: Effortlessly access and manage your conversation history. -- πŸ“¬ **Archive Chats**: Effortlessly store away completed conversations with LLMs for future reference, maintaining a tidy and clutter-free chat interface while allowing for easy retrieval and reference. +- πŸ“¬ **Archive Chats**: Effortlessly store away completed conversations with LLMs for future reference or interaction, maintaining a tidy and clutter-free chat interface while allowing for easy retrieval. - πŸ“€πŸ“₯ **Import/Export Chat History**: Seamlessly move your chat data in and out of the platform. +- πŸ“„ **Chat Download as PDF**: Easily download chats in PDF format. +
@@ -137,6 +151,10 @@ title: "⭐ Features" - πŸŒπŸ”— **External Ollama Server Connectivity**: Seamlessly link to an external Ollama server hosted on a different address by configuring the environment variable. +- πŸ›’οΈ **External Database Support**: Seamlessly connect to custom SQLite or Postgres databases using the 'DATABASE_URL' environment variable. + +- 🌐 **Remote ChromaDB Support**: Expand your database capabilities with the ability to connect to remote ChromaDB servers. + - πŸ”€ **Multiple Ollama Instance Load Balancing**: Effortlessly distribute chat requests across multiple Ollama instances for enhanced performance and reliability.
@@ -148,7 +166,7 @@ title: "⭐ Features" - πŸ›‘οΈ **Granular User Permissions**: Restrict user actions and access with customizable role-based permissions, ensuring that only authorized individuals can perform specific tasks. -- πŸ‘₯ **Multi-User Management**: Seamlessly manage multiple users through our intuitive admin panel, streamlining user administration and simplifying user lifecycle management. +- πŸ‘₯ **Multi-User Management**: Seamlessly manage multiple users through our intuitive admin panel with pagination, streamlining user administration and simplifying user lifecycle management. - πŸ”§ **Admin Panel**: Streamlined user management with options to add users directly or in bulk via CSV import, making user onboarding and management efficient. From cb6fa76897d731995aed45cce6bd03af3a9e1592 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 05:16:11 +0000 Subject: [PATCH 27/41] Update features.md fix --- features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features.md b/features.md index f0c00cf..e497f9a 100644 --- a/features.md +++ b/features.md @@ -118,7 +118,7 @@ title: "⭐ Features" - πŸ“€πŸ“₯ **Import/Export Chat History**: Seamlessly move your chat data in and out of the platform. -- πŸ“„ **Chat Download as PDF**: Easily download chats in PDF format. +- πŸ“„ **Chat Download as PDF/TXT**: Easily download chats in .PDF or .txt format. From 34741d7845ee9cdd10ba28c9efa65727395c2221 Mon Sep 17 00:00:00 2001 From: DevTechBytes Date: Mon, 27 May 2024 01:23:20 -0500 Subject: [PATCH 28/41] updated youtube url to use https://www.youtube-nocookie.com --- docs/tutorial-deployment/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial-deployment/index.md b/docs/tutorial-deployment/index.md index 32851f2..b9984fa 100644 --- a/docs/tutorial-deployment/index.md +++ b/docs/tutorial-deployment/index.md @@ -12,7 +12,7 @@ title: "☁️ Deployment" πŸ‘‹ Calling all youtubers! Want to showcase Open WebUI's features in a video? We'll feature it at the top of our guide section! ::: - + From d8180dc66cfcb27840561377a86b6abdb396f98e Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Mon, 27 May 2024 23:09:24 +0000 Subject: [PATCH 29/41] Update features.md fix --- features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features.md b/features.md index e497f9a..fe9d6b7 100644 --- a/features.md +++ b/features.md @@ -8,7 +8,7 @@ title: "⭐ Features" - πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both ':ollama' and ':cuda' tagged images. -- 🀝 **Ollama/OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the Ollama API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. +- 🀝 **OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the OpenAI API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. - πŸ“± **Responsive Design**: Enjoy a seamless experience across Desktop PC, Laptop, and Mobile devices. From ae4327182a147ca6ec1e557b9e234db4d34a5d51 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Mon, 27 May 2024 17:15:32 -0700 Subject: [PATCH 30/41] fix --- features.md => docs/features.md | 3 +-- docs/getting-started/index.md | 2 +- docs/tutorial/_category_.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) rename features.md => docs/features.md (99%) diff --git a/features.md b/docs/features.md similarity index 99% rename from features.md rename to docs/features.md index fe9d6b7..2368607 100644 --- a/features.md +++ b/docs/features.md @@ -1,11 +1,10 @@ --- -sidebar_position: 200 +sidebar_position: 3 title: "⭐ Features" --- ## Key Features of Open WebUI ⭐ - - πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both ':ollama' and ':cuda' tagged images. - 🀝 **OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the OpenAI API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 87ad256..4598558 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -1,5 +1,5 @@ --- -sidebar_position: 300 +sidebar_position: 2 title: "πŸš€ Getting Started" --- diff --git a/docs/tutorial/_category_.json b/docs/tutorial/_category_.json index 00ffbc6..26cdaea 100644 --- a/docs/tutorial/_category_.json +++ b/docs/tutorial/_category_.json @@ -1,6 +1,6 @@ { "label": "πŸ“ Tutorial", - "position": 3, + "position": 300, "link": { "type": "generated-index" } From 5928be2f321ced92ac317027f31d439ff9ada0d8 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Mon, 27 May 2024 17:19:18 -0700 Subject: [PATCH 31/41] feat: deprecation warnings --- docs/tutorial/langfuse.md | 4 ++++ docs/tutorial/litellm.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/tutorial/langfuse.md b/docs/tutorial/langfuse.md index fb0fe9c..abfde1c 100644 --- a/docs/tutorial/langfuse.md +++ b/docs/tutorial/langfuse.md @@ -3,6 +3,10 @@ sidebar_position: 6 title: "Monitoring with Langfuse" --- +:::warning +Bundled LiteLLM support has been deprecated from 0.2.0 +::: + # Monitoring with Langfuse Integrating [Langfuse](https://cloud.langfuse.com) with LiteLLM allows for detailed observation and recording of API calls. diff --git a/docs/tutorial/litellm.md b/docs/tutorial/litellm.md index d535688..9d11561 100644 --- a/docs/tutorial/litellm.md +++ b/docs/tutorial/litellm.md @@ -3,6 +3,10 @@ sidebar_position: 4 title: "LiteLLM Configuration" --- +:::warning +Bundled LiteLLM support has been deprecated from 0.2.0 +::: + # LiteLLM Configuration [LiteLLM](https://litellm.vercel.app/docs/proxy/configs#quick-start) supports a variety of APIs, both OpenAI-compatible and others. To integrate a new API model, follow these instructions: From 73a28d55639093897475f786808bd39d0997163b Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 28 May 2024 00:55:00 +0000 Subject: [PATCH 32/41] Update features.md Fixes before overhaul of features page --- docs/features.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/features.md b/docs/features.md index 2368607..2ddbab0 100644 --- a/docs/features.md +++ b/docs/features.md @@ -5,12 +5,14 @@ title: "⭐ Features" ## Key Features of Open WebUI ⭐ -- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both ':ollama' and ':cuda' tagged images. +- πŸš€ **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both `:ollama` and `:cuda` tagged images. - 🀝 **OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the OpenAI API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. - πŸ“± **Responsive Design**: Enjoy a seamless experience across Desktop PC, Laptop, and Mobile devices. +- πŸ“± **Progressive Web App (PWA) for Mobile**: Enjoy a native app-like experience on your mobile device with our PWA, providing offline access on localhost and a seamless user interface. + - βœ’οΈπŸ”’ **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction. - 🧩 **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. @@ -78,7 +80,7 @@ title: "⭐ Features" - πŸ“œ **Citations in RAG Feature**: Easily track the context fed to the LLM with added citations in the RAG feature. -- 🌟 **Enhanced RAG Pipeline**: With hybrid searching via 'BM25', reranking powered by 'CrossEncoder', and configurable relevance score thresholds. +- 🌟 **Enhanced RAG Pipeline**: With hybrid searching via `BM25`, reranking powered by `CrossEncoder`, and configurable relevance score thresholds. - πŸ“Ή **Youtube RAG Pipeline**: Dedicated RAG pipeline for YouTube videos, enabling interaction with video transcriptions directly. @@ -135,7 +137,7 @@ title: "⭐ Features"
🐍 Code Execution -- 🐍 **Python Code Execution**: Execute Python code locally in the browser with libraries like 'requests', 'beautifulsoup4', 'numpy', 'pandas', 'seaborn', 'matplotlib', 'scikit-learn', 'scipy', 'regex'. +- 🐍 **Python Code Execution**: Execute Python code locally in the browser via Pyodide with libraries like `requests`, `beautifulsoup4`, `numpy`, `pandas`, `seaborn`, `matplotlib`, `scikit-learn`, `scipy`, & `regex`. - πŸš€ **Flexible, UI-Agnostic OpenAI-Compatible Pipelines (WIP)**: Seamlessly integrate and customize pipelines for efficient data processing and model training, ensuring ultimate flexibility and scalability. @@ -150,7 +152,7 @@ title: "⭐ Features" - πŸŒπŸ”— **External Ollama Server Connectivity**: Seamlessly link to an external Ollama server hosted on a different address by configuring the environment variable. -- πŸ›’οΈ **External Database Support**: Seamlessly connect to custom SQLite or Postgres databases using the 'DATABASE_URL' environment variable. +- πŸ›’οΈ **External Database Support**: Seamlessly connect to custom SQLite or Postgres databases using the `DATABASE_URL` environment variable. - 🌐 **Remote ChromaDB Support**: Expand your database capabilities with the ability to connect to remote ChromaDB servers. @@ -175,7 +177,7 @@ title: "⭐ Features" - πŸ“§ **Trusted Email Authentication**: Authenticate using a trusted email header, adding an extra layer of security and authentication to protect your Web UI. -- πŸ”’ **Backend Reverse Proxy Support**: Bolster security through direct communication between Open WebUI backend and Ollama. This key feature eliminates the need to expose Ollama over LAN. Requests made to the '/ollama/api' route from the Web UI are seamlessly redirected to Ollama from the backend, enhancing overall system security. +- πŸ”’ **Backend Reverse Proxy Support**: Bolster security through direct communication between Open WebUI backend and Ollama. This key feature eliminates the need to expose Ollama over LAN. Requests made to the `/ollama/api` route from the Web UI are seamlessly redirected to Ollama from the backend, enhancing overall system security. - πŸ”“ **Optional Authentication**: Enjoy the flexibility to disable authentication by setting WEBUI_AUTH to False, ideal for fresh installations without existing users. From ff5376bfdb212489ab1f9f671e4d3e1dad3a6dd5 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 28 May 2024 01:08:49 +0000 Subject: [PATCH 33/41] Update features.md Overhaul --- docs/features.md | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/docs/features.md b/docs/features.md index 2ddbab0..173b29f 100644 --- a/docs/features.md +++ b/docs/features.md @@ -31,11 +31,11 @@ title: "⭐ Features" - 🌟 **Continuous Updates**: We are committed to improving Open WebUI with regular updates, fixes, and new features. -
- And many more remarkable features including... ⚑️ +## And many more remarkable features including... ⚑️ +### 🌈 User Experience
- 🌈 User Experience + - πŸ–₯️ **Intuitive Interface**: Our chat interface takes inspiration from ChatGPT user interface, ensuring a user-friendly experience. @@ -57,8 +57,9 @@ title: "⭐ Features"
+### πŸ’¬ Conversations
- πŸ’¬ Conversations + - πŸ“‚ **Unified Workspace**: Access all your model files, documents, prompts, and playground in one convenient location, streamlining your workflow. @@ -86,8 +87,9 @@ title: "⭐ Features"
+### πŸ’» Model Management
- πŸ’» Model Management + - πŸ” **Model Selector**: Easily find and select custom models with search filter and detailed model information. @@ -99,8 +101,9 @@ title: "⭐ Features"
+### πŸ‘₯ Collaboration
- πŸ‘₯ Collaboration + - πŸ—¨οΈ **Local Chat Sharing**: Generate and share chat links seamlessly between users, enhancing collaboration and communication. @@ -108,8 +111,9 @@ title: "⭐ Features"
+### πŸ“š History and Archive
- πŸ“š History and Archive + - πŸ”„ **Regeneration History Access**: Easily revisit and explore your entire regeneration history. @@ -123,8 +127,9 @@ title: "⭐ Features"
+### πŸŽ™οΈ Accessibility
- πŸŽ™οΈ Accessibility + - πŸ—£οΈ **Voice Input Support**: Engage with your model through voice interactions; enjoy the convenience of talking to your model directly. Additionally, explore the option for sending voice input automatically after 3 seconds of silence for a streamlined experience. @@ -134,8 +139,9 @@ title: "⭐ Features"
+### 🐍 Code Execution
- 🐍 Code Execution + - 🐍 **Python Code Execution**: Execute Python code locally in the browser via Pyodide with libraries like `requests`, `beautifulsoup4`, `numpy`, `pandas`, `seaborn`, `matplotlib`, `scikit-learn`, `scipy`, & `regex`. @@ -143,8 +149,9 @@ title: "⭐ Features"
+### πŸ”“ Integration and Security
- πŸ”“ Integration and Security + - ✨ **Multiple OpenAI-Compatible API Support**: Seamlessly integrate and customize various OpenAI-compatible APIs, enhancing the versatility of your chat interactions. @@ -160,8 +167,9 @@ title: "⭐ Features"
+### πŸ‘‘ Administration
- πŸ‘‘ Administration + - πŸ‘‘ **Super Admin Assignment**: Automatically assign the first signup as a super admin as an unchangeable role that cannot be modified by other admins. @@ -182,5 +190,3 @@ title: "⭐ Features" - πŸ”“ **Optional Authentication**: Enjoy the flexibility to disable authentication by setting WEBUI_AUTH to False, ideal for fresh installations without existing users.
- -
From a3a959ed932e29492c265e428d3c9895b024f620 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 28 May 2024 05:41:55 +0000 Subject: [PATCH 34/41] Update features.md Revert dropdowns, kept categorization --- docs/features.md | 42 ++++++++++++------------------------------ 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/docs/features.md b/docs/features.md index 173b29f..875dc4c 100644 --- a/docs/features.md +++ b/docs/features.md @@ -33,9 +33,9 @@ title: "⭐ Features" ## And many more remarkable features including... ⚑️ -### 🌈 User Experience -
- +--- + +### πŸ–₯️ User Experience - πŸ–₯️ **Intuitive Interface**: Our chat interface takes inspiration from ChatGPT user interface, ensuring a user-friendly experience. @@ -55,11 +55,9 @@ title: "⭐ Features" - πŸ’Ύ **Persistent Settings**: Enjoy the convenience of saved settings, stored in a config.json file for easy access and reuse. -
+--- ### πŸ’¬ Conversations -
- - πŸ“‚ **Unified Workspace**: Access all your model files, documents, prompts, and playground in one convenient location, streamlining your workflow. @@ -85,11 +83,9 @@ title: "⭐ Features" - πŸ“Ή **Youtube RAG Pipeline**: Dedicated RAG pipeline for YouTube videos, enabling interaction with video transcriptions directly. -
+--- ### πŸ’» Model Management -
- - πŸ” **Model Selector**: Easily find and select custom models with search filter and detailed model information. @@ -99,21 +95,17 @@ title: "⭐ Features" - πŸ”„ **Update All Ollama Models**: Easily update locally installed models all at once with a convenient button, streamlining model management. -
+--- ### πŸ‘₯ Collaboration -
- - πŸ—¨οΈ **Local Chat Sharing**: Generate and share chat links seamlessly between users, enhancing collaboration and communication. - πŸ‘πŸ‘Ž **RLHF Annotation**: Empower your messages by rating them with thumbs up and thumbs down, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (RLHF). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. -
+--- ### πŸ“š History and Archive -
- - πŸ”„ **Regeneration History Access**: Easily revisit and explore your entire regeneration history. @@ -125,11 +117,9 @@ title: "⭐ Features" - πŸ“„ **Chat Download as PDF/TXT**: Easily download chats in .PDF or .txt format. -
+--- ### πŸŽ™οΈ Accessibility -
- - πŸ—£οΈ **Voice Input Support**: Engage with your model through voice interactions; enjoy the convenience of talking to your model directly. Additionally, explore the option for sending voice input automatically after 3 seconds of silence for a streamlined experience. @@ -137,21 +127,17 @@ title: "⭐ Features" - πŸ”Š **Configurable Text-to-Speech Endpoint**: Customize your Text-to-Speech experience with configurable OpenAI endpoints. -
+--- ### 🐍 Code Execution -
- - 🐍 **Python Code Execution**: Execute Python code locally in the browser via Pyodide with libraries like `requests`, `beautifulsoup4`, `numpy`, `pandas`, `seaborn`, `matplotlib`, `scikit-learn`, `scipy`, & `regex`. - πŸš€ **Flexible, UI-Agnostic OpenAI-Compatible Pipelines (WIP)**: Seamlessly integrate and customize pipelines for efficient data processing and model training, ensuring ultimate flexibility and scalability. -
+--- -### πŸ”“ Integration and Security -
- +### πŸ”’ Integration and Security - ✨ **Multiple OpenAI-Compatible API Support**: Seamlessly integrate and customize various OpenAI-compatible APIs, enhancing the versatility of your chat interactions. @@ -165,11 +151,9 @@ title: "⭐ Features" - πŸ”€ **Multiple Ollama Instance Load Balancing**: Effortlessly distribute chat requests across multiple Ollama instances for enhanced performance and reliability. -
+--- ### πŸ‘‘ Administration -
- - πŸ‘‘ **Super Admin Assignment**: Automatically assign the first signup as a super admin as an unchangeable role that cannot be modified by other admins. @@ -188,5 +172,3 @@ title: "⭐ Features" - πŸ”’ **Backend Reverse Proxy Support**: Bolster security through direct communication between Open WebUI backend and Ollama. This key feature eliminates the need to expose Ollama over LAN. Requests made to the `/ollama/api` route from the Web UI are seamlessly redirected to Ollama from the backend, enhancing overall system security. - πŸ”“ **Optional Authentication**: Enjoy the flexibility to disable authentication by setting WEBUI_AUTH to False, ideal for fresh installations without existing users. - -
From 85f3ef16ba234e4e530777f650b61d1fb28f181e Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 28 May 2024 05:53:34 +0000 Subject: [PATCH 35/41] Update features.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - πŸ” **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. --- docs/features.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/features.md b/docs/features.md index 875dc4c..76c77b2 100644 --- a/docs/features.md +++ b/docs/features.md @@ -19,6 +19,8 @@ title: "⭐ Features" - πŸ“š **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 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. - 🎨 **Image Generation Integration**: Seamlessly incorporate image generation capabilities using options such as AUTOMATIC1111 API or ComfyUI (local), and OpenAI's DALL-E (external), enriching your chat experience with dynamic visual content. From 569056ac85fe4c81bbc7c637b793dc8747c197ca Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 28 May 2024 06:06:01 +0000 Subject: [PATCH 36/41] Update features.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - πŸ’‘ **LLM Response Insights**: View generation details for every response, including external model API insights and comprehensive local model info. --- docs/features.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/features.md b/docs/features.md index 76c77b2..eae220c 100644 --- a/docs/features.md +++ b/docs/features.md @@ -61,7 +61,7 @@ title: "⭐ Features" ### πŸ’¬ Conversations -- πŸ“‚ **Unified Workspace**: Access all your model files, documents, prompts, and playground in one convenient location, streamlining your workflow. +- πŸ“‚ **Unified Workspace**: Access all your model files, prompts, documents, and a playground in one convenient location, streamlining your workflow. - πŸ” **RAG Embedding Support**: Change the RAG embedding model directly in document settings, enhancing document processing. This feature supports Ollama and OpenAI models. @@ -97,6 +97,8 @@ title: "⭐ Features" - πŸ”„ **Update All Ollama Models**: Easily update locally installed models all at once with a convenient button, streamlining model management. +- πŸ’‘ **LLM Response Insights**: View generation details for every response, including external model API insights and comprehensive local model info. + --- ### πŸ‘₯ Collaboration From 5115dfad855acb5ae14f183a56fbeee0bc1a1d56 Mon Sep 17 00:00:00 2001 From: silentoplayz <50341825+silentoplayz@users.noreply.github.com> Date: Tue, 28 May 2024 06:09:23 +0000 Subject: [PATCH 37/41] Update features.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - πŸ“£ **Configurable Notification Banners**: Admins can create customizable banners with persistence in config.json, featuring options for content, background color (info, warning, error, or success), and dismissibility. These banners are only accessible to logged-in users, ensuring sensitive information remains private. --- docs/features.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/features.md b/docs/features.md index eae220c..c191af6 100644 --- a/docs/features.md +++ b/docs/features.md @@ -169,6 +169,8 @@ title: "⭐ Features" - πŸ”— **Webhook Integration**: Subscribe to new user sign-up events via webhook (compatible with Discord, Google Chat and Microsoft Teams), providing real-time notifications and automation capabilities. +- πŸ“£ **Configurable Notification Banners**: Admins can create customizable banners with persistence in config.json, featuring options for content, background color (info, warning, error, or success), and dismissibility. These banners are only accessible to logged-in users, ensuring sensitive information remains private. + - πŸ›‘οΈ **Model Whitelisting**: Enhance security and access control by allowing admins to whitelist models for users with the `user` role, ensuring that only authorized models can be accessed. - πŸ“§ **Trusted Email Authentication**: Authenticate using a trusted email header, adding an extra layer of security and authentication to protect your Web UI. From e54d69e6b3d71e6ac006178d6dc0130828e9de13 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Tue, 28 May 2024 00:38:58 -0700 Subject: [PATCH 38/41] feat: sponsors --- docs/{intro.md => intro.mdx} | 21 + package-lock.json | 564 ++++++++++++++++++++++++++- package.json | 5 +- postcss.config.js | 6 + src/components/Sponsors/TopBanner.js | 28 ++ src/css/custom.css | 3 + static/ads/pipelines-banner.png | Bin 0 -> 18244 bytes static/ads/placeholder.png | Bin 0 -> 27875 bytes tailwind.config.js | 22 ++ 9 files changed, 647 insertions(+), 2 deletions(-) rename docs/{intro.md => intro.mdx} (91%) create mode 100644 postcss.config.js create mode 100644 src/components/Sponsors/TopBanner.js create mode 100644 static/ads/pipelines-banner.png create mode 100644 static/ads/placeholder.png create mode 100644 tailwind.config.js diff --git a/docs/intro.md b/docs/intro.mdx similarity index 91% rename from docs/intro.md rename to docs/intro.mdx index 0f94758..e22285f 100644 --- a/docs/intro.md +++ b/docs/intro.mdx @@ -5,6 +5,27 @@ title: 🏑 Home hide_title: true --- +import { TopBanner } from "@site/src/components/Sponsors/TopBanner"; + + + # Open WebUI **Open WebUI is an extensible, feature-rich, and user-friendly self-hosted WebUI designed to operate entirely offline.** It supports various LLM runners, including Ollama and OpenAI-compatible APIs. diff --git a/package-lock.json b/package-lock.json index b567a57..6d531fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,10 @@ }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.2.0", - "@docusaurus/types": "^3.2.0" + "@docusaurus/types": "^3.2.0", + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3" }, "engines": { "node": ">=18.0" @@ -204,6 +207,18 @@ "@algolia/requester-common": "4.23.2" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -2747,6 +2762,50 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2913,6 +2972,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -3991,6 +4060,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -4409,6 +4484,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -6024,6 +6108,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", @@ -6043,6 +6133,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -6849,6 +6945,34 @@ } } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -8308,6 +8432,24 @@ "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -11334,6 +11476,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -11367,6 +11518,17 @@ "multicast-dns": "cli.js" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -11500,6 +11662,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -11830,6 +12001,31 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -11872,6 +12068,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", @@ -12082,6 +12296,101 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-loader": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", @@ -12290,6 +12599,25 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, "node_modules/postcss-normalize-charset": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", @@ -13032,6 +13360,15 @@ "react": ">=15" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -14176,6 +14513,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -14238,6 +14596,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -14293,6 +14664,83 @@ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14411,6 +14859,55 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -14551,6 +15048,27 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -14627,6 +15145,12 @@ "node": ">=6.10" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -15610,6 +16134,44 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", diff --git a/package.json b/package.json index 027e893..a33e32c 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,10 @@ }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.2.0", - "@docusaurus/types": "^3.2.0" + "@docusaurus/types": "^3.2.0", + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3" }, "browserslist": { "production": [ diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/components/Sponsors/TopBanner.js b/src/components/Sponsors/TopBanner.js new file mode 100644 index 0000000..da19854 --- /dev/null +++ b/src/components/Sponsors/TopBanner.js @@ -0,0 +1,28 @@ +export const TopBanner = ({ items }) => { + return ( +
+ {items.map((item) => ( + <> +
+
+ Sponsored by {item.name} +
+ + + {item.name} + + +
+ {item.description} +
+
+ + ))} +
+ ); +}; diff --git a/src/css/custom.css b/src/css/custom.css index 4382d74..d27d2d5 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -3,6 +3,9 @@ * bundles Infima by default. Infima is a CSS framework designed to * work well for content-centric websites. */ +@tailwind base; +@tailwind components; +@tailwind utilities; @import url("https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&display=swap"); diff --git a/static/ads/pipelines-banner.png b/static/ads/pipelines-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..192029d0ca78e1db99d493aaab2626dca2bfaf34 GIT binary patch literal 18244 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 DfMR&p literal 0 HcmV?d00001 diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..dbb3611 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,22 @@ +const { fontFamily } = require("tailwindcss/defaultTheme"); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + corePlugins: { + preflight: false, + container: false, + }, + darkMode: ["class", '[data-theme="dark"]'], + content: ["./src/**/*.{js,jsx,tsx,html}", "./docs/**/*.{md,mdx}"], + theme: { + extend: { + fontFamily: { + sans: ['"Inter"', ...fontFamily.sans], + jakarta: ['"Plus Jakarta Sans"', ...fontFamily.sans], + mono: ['"Fira Code"', ...fontFamily.mono], + }, + colors: {}, + }, + }, + plugins: [], +}; From cc5d6bda466cf0097e630bd37383d5a9c387cda9 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Tue, 28 May 2024 00:49:15 -0700 Subject: [PATCH 39/41] feat: mobile banner --- docs/intro.mdx | 2 ++ src/components/Sponsors/TopBanner.js | 11 +++++++++-- static/ads/pipelines-banner-mobile.png | Bin 0 -> 14567 bytes static/ads/placeholder-mobile.png | Bin 0 -> 26697 bytes static/ads/placeholder.png | Bin 27875 -> 33345 bytes 5 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 static/ads/pipelines-banner-mobile.png create mode 100644 static/ads/placeholder-mobile.png diff --git a/docs/intro.mdx b/docs/intro.mdx index e22285f..94d02e2 100644 --- a/docs/intro.mdx +++ b/docs/intro.mdx @@ -11,6 +11,7 @@ import { TopBanner } from "@site/src/components/Sponsors/TopBanner"; items={[ { imgSrc: "/ads/pipelines-banner.png", + mobileImgSrc: "/ads/pipelines-banner-mobile.png", url: "https://github.com/open-webui/pipelines", name: "Open WebUI Pipelines", description: @@ -18,6 +19,7 @@ import { TopBanner } from "@site/src/components/Sponsors/TopBanner"; }, { imgSrc: "/ads/placeholder.png", + mobileImgSrc: "/ads/placeholder-mobile.png", url: "https://github.com/sponsors/tjbck", name: "Open WebUI", description: diff --git a/src/components/Sponsors/TopBanner.js b/src/components/Sponsors/TopBanner.js index da19854..f11d13d 100644 --- a/src/components/Sponsors/TopBanner.js +++ b/src/components/Sponsors/TopBanner.js @@ -10,14 +10,21 @@ export const TopBanner = ({ items }) => { {item.name} + + {item.name} -
+
{item.description}
diff --git a/static/ads/pipelines-banner-mobile.png b/static/ads/pipelines-banner-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..123cd8f9a60107ee0dbbe0086b6b06f22633f7a1 GIT binary patch literal 14567 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

1Vp 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 DfMR&p From 877a671d6ad0fc31b07356078833df4567d07ed3 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Tue, 28 May 2024 01:03:12 -0700 Subject: [PATCH 40/41] Create sponsorships.md --- docs/sponsorships.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 docs/sponsorships.md diff --git a/docs/sponsorships.md b/docs/sponsorships.md new file mode 100644 index 0000000..adf8bf2 --- /dev/null +++ b/docs/sponsorships.md @@ -0,0 +1,22 @@ +--- +sidebar_position: 1100 +title: "🌐 Sponsorships" +--- + +# 🀝 Sponsorships + +At Open WebUI, our community always comes first. Sponsors are welcome, but they must respect our community-first approach. This philosophy guides all our sponsorship policies. + +## Hard Rules + +These are the non-negotiable rules for sponsors: + +- Sponsors will always be clearly identified as sponsors. +- Aggressive sales tactics directed at our community members are strictly prohibited. +- We will never sell our user information to sponsors or any third parties. + +## Soft Rules + +Our community members should not be treated as sales leads. + +We expect sponsors to be exemplary community members. It’s acceptable to subtly promote job openings at your company and showcase your product, but hard selling is not allowed. Additionally, do not ask community members to join your mailing list. From 407fc2175cc1b56ff106a1ffeff88188db4a5d2a Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Tue, 28 May 2024 01:04:54 -0700 Subject: [PATCH 41/41] Update sponsorships.md --- docs/sponsorships.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sponsorships.md b/docs/sponsorships.md index adf8bf2..6d66e66 100644 --- a/docs/sponsorships.md +++ b/docs/sponsorships.md @@ -13,7 +13,7 @@ These are the non-negotiable rules for sponsors: - Sponsors will always be clearly identified as sponsors. - Aggressive sales tactics directed at our community members are strictly prohibited. -- We will never sell our user information to sponsors or any third parties. +- We don’t sell personal information about our community members to sponsors (e.g., to add to their mailing list). ## Soft Rules