diff --git a/CHANGELOG.md b/CHANGELOG.md index 91a7373156..de8e2b2303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,20 @@ 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.5.6] - 2025-01-22 + +### Added + +- **🧠 Effortful Reasoning Control for OpenAI Models**: Introduced the `reasoning_effort` parameter in chat controls for supported OpenAI models, enabling users to fine-tune how much cognitive effort a model dedicates to its responses, offering greater customization for complex queries and reasoning tasks. + +### Fixed + +- **🔄 Chat Controls Loading UI Bug**: Resolved an issue where collapsible chat controls appeared as "loading," ensuring a smoother and more intuitive user experience for managing chat settings. + +### Changed + +- **🔧 Updated Ollama Model Creation**: Revamped the Ollama model creation method to align with their new JSON payload format, ensuring seamless compatibility and more efficient model setup workflows. + ## [0.5.5] - 2025-01-22 ### Added diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index b23e342fb6..4a64565901 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -551,11 +551,12 @@ async def push_model( class CreateModelForm(BaseModel): - name: str - modelfile: Optional[str] = None + model: Optional[str] = None stream: Optional[bool] = None path: Optional[str] = None + model_config = ConfigDict(extra="allow") + @router.post("/api/create") @router.post("/api/create/{url_idx}") diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 5d15f62fc0..a2af6ded92 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -671,6 +671,10 @@ def apply_params_to_form_data(form_data, model): if "frequency_penalty" in params: form_data["frequency_penalty"] = params["frequency_penalty"] + + if "reasoning_effort" in params: + form_data["reasoning_effort"] = params["reasoning_effort"] + return form_data diff --git a/backend/open_webui/utils/payload.py b/backend/open_webui/utils/payload.py index fdc62f79fe..13f98ee019 100644 --- a/backend/open_webui/utils/payload.py +++ b/backend/open_webui/utils/payload.py @@ -47,6 +47,7 @@ def apply_model_params_to_body_openai(params: dict, form_data: dict) -> dict: "top_p": float, "max_tokens": int, "frequency_penalty": float, + "reasoning_effort": str, "seed": lambda x: x, "stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x], } diff --git a/package-lock.json b/package-lock.json index bb1b0a0753..dd56f3348d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.5.5", + "version": "0.5.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.5.5", + "version": "0.5.6", "dependencies": { "@codemirror/lang-javascript": "^6.2.2", "@codemirror/lang-python": "^6.1.6", diff --git a/package.json b/package.json index 29a75903f7..a89b1e4166 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.5.5", + "version": "0.5.6", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host", diff --git a/src/lib/apis/ollama/index.ts b/src/lib/apis/ollama/index.ts index 16eed9f21a..b96567e639 100644 --- a/src/lib/apis/ollama/index.ts +++ b/src/lib/apis/ollama/index.ts @@ -360,12 +360,7 @@ export const generateChatCompletion = async (token: string = '', body: object) = return [res, controller]; }; -export const createModel = async ( - token: string, - tagName: string, - content: string, - urlIdx: string | null = null -) => { +export const createModel = async (token: string, payload: object, urlIdx: string | null = null) => { let error = null; const res = await fetch( @@ -377,10 +372,7 @@ export const createModel = async ( 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, - body: JSON.stringify({ - name: tagName, - modelfile: content - }) + body: JSON.stringify(payload) } ).catch((err) => { error = err; diff --git a/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte b/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte index 7c939595a7..3420b669d1 100644 --- a/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte +++ b/src/lib/components/admin/Settings/Models/Manage/ManageOllama.svelte @@ -44,8 +44,9 @@ let modelTag = ''; let createModelLoading = false; - let createModelTag = ''; - let createModelContent = ''; + let createModelName = ''; + let createModelObject = ''; + let createModelDigest = ''; let createModelPullProgress = null; @@ -427,10 +428,23 @@ const createModelHandler = async () => { createModelLoading = true; + + let modelObject = {}; + // parse createModelObject + try { + modelObject = JSON.parse(createModelObject); + } catch (error) { + toast.error(`${error}`); + createModelLoading = false; + return; + } + const res = await createModel( localStorage.token, - createModelTag, - createModelContent, + { + model: createModelName, + ...modelObject + }, urlIdx ).catch((error) => { toast.error(`${error}`); @@ -496,18 +510,22 @@ createModelLoading = false; - createModelTag = ''; - createModelContent = ''; + createModelName = ''; + createModelObject = ''; createModelDigest = ''; createModelPullProgress = null; }; const init = async () => { loading = true; - ollamaModels = await getOllamaModels(localStorage.token, urlIdx); + ollamaModels = await getOllamaModels(localStorage.token, urlIdx).catch((error) => { + toast.error(`${error}`); + return null; + }); - console.log(ollamaModels); - loading = false; + if (ollamaModels) { + loading = false; + } }; $: if (urlIdx !== null) { @@ -747,15 +765,15 @@ placeholder={$i18n.t('Enter model tag (e.g. {{modelTag}})', { modelTag: 'my-modelfile' })} - bind:value={createModelTag} + bind:value={createModelName} disabled={createModelLoading} />