diff --git a/README.md b/README.md index 6a41f802..5e26ae56 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Also check our sibling project, [OllamaHub](https://ollamahub.com/), where you c - 🤖 **Multiple Model Support**: Seamlessly switch between different chat models for diverse interactions. -- 🗃️ **Modelfile Builder**: Easily create Ollama modelfiles via the web UI. Create and add your own character to Ollama by customizing system prompts, conversation starters, and more. +- 🧩 **Modelfile Builder**: Easily create Ollama modelfiles via the web UI. Create and add characters/agents, customize chat elements, and import modelfiles effortlessly through [OllamaHub](https://ollamahub.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. @@ -59,7 +59,7 @@ Also check our sibling project, [OllamaHub](https://ollamahub.com/), where you c - 🌟 **Continuous Updates**: We are committed to improving Ollama Web UI with regular updates and new features. -## 🔗 Also Check Out OllamaHub! +## 🔗 Also Check Out OllamaHub! Don't forget to explore our sibling project, [OllamaHub](https://ollamahub.com/), where you can discover, download, and explore customized Modelfiles. OllamaHub offers a wide range of exciting possibilities for enhancing your chat interactions with Ollama! 🚀 @@ -121,6 +121,29 @@ docker run -d -p 3000:8080 -e OLLAMA_API_BASE_URL=https://example.com/api --name While we strongly recommend using our convenient Docker container installation for optimal support, we understand that some situations may require a non-Docker setup, especially for development purposes. Please note that non-Docker installations are not officially supported, and you might need to troubleshoot on your own. +### TL;DR 🚀 + +Run the following commands to install: + +```sh +git clone https://github.com/ollama-webui/ollama-webui.git +cd ollama-webui/ + +# Copying required .env file +cp -RPp example.env .env + +# Building Frontend +npm i +npm run build + +# Serving Frontend with the Backend +cd ./backend +pip install -r requirements.txt +sh start.sh +``` + +You should have the Ollama Web UI up and running at http://localhost:8080/. Enjoy! 😄 + ### Project Components The Ollama Web UI consists of two primary components: the frontend and the backend (which serves as a reverse proxy, handling static frontend files, and additional features). Both need to be running concurrently for the development environment using `npm run dev`. Alternatively, you can set the `PUBLIC_API_BASE_URL` during the build process to have the frontend connect directly to your Ollama instance or build the frontend as static files and serve them with the backend. @@ -211,7 +234,6 @@ See [TROUBLESHOOTING.md](/TROUBLESHOOTING.md) for information on how to troubles Here are some exciting tasks on our roadmap: - - 🔄 **Multi-Modal Support**: Seamlessly engage with models that support multimodal interactions, including images (e.g., LLava). - 📚 **RAG Integration**: Experience first-class retrieval augmented generation support, enabling chat with your documents. - 🔐 **Access Control**: Securely manage requests to Ollama by utilizing the backend as a reverse proxy gateway, ensuring only authenticated users can send specific requests. diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md index db9f1582..0b5536c5 100644 --- a/TROUBLESHOOTING.md +++ b/TROUBLESHOOTING.md @@ -25,3 +25,23 @@ Ensure that the Ollama URL is correctly formatted in the application settings. F It is crucial to include the `/api` at the end of the URL to ensure that the Ollama Web UI can communicate with the server. By following these troubleshooting steps, you should be able to identify and resolve connection issues with your Ollama server configuration. If you require further assistance or have additional questions, please don't hesitate to reach out or refer to our documentation for comprehensive guidance. + +## Running ollama-webui as a container on Apple Silicon Mac + +If you are running Docker on a M{1..3} based Mac and have taken the steps to run an x86 container, add "--platform linux/amd64" to the docker run command to prevent a warning. + +Example: + +```bash +docker run -d -p 3000:8080 -e OLLAMA_API_BASE_URL=http://example.com:11434/api --name ollama-webui --restart always ghcr.io/ollama-webui/ollama-webui:main +``` + +Becomes + +``` +docker run --platform linux/amd64 -d -p 3000:8080 -e OLLAMA_API_BASE_URL=http://example.com:11434/api --name ollama-webui --restart always ghcr.io/ollama-webui/ollama-webui:main +``` + +## References +[Change Docker Desktop Settings on Mac](https://docs.docker.com/desktop/settings/mac/) Search for "x86" in that page. +[Run x86 (Intel) and ARM based images on Apple Silicon (M1) Macs?](https://forums.docker.com/t/run-x86-intel-and-arm-based-images-on-apple-silicon-m1-macs/117123) diff --git a/backend/config.py b/backend/config.py index fa73a1f9..14ad30e4 100644 --- a/backend/config.py +++ b/backend/config.py @@ -6,8 +6,7 @@ from secrets import token_bytes from base64 import b64encode import os - -load_dotenv(find_dotenv()) +load_dotenv(find_dotenv("../.env")) #################################### # ENV (dev,test,prod) @@ -38,7 +37,7 @@ WEBUI_VERSION = os.environ.get("WEBUI_VERSION", "v1.0.0-alpha.21") #################################### -WEBUI_AUTH = True if os.environ.get("WEBUI_AUTH", "TRUE") == "TRUE" else False +WEBUI_AUTH = True if os.environ.get("WEBUI_AUTH", "FALSE") == "TRUE" else False #################################### diff --git a/example.env b/example.env index 09911a5c..9c628b42 100644 --- a/example.env +++ b/example.env @@ -1,8 +1,12 @@ -# must be defined, but defaults to 'http://{location.hostname}:11434/api' -# can also use path, such as '/api' -PUBLIC_API_BASE_URL='' +# If you're serving both the frontend and backend (Recommended) +# Set the public API base URL for seamless communication +PUBLIC_API_BASE_URL='/ollama/api' -OLLAMA_API_ID='my-api-token' -OLLAMA_API_TOKEN='xxxxxxxxxxxxxxxx' -# generated by passing the token to `caddy hash-password` -OLLAMA_API_TOKEN_DIGEST='$2a$14$iyyuawykR92xTHNR9lWzfu.uCct/9/xUPX3zBqLqrjAu0usNRPbyi' +# If you're serving only the frontend (Not recommended and not fully supported) +# Comment above and Uncomment below +# You can use the default value or specify a custom path, e.g., '/api' +# PUBLIC_API_BASE_URL='http://{location.hostname}:11434/api' + +# Ollama URL for the backend to connect +# The path '/ollama/api' will be redirected to the specified backend URL +OLLAMA_API_BASE_URL='http://localhost:11434/api' diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index f33f8c82..6a808918 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -317,7 +317,21 @@
{#if selectedModelfile} - {selectedModelfile.desc} + + {selectedModelfile.title} + +
+ {selectedModelfile.desc} +
+ {#if selectedModelfile.user} +
+ By {selectedModelfile.user.name + ? selectedModelfile.user.name + : `@${selectedModelfile.user.username}`} +
+ {/if} {:else} How can I help you today? {/if} diff --git a/src/routes/(app)/modelfiles/+page.svelte b/src/routes/(app)/modelfiles/+page.svelte index ca46f393..5887eabb 100644 --- a/src/routes/(app)/modelfiles/+page.svelte +++ b/src/routes/(app)/modelfiles/+page.svelte @@ -7,7 +7,7 @@ const deleteModelHandler = async (tagName) => { let success = null; - const res = await fetch(`${OLLAMA_API_BASE_URL}/delete`, { + const res = await fetch(`${$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL}/delete`, { method: 'DELETE', headers: { 'Content-Type': 'text/event-stream', diff --git a/src/routes/(app)/modelfiles/create/+page.svelte b/src/routes/(app)/modelfiles/create/+page.svelte index a49d0fd1..6e4e3f7d 100644 --- a/src/routes/(app)/modelfiles/create/+page.svelte +++ b/src/routes/(app)/modelfiles/create/+page.svelte @@ -52,6 +52,8 @@ num_ctx: '' }; + let modelfileCreator = null; + $: tagName = title !== '' ? `${title.replace(/\s+/g, '-').toLowerCase()}:latest` : ''; $: if (!raw) { @@ -202,7 +204,8 @@ SYSTEM """${system}"""`.replace(/^\s*\n/gm, ''); desc: desc, content: content, suggestionPrompts: suggestions.filter((prompt) => prompt.content !== ''), - categories: Object.keys(categories).filter((category) => categories[category]) + categories: Object.keys(categories).filter((category) => categories[category]), + user: modelfileCreator !== null ? modelfileCreator : undefined }); await goto('/modelfiles'); } @@ -237,6 +240,10 @@ SYSTEM """${system}"""`.replace(/^\s*\n/gm, ''); } ]; + modelfileCreator = { + username: modelfile.user.username, + name: modelfile.user.name + }; for (const category of modelfile.categories) { categories[category.toLowerCase()] = true; }