diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 86d27f4dc..da40f56ff 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -70,8 +70,10 @@ jobs: images: ${{ env.FULL_IMAGE_NAME }} tags: | type=ref,event=branch + ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} flavor: | prefix=cache-${{ matrix.platform }}- + latest=false - name: Build Docker image (latest) uses: docker/build-push-action@v5 @@ -158,8 +160,10 @@ jobs: images: ${{ env.FULL_IMAGE_NAME }} tags: | type=ref,event=branch + ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} flavor: | prefix=cache-cuda-${{ matrix.platform }}- + latest=false - name: Build Docker image (cuda) uses: docker/build-push-action@v5 @@ -247,8 +251,10 @@ jobs: images: ${{ env.FULL_IMAGE_NAME }} tags: | type=ref,event=branch + ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} flavor: | prefix=cache-ollama-${{ matrix.platform }}- + latest=false - name: Build Docker image (ollama) uses: docker/build-push-action@v5 diff --git a/CHANGELOG.md b/CHANGELOG.md index 35fd533e3..2f0575153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.1] - 2024-06-02 + +### Added + +- **🖱️ Single Model Export Button**: Easily export models with just one click using the new single model export button. +- **🖥️ Advanced Parameters Support**: Added support for 'num_thread', 'use_mmap', and 'use_mlock' parameters for Ollama. +- **🌐 Improved Vietnamese Translation**: Enhanced Vietnamese language support for a better user experience for our Vietnamese-speaking community. + +### Fixed + +- **🔧 OpenAI URL API Save Issue**: Corrected a problem preventing the saving of OpenAI URL API settings. +- **🚫 Display Issue with Disabled Ollama API**: Fixed the display bug causing models to appear in settings when the Ollama API was disabled. + +### Changed + +- **💡 Versioning Update**: As a reminder from our previous update, version 0.2.y will focus primarily on bug fixes, while major updates will be designated as 0.x from now on for better version tracking. + ## [0.2.0] - 2024-06-01 ### Added diff --git a/backend/apps/ollama/main.py b/backend/apps/ollama/main.py index 2c84f602e..9fa932fe2 100644 --- a/backend/apps/ollama/main.py +++ b/backend/apps/ollama/main.py @@ -734,44 +734,77 @@ async def generate_chat_completion( if model_info.params: payload["options"] = {} - payload["options"]["mirostat"] = model_info.params.get("mirostat", None) - payload["options"]["mirostat_eta"] = model_info.params.get( - "mirostat_eta", None - ) - payload["options"]["mirostat_tau"] = model_info.params.get( - "mirostat_tau", None - ) - payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None) + if model_info.params.get("mirostat", None): + payload["options"]["mirostat"] = model_info.params.get("mirostat", None) - payload["options"]["repeat_last_n"] = model_info.params.get( - "repeat_last_n", None - ) - payload["options"]["repeat_penalty"] = model_info.params.get( - "frequency_penalty", None - ) + if model_info.params.get("mirostat_eta", None): + payload["options"]["mirostat_eta"] = model_info.params.get( + "mirostat_eta", None + ) - payload["options"]["temperature"] = model_info.params.get( - "temperature", None - ) - payload["options"]["seed"] = model_info.params.get("seed", None) + if model_info.params.get("mirostat_tau", None): - payload["options"]["stop"] = ( - [ - bytes(stop, "utf-8").decode("unicode_escape") - for stop in model_info.params["stop"] - ] - if model_info.params.get("stop", None) - else None - ) + payload["options"]["mirostat_tau"] = model_info.params.get( + "mirostat_tau", None + ) - payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None) + if model_info.params.get("num_ctx", None): + payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None) - payload["options"]["num_predict"] = model_info.params.get( - "max_tokens", None - ) - payload["options"]["top_k"] = model_info.params.get("top_k", None) + if model_info.params.get("repeat_last_n", None): + payload["options"]["repeat_last_n"] = model_info.params.get( + "repeat_last_n", None + ) - payload["options"]["top_p"] = model_info.params.get("top_p", None) + if model_info.params.get("frequency_penalty", None): + payload["options"]["repeat_penalty"] = model_info.params.get( + "frequency_penalty", None + ) + + if model_info.params.get("temperature", None): + payload["options"]["temperature"] = model_info.params.get( + "temperature", None + ) + + if model_info.params.get("seed", None): + payload["options"]["seed"] = model_info.params.get("seed", None) + + if model_info.params.get("stop", None): + payload["options"]["stop"] = ( + [ + bytes(stop, "utf-8").decode("unicode_escape") + for stop in model_info.params["stop"] + ] + if model_info.params.get("stop", None) + else None + ) + + if model_info.params.get("tfs_z", None): + payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None) + + if model_info.params.get("max_tokens", None): + payload["options"]["num_predict"] = model_info.params.get( + "max_tokens", None + ) + + if model_info.params.get("top_k", None): + payload["options"]["top_k"] = model_info.params.get("top_k", None) + + if model_info.params.get("top_p", None): + payload["options"]["top_p"] = model_info.params.get("top_p", None) + + if model_info.params.get("use_mmap", None): + payload["options"]["use_mmap"] = model_info.params.get("use_mmap", None) + + if model_info.params.get("use_mlock", None): + payload["options"]["use_mlock"] = model_info.params.get( + "use_mlock", None + ) + + if model_info.params.get("num_thread", None): + payload["options"]["num_thread"] = model_info.params.get( + "num_thread", None + ) if model_info.params.get("system", None): # Check if the payload already has a system message diff --git a/backend/apps/openai/main.py b/backend/apps/openai/main.py index 1407a52d0..7429d94ed 100644 --- a/backend/apps/openai/main.py +++ b/backend/apps/openai/main.py @@ -239,6 +239,27 @@ async def get_all_models(raw: bool = False): ) or not app.state.config.ENABLE_OPENAI_API: models = {"data": []} else: + # Check if API KEYS length is same than API URLS length + if len(app.state.config.OPENAI_API_KEYS) != len( + app.state.config.OPENAI_API_BASE_URLS + ): + # if there are more keys than urls, remove the extra keys + if len(app.state.config.OPENAI_API_KEYS) > len( + app.state.config.OPENAI_API_BASE_URLS + ): + app.state.config.OPENAI_API_KEYS = app.state.config.OPENAI_API_KEYS[ + : len(app.state.config.OPENAI_API_BASE_URLS) + ] + # if there are more urls than keys, add empty keys + else: + app.state.config.OPENAI_API_KEYS += [ + "" + for _ in range( + len(app.state.config.OPENAI_API_BASE_URLS) + - len(app.state.config.OPENAI_API_KEYS) + ) + ] + tasks = [ fetch_url(f"{url}/models", app.state.config.OPENAI_API_KEYS[idx]) for idx, url in enumerate(app.state.config.OPENAI_API_BASE_URLS) diff --git a/package-lock.json b/package-lock.json index ed436fcfe..13638b0a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.2.0", + "version": "0.2.1", "dependencies": { "@pyscript/core": "^0.4.32", "@sveltejs/adapter-node": "^1.3.1", diff --git a/package.json b/package.json index 495ad113a..11b3afb58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.2.0", + "version": "0.2.1", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", diff --git a/src/lib/components/chat/Messages/UserMessage.svelte b/src/lib/components/chat/Messages/UserMessage.svelte index c895adb61..04591a14f 100644 --- a/src/lib/components/chat/Messages/UserMessage.svelte +++ b/src/lib/components/chat/Messages/UserMessage.svelte @@ -196,7 +196,7 @@
{/if} +
{$i18n.t('Max Tokens (num_predict)')}
@@ -604,6 +608,93 @@
{/if}
+ +
+
+
{$i18n.t('use_mmap (Ollama)')}
+ + +
+
+ +
+
+
{$i18n.t('use_mlock (Ollama)')}
+ + +
+
+ +
+
+
{$i18n.t('num_thread (Ollama)')}
+ + +
+ + {#if (params?.num_thread ?? null) !== null} +
+
+ +
+
+ +
+
+ {/if} +
+
{$i18n.t('Template')}
diff --git a/src/lib/components/chat/Settings/Connections.svelte b/src/lib/components/chat/Settings/Connections.svelte index 0d5f7e50a..80fdcf45f 100644 --- a/src/lib/components/chat/Settings/Connections.svelte +++ b/src/lib/components/chat/Settings/Connections.svelte @@ -1,6 +1,6 @@
- {#if ollamaVersion !== null} -
-
{$i18n.t('Manage Ollama Models')}
+ {#if ollamaEnabled} + {#if ollamaVersion !== null} +
+
{$i18n.t('Manage Ollama Models')}
- {#if OLLAMA_URLS.length > 0} -
-
- -
- -
-
- - - -
-
-
- - {#if updateModelId} - Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''} - {/if} - {/if} - -
-
-
{$i18n.t('Pull a model from Ollama.com')}
-
-
- -
- -
- -
- {$i18n.t('To access the available model names for downloading,')} - {$i18n.t('click here.')} -
- - {#if Object.keys($MODEL_DOWNLOAD_POOL).length > 0} - {#each Object.keys($MODEL_DOWNLOAD_POOL) as model} - {#if 'pullProgress' in $MODEL_DOWNLOAD_POOL[model]} -
-
{model}
-
-
-
-
- {$MODEL_DOWNLOAD_POOL[model].pullProgress ?? 0}% -
-
- - - - -
- {#if 'digest' in $MODEL_DOWNLOAD_POOL[model]} -
- {$MODEL_DOWNLOAD_POOL[model].digest} -
- {/if} -
-
- {/if} - {/each} - {/if} -
- -
-
{$i18n.t('Delete a model')}
-
-
+ {#if OLLAMA_URLS.length > 0} +
+
- -
-
-
-
-
{$i18n.t('Experimental')}
- -
-
- - {#if showExperimentalOllama} -
{ - uploadModelHandler(); - }} - > -
-
{$i18n.t('Upload a GGUF model')}
- - -
- -
-
- {#if modelUploadMode === 'file'} -
- { - console.log(modelInputFile); - }} - accept=".gguf,.safetensors" - required - hidden - /> - - -
- {:else} -
- -
- {/if} -
- - {#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')} - - {/if} + + +
+
+
+ + {#if updateModelId} + Updating "{updateModelId}" {updateProgress ? `(${updateProgress}%)` : ''} + {/if} + {/if} + +
+
+
{$i18n.t('Pull a model from Ollama.com')}
+
+
+ +
+
- {#if (modelUploadMode === 'file' && modelInputFile && modelInputFile.length > 0) || (modelUploadMode === 'url' && modelFileUrl !== '')} -
-
-
{$i18n.t('Modelfile Content')}
-