<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Open WebUI on Admantium</title>
        <link>https://admantium.com/categories/open-webui/</link>
        <description>Recent content in Open WebUI on Admantium</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Thu, 22 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://admantium.com/categories/open-webui/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Open WebUI: Scheduling Agents</title>
            <link>https://admantium.com/blog/llm42_open_webui_custom_agents_and_invocations/</link>
            <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://admantium.com/blog/llm42_open_webui_custom_agents_and_invocations/</guid>
            <description>&lt;!-- META&#xA;  STARTED 2026-07-05&#xA;  FINISHED 2026-07-26&#xA;--&gt;&#xA;&lt;p&gt;Open WebUI provides a uniform chat interface with media uploads and persistent conversations that connect to an Ollama backend or an OpenAI API-compatible LLM provider. Recent versions also added a terminal, a Docker container in which to execute code, as well as configurable tools, skills, and memory. By building custom models, individual conversations build a persistent agent.&lt;/p&gt;&#xA;&lt;p&gt;This is the final article of my Open WebUI investigation. It takes another turn at agent definition, detailing skill and tool definition, and showing how to invoke agents automatically via schedules and through a remote chat interface.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;The technical context of this article is &lt;code&gt;Open WebUI v0.9.6&lt;/code&gt;, published on 2026-06-01. The setup and configuration examples should also work with newer versions.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;While I am fascinated by the capabilities of artificial intelligence tools and applications, crafting blog articles remains a personal skill. Every character, number, and symbol in this article was typed manually, with the exception of verbatim copies from log messages and screenshots.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;custom-tools&#34;&gt;Custom Tools&#xA;&lt;/h2&gt;&lt;h3 id=&#34;definition&#34;&gt;Definition&#xA;&lt;/h3&gt;&lt;p&gt;Tools are Python snippets defined by an admin account. They need to follow a design contract with specifically named objects and functions, and when configured for a base model, inject their definition into the system prompt so that the base model can issue tool calls.&lt;/p&gt;&#xA;&lt;h3 id=&#34;adding-custom-tools-to-open-webui&#34;&gt;Adding Custom Tools to Open WebUI&#xA;&lt;/h3&gt;&lt;p&gt;While there is the option to implement a custom tool following the &lt;a class=&#34;link&#34; href=&#34;https://docs.openwebui.com/features/extensibility/plugin/tools/development&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;official documentation&lt;/a&gt;, tools can also be imported from the &lt;a class=&#34;link&#34; href=&#34;https://openwebui.com/search?sort=top&amp;amp;t=all&amp;amp;page=1&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Community Tool Library&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here is an example of adding a tool that shows the current weather.&lt;/p&gt;&#xA;&lt;p&gt;The first step is to find an appropriate tool and get its files.&lt;/p&gt;&#xA;&lt;p&gt;On the community marketplace:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Search for the tool in the community marketplace.&lt;/li&gt;&#xA;&lt;li&gt;Click on the &lt;code&gt;Get&lt;/code&gt; button (an account is required).&lt;/li&gt;&#xA;&lt;li&gt;Download the JSON file.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_weather_tool_from_community_page.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Alternatively, the Python file can be downloaded from the linked &lt;a class=&#34;link&#34; href=&#34;https://github.com/iChristGit/OpenWebui-Tools/blob/main/Tools/weather.py&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_weather_tool_from_gitlab.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;The second step is to define the tool in the Open WebUI instance. With an admin user account, &lt;code&gt;Workspace&lt;/code&gt; =&amp;gt; &lt;code&gt;Tools&lt;/code&gt; needs to be opened. When the tool was downloaded from the community page, clicking on &lt;code&gt;Import&lt;/code&gt; and selecting the downloaded JSON file suffices. If the Python source code file is used, then clicking on &lt;code&gt;+ New Tool&lt;/code&gt; and pasting the file content is required.&lt;/p&gt;&#xA;&lt;h3 id=&#34;model-configuration&#34;&gt;Model Configuration&#xA;&lt;/h3&gt;&lt;p&gt;As explained in my earlier articles, base models and custom models require a strict definition of their capabilities and available tools, and therefore the new weather tool needs to be added. Follow these steps:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Go to &lt;code&gt;Workspace&lt;/code&gt;, then &lt;code&gt;Models&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Select an existing base model, or define a new one&lt;/li&gt;&#xA;&lt;li&gt;The tools section lists all imported or self-defined tools; activate them for the target model&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;tool-invocation&#34;&gt;Tool Invocation&#xA;&lt;/h3&gt;&lt;p&gt;To test this new weather tool, I created a new model named &lt;code&gt;assistant&lt;/code&gt;, based on GPT-5.4, and added the tool.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_assistant_model_definition.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;When using the model, I unfortunately encountered conversational hurdles again to get the tool applied. Only a direct mention of the tool led to success - the Python code was invoked, and its results rendered in the conversation interface.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_custom_tool_invocation.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;custom-skills&#34;&gt;Custom Skills&#xA;&lt;/h2&gt;&lt;h3 id=&#34;definition-1&#34;&gt;Definition&#xA;&lt;/h3&gt;&lt;p&gt;Skills are markdown declarations with detailed instructions. They are intended to specify complex steps with explicit instructions, rules, and policies, and potentially source code files that should be executed.&lt;/p&gt;&#xA;&lt;p&gt;Skill repositories are abundant, and &lt;a class=&#34;link&#34; href=&#34;https://www.skills.sh/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;skills.sh&lt;/a&gt; provides an easy entry point. Search for skills that support GitLab interactions; I encountered &lt;a class=&#34;link&#34; href=&#34;https://github.com/github/awesome-copilot/blob/main/skills/git-commit/SKILL.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;git-commit&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://github.com/YPares/agent-skills/blob/main/github-pr-workflow/SKILL.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;github-pr-workflow&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here is an excerpt of the skill file.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Source: https://github.com/github/awesome-copilot/blob/main/skills/git-commit/SKILL.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;**&lt;/span&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name: github-pr-workflow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;description: Working with GitHub Pull Requests using the gh CLI. Use for fetching PR details, review comments, CI status, and understanding the difference between PR-level comments vs inline code review comments.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-style:italic&#34;&gt;**&lt;/span&gt;*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# GitHub PR Workflow&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Key Concepts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### Comment Types&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GitHub PRs have &lt;span style=&#34;font-weight:bold&#34;&gt;**two different types of comments**&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;1.&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;**PR-level comments**&lt;/span&gt; - General discussion on the PR (shown via &lt;span style=&#34;color:#e6db74&#34;&gt;`gh pr view --comments`&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;2.&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;**Inline code review comments**&lt;/span&gt; - Comments attached to specific lines of code (requires API)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;**Important**&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;`gh pr view --comments`&lt;/span&gt; does NOT show inline code review comments!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Scripts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| Script | Purpose |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|--------|---------|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| &lt;span style=&#34;color:#e6db74&#34;&gt;`gh-pr-info &amp;lt;PR&amp;gt; [REPO]`&lt;/span&gt; | &lt;span style=&#34;font-weight:bold&#34;&gt;**Comprehensive PR info**&lt;/span&gt;: summary, CI checks, and unresolved review and inline comments |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The script auto-detects the repo from the git remote, or accepts &lt;span style=&#34;color:#e6db74&#34;&gt;`[REPO]`&lt;/span&gt; as a second argument (format: &lt;span style=&#34;color:#e6db74&#34;&gt;`owner/repo`&lt;/span&gt;).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;**Key features**&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Uses GitHub&amp;#39;s GraphQL API to reliably filter out already resolved/addressed comments.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Excludes collapsed/hidden review threads.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Excludes minimized comments (marked as spam/off-topic/resolved).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Excludes dismissed reviews.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Shows only what still needs attention.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Common Commands&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Get complete PR info with UNRESOLVED comments only&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gh-pr-info &amp;lt;PR&amp;gt; [REPO]             # ✅ Everything you need: summary, checks, reviews, unresolved comments&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;adding-custom-skills&#34;&gt;Adding Custom Skills&#xA;&lt;/h3&gt;&lt;p&gt;The declaration of custom skills in Open WebUI follows similar steps to those of tools. Follow these steps:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;On the skill repository page, open the skill file in markdown format, and either save the file or copy its content&lt;/li&gt;&#xA;&lt;li&gt;In Open WebUI, click on &lt;code&gt;Workspace&lt;/code&gt; =&amp;gt; &lt;code&gt;Skills&lt;/code&gt;, and either &lt;code&gt;Import&lt;/code&gt; to select the downloaded file, or &lt;code&gt;+ New Skill&lt;/code&gt; and paste the file content in the editor window&lt;/li&gt;&#xA;&lt;li&gt;In the top-right corner, click on &lt;code&gt;Access&lt;/code&gt;, and ensure that &lt;code&gt;Public&lt;/code&gt; is selected in the appearing drop-down menu -see the following screenshot:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://admantium.com/images/blog/llm42_add_github_skill.png&#34; &gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;model-configuration-1&#34;&gt;Model Configuration&#xA;&lt;/h3&gt;&lt;p&gt;The skill needs to be configured for the model too.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Go to &lt;code&gt;Workspace&lt;/code&gt;, then &lt;code&gt;Models&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Select an existing base model, or define a new one.&lt;/li&gt;&#xA;&lt;li&gt;In the Skills section, all defined skills should appear. Activate them by selecting their respective checkbox.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;skill-invocation&#34;&gt;Skill Invocation&#xA;&lt;/h3&gt;&lt;p&gt;After adding the new skill to a Python Engineer model, I tried to get the skill invoked. Although skills are intended to be called by the LLM when it detects a specific context or intent, I experienced the best results with direct invocation. In Open WebUI, direct keyword invocation occurs when the command starts with &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_skill_invocation.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Here is an example chat output in which the Python project from my previous article about &lt;a class=&#34;link&#34; href=&#34;https://admantium.com/blog/llm40_open_webui_admin_configuration/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;/a&gt; is continued. The prompt instructed the model to systematically commit the changes.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I’ll configure the repo-local git identity, inspect the repo state, then create the planned conventional commits one by one and show each command with output.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Approved. I proceeded with repo-local git config and created the commits step by step.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Plan executed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Set local git identity&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Inspect repo state&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Initialize git repo if needed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; Create 4 logical commits:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`chore: initialize repository structure`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`build: add Python API dependencies`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`feat(api): add FastAPI app with config endpoint`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`feat(config): add model config data`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running a &lt;code&gt;git log&lt;/code&gt; command in the folder shows the successful application of these commands.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;commit a01ddf84128e6f09276c449d94b62da1ff9064ba (HEAD -&amp;gt; master)&#xA;Author: python-engineer &amp;lt;agent4223@python.org&amp;gt;&#xA;Date:   Sun Jul 5 14:21:42 2026 +0000&#xA;&#xA;    feat(config): add model config data&#xA;&#xA;commit 53991af08e9d57b1b89503c9ac0ddcd39e1519e0&#xA;Author: python-engineer &amp;lt;agent4223@python.org&amp;gt;&#xA;Date:   Sun Jul 5 14:21:42 2026 +0000&#xA;&#xA;    feat(api): add FastAPI app with config endpoint&#xA;&#xA;commit 4905c33d72afd5a95929a2313c331b36da83ca08&#xA;Author: python-engineer &amp;lt;agent4223@python.org&amp;gt;&#xA;Date:   Sun Jul 5 14:21:42 2026 +0000&#xA;&#xA;    build: add Python API dependencies&#xA;&#xA;commit d2ea8ce702ff159b1438949d26f83e56f2d7d55d&#xA;Author: python-engineer &amp;lt;agent4223@python.org&amp;gt;&#xA;Date:   Sun Jul 5 14:21:42 2026 +0000&#xA;&#xA;    chore: initialize repository structure&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;model-invocation&#34;&gt;Model Invocation&#xA;&lt;/h2&gt;&lt;p&gt;Models with custom tools and skills can be invoked in four different ways.&lt;/p&gt;&#xA;&lt;h3 id=&#34;chat-interface&#34;&gt;Chat Interface&#xA;&lt;/h3&gt;&lt;p&gt;The native Open WebUI chat interface is bound to the selected model. Once selected, all user messages are parsed and answered by this configured model. However, at every turn in the conversation, the model can be switched, and new messages are answered by the new model. This opens a myriad of questions surrounding conversational flow. Since capabilities and tools are configured per model, switching one could invalidate the use of skills. While the LLM could see past messages, it could not repeat the same invocation and arrive at the same result. This is further complicated by the fact that past messages can be regenerated.&lt;/p&gt;&#xA;&lt;h3 id=&#34;scheduled&#34;&gt;Scheduled&#xA;&lt;/h3&gt;&lt;p&gt;Automations allow model calls on defined schedules. They are accessible from the user menu. Follow these steps:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Click the user icon, then click &lt;code&gt;Automations&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Click the &lt;code&gt;+ New Automation&lt;/code&gt; button&lt;/li&gt;&#xA;&lt;li&gt;Provide a suitable prompt, and program the schedule with an RRULE, an iCalendar-specific format&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;To run a command every 5 minutes, the time modifier would be &lt;code&gt;RRULE:FREQ=MINUTELY;INTERVAL=5&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here is a screenshot showing how this invocation is defined:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_add_automation.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Invocations of an automation appear as normal chats in the chat list. As can be seen in the following screenshot, getting the right prompt for the chosen gpt-5-nano base to perform changes without clarification questions can be tricky.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm42_automation_invocation.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;agent-runtime&#34;&gt;Agent Runtime&#xA;&lt;/h3&gt;&lt;p&gt;Instead of creating an Open WebUI agent via base model declaration, there is also the option to use just the chat interface and connect to an agent system. Three options are explained in the official documentation: &lt;a class=&#34;link&#34; href=&#34;https://github.com/openclaw/openclaw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenClaw&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://github.com/nousresearch/hermes-agent&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Hermes&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://github.com/open-webui/computer&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Open WebUI Computer&lt;/a&gt;, which promises uniform API-based access to operations on a computer. However, this option should be explored in a dedicated article, because the implications of which systems define skills and tools, and where the invocation happens, are not clear from these documents.&lt;/p&gt;&#xA;&lt;h3 id=&#34;external-apps&#34;&gt;External Apps&#xA;&lt;/h3&gt;&lt;p&gt;There is no native integration to connect Open WebUI to a communication channel. But during my research, I encountered the following GitHub projects.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Sid-Sun/openwebui-telegram&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;openwebui-telegram&lt;/a&gt;: This repo provides a custom Telegram bridge -it polls Telegram server endpoints for messages, and when receiving them, contacts the configured Open WebUI API endpoint for chat completions. Messages are parsed back and forth between these two APIs&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/open-webui/bot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;open-webui/bot&lt;/a&gt;: An experimental project that wraps Open WebUI’s channel feature and implements a bot interface. However, there is no direct connection to a messaging service or platform&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/jakkph32/open-webui-utils&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;open-webui-utils&lt;/a&gt;: A repository that contains two Open WebUI tools for outbound message integration, one for Telegram and one for Discord&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Additional projects can be found on the Open WebUI Community page when searching for messaging platforms.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;Over the course of three years, Open WebUI incorporated several features that can turn mere model invocation into agents. Specifically, custom model definitions with prompts, configurable capabilities that produce useful tools, and built-in as well as extensible tools to execute them. Conversations become data that can be added to a knowledge base, and when used with the same base model, this provides a growing context for future conversations. Finally, the terminal added the capability to execute arbitrary code in a Docker container, creating a coding-agent experience. This article showed what tools and skills are, how to find, configure, and use them in Open WebUI. It also listed the available ways to invoke a defined model: through the chat interface, with automations triggered on defined schedules, using an external runtime, and through community projects for access from external apps. But are these features sufficient to create true agents? And how does this experience compare with other agent systems? Future articles may explore these questions.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Open WebUI: Creating Custom Agents</title>
            <link>https://admantium.com/blog/llm41_open_webui_how_to_define_agents/</link>
            <pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://admantium.com/blog/llm41_open_webui_how_to_define_agents/</guid>
            <description>&lt;!-- META&#xA;  STARTED 2026-06-28&#xA;  FINISHED 2026-07-03&#xA;  REFINED 2026-07-26&#xA;--&gt;&#xA;&lt;p&gt;Open WebUI evolved from an Ollama chat interface into a full-fledged agent interface for any OpenAI API endpoint. Chat context can come from custom knowledge bases for RAG retrieval, text, images, or other chat references, as well as memory. Custom models are built on top of a base model and then configured with a custom prompt, tools, and skills. Finally, the newly added Terminal feature connects to a Docker container to run arbitrary code. With this feature set, Open WebUI promises full agent capabilities.&lt;/p&gt;&#xA;&lt;p&gt;This article focuses on the step-by-step creation of a coding agent. You will learn which feature configurations in Open WebUI are relevant, how to set up the agent with its prompts and tools, and finally how to execute chats that result in updates to a codebase via the default chat interface and deferred cron jobs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;The technical context of this article is &lt;code&gt;Open WebUI v0.9.6&lt;/code&gt;, published on 2026-06-01. The setup and configuration examples should also work with newer versions.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;While I am fascinated by the capabilities of artificial intelligence tools and applications, crafting blog articles remains a personal skill. Every character, number, and symbol in this article was typed manually, with the exception of verbatim copies from log messages and screenshots.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;agent-setup&#34;&gt;Agent Setup&#xA;&lt;/h2&gt;&lt;h3 id=&#34;requirements&#34;&gt;Requirements&#xA;&lt;/h3&gt;&lt;p&gt;The custom coding agent should meet the following requirements:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Base model: A recent model capable of coding&lt;/li&gt;&#xA;&lt;li&gt;Custom prompt: A senior Python full-stack engineer with a structured, rigorous work method&lt;/li&gt;&#xA;&lt;li&gt;Tools: No special tools&lt;/li&gt;&#xA;&lt;li&gt;Knowledge: No specialized local knowledge required&lt;/li&gt;&#xA;&lt;li&gt;Memory: The coding session should persist; for example, stack choices should be remembered&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;base-model&#34;&gt;Base Model&#xA;&lt;/h3&gt;&lt;p&gt;The agent is implemented as a custom model, accessible from the Open WebUI GUI via &lt;code&gt;Workspace&lt;/code&gt;, then &lt;code&gt;Models&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For the base model, I wanted to stay on the conservative side for this test. Specifically, I did not want to be surprised by Codex-class billing for this setup. At the time of writing, &lt;code&gt;gpt-5.4-nano&lt;/code&gt; offered a good input and output token cost profile. All prices for OpenAI models can be derived from &lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/api/docs/pricing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenAI API Pricing&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;prompt&#34;&gt;Prompt&#xA;&lt;/h3&gt;&lt;p&gt;For the system prompt, I used another LLM provider and a creative prompt to produce a non-standard description for the senior Python developer. Here it is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Senior Python Engineer — Prompt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;You are a **SENIOR PYTHON ENGINEER** with **FULL-STACK** capability.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your style combines the enigmatic clarity of a systems thinker, the discipline of a machinist, the memory of an archivist, and the rigor of empiricism-driven validation.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Role&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Design, build, debug, and improve production-grade software across backends, APIs, data flows, infrastructure boundaries, and frontend integration points.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Expectations&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Write clean, idiomatic, maintainable Python.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Prefer strong typing, clear abstractions, and explicit trade-offs.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Think in systems: performance, reliability, observability, security, and developer ergonomics.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Operate as a full-stack engineer when needed: backend first, but comfortable with frontend architecture, API contracts, and integration details.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Default to pragmatic solutions over fashionable complexity.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Working Style&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- **Enigmatic**: find non-obvious but explainable solutions.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- **Machinist**: engineer with precision, repeatability, and mechanical discipline.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- **Archivist**: preserve context, document decisions, and keep codebases legible over time.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- **Empirical**: validate assumptions through measurement, tests, benchmarks, and evidence.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Technical Principles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Use Python thoughtfully: typing, async when justified, testing, profiling, and clear module boundaries.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Design APIs and services &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; scale, debuggability, and failure tolerance.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Make observability native: logs, metrics, traces, and actionable errors.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Treat security as a design constraint, not an afterthought.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Keep code easy to review, extend, and operate.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Response Rules&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Give concise, technically sharp answers.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Provide working code when implementation is requested.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- State assumptions before designing complex solutions.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Explain trade-offs briefly and clearly.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Avoid filler, vague advice, and unnecessary abstraction.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- Favor production-suitable patterns over tutorial-style shortcuts.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## Output Preference&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Return answers as a senior engineer would: precise, grounded, structured, and directly useful.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;knowledge-skills-and-custom-skills&#34;&gt;Knowledge, Skills, and Custom Skills&#xA;&lt;/h3&gt;&lt;p&gt;To test agent invocation and gauge performance, I decided against adding additional configurations here.&lt;/p&gt;&#xA;&lt;h3 id=&#34;memory&#34;&gt;Memory&#xA;&lt;/h3&gt;&lt;p&gt;Open WebUI&amp;rsquo;s default configuration has memory disabled. Each user needs to activate it explicitly. Click on the user icon, then on &lt;code&gt;Settings&lt;/code&gt;, and then on &lt;code&gt;Personalization&lt;/code&gt;. Flip the toggle. From then on, each interaction may store persistent facts encountered during use. This section also includes a button to manage memory, for example to list and edit entries.&lt;/p&gt;&#xA;&lt;h3 id=&#34;capabilities-and-built-in-tools&#34;&gt;Capabilities and Built-in Tools&#xA;&lt;/h3&gt;&lt;p&gt;Capabilities define allowed tool calls which, when enabled, result in an extended system prompt or additional conversation metadata. The default features are common, and the built-in tools are optional tools that can be enabled. If they are enabled, the model can issue tool calls, and Open WebUI will execute them.&lt;/p&gt;&#xA;&lt;p&gt;The configuration for the custom model is as follows:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm41_skill_definition.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;For most tools, the Open WebUI Docker image is bundled with the necessary libraries, so the container can run code interpretation and provide access to tasks, notes, and memory. Web search and terminal access still need to be configured.&lt;/p&gt;&#xA;&lt;p&gt;Web search, as also explained in my &lt;a class=&#34;link&#34; href=&#34;https://admantium.com/blog/llm39_open_webui_agent_features/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;previous article&lt;/a&gt;, requires you to create an account with a search provider, get an API key, and paste it here.&lt;/p&gt;&#xA;&lt;p&gt;The Terminal feature and its setup are a bit more involved and warrant an additional section.&lt;/p&gt;&#xA;&lt;h2 id=&#34;open-webui-terminal&#34;&gt;Open WebUI Terminal&#xA;&lt;/h2&gt;&lt;p&gt;The &lt;a class=&#34;link&#34; href=&#34;https://github.com/open-webui/open-terminal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;open-terminal GitHub project&lt;/a&gt; aims to provide a Python package that exposes a REST API for filesystem interaction and command execution. This API is intended to act as a terminal, providing raw filesystem access.&lt;/p&gt;&#xA;&lt;p&gt;Docker images with different capabilities are provided in four variants:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;latest&lt;/code&gt;: A heavyweight 4 GB image with a complete C++, Python, Node.js, and data science library stack, and the default user can run &lt;code&gt;sudo&lt;/code&gt; to install additional packages&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;slim&lt;/code&gt;: A production image with only &lt;code&gt;git&lt;/code&gt; as an additional tool&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;alpine&lt;/code&gt;: A slim variant based on Alpine, further reducing image size to 230 MB&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;openshift&lt;/code&gt;: A security-context-constrained (SCC) image that further minimizes access rights&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Since I already run Open WebUI as a Docker container, configured via a &lt;code&gt;docker-compose.yml&lt;/code&gt; file, it is only natural to extend it with an &lt;code&gt;open-terminal&lt;/code&gt; section. However, I also wanted to customize the image to include the required libraries.&lt;/p&gt;&#xA;&lt;h3 id=&#34;custom-image&#34;&gt;Custom Image&#xA;&lt;/h3&gt;&lt;p&gt;From the GitHub repository, we only need &lt;code&gt;Dockerfile.slim&lt;/code&gt;. Download the repository with this command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone --depth&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; https://github.com/open-webui/open-terminal.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then open the Dockerfile and add all additional libraries that are required. For my goal as a Python engineer, &lt;code&gt;pip&lt;/code&gt; is required and should be added to the Dockerfile. There is a section for adding custom packages; extend it as follows:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; apt-get update &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install -y --no-install-recommends &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        python3-pip &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tini &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ...&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Build the image and provide a custom tag.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker build -f Dockerfile.slim -t open-terminal-custom-python:20260628 .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;extend-docker-compose-file&#34;&gt;Extend Docker Compose File&#xA;&lt;/h3&gt;&lt;p&gt;Add this to the compose file from my &lt;a class=&#34;link&#34; href=&#34;https://admantium.com/blog/llm37_open_webui_setup/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Open WebUI setup article&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;open-webui-terminal&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;open-terminal-custom-python:20260628&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;open-webui-terminal&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;env_file&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./open-terminal.env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;open-terminal:/home/user&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;Open WebUI&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the &lt;code&gt;open-terminal.env&lt;/code&gt; file, enter the following value with a self-generated secret:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;OPEN_TERMINAL_API_KEY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;REDACTED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then start the updated stack with &lt;code&gt;docker compose up&lt;/code&gt;. The container logs should show the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37    ____                    _____                   _             _&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37   / __ &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;                 |_   _|                 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;_&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;           | |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37  | |  | |_ __   ___ _ __   | | ___ _ __ _ __ ___  _ _ __   __ _| |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37  | |  | | &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_ \ / _ | &amp;#39;&lt;/span&gt;_ &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt; | |/ _ | &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__| &amp;#39;&lt;/span&gt;_ &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt; _ &lt;span style=&#34;color:#ae81ff&#34;&gt;\|&lt;/span&gt; | &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_ \ / _` | |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37  | |__| | |_) |  __| | | | | |  __| |  | | | | | | | | | | (_| | |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   \____/| .__/ \___|_| |_| \_/\___|_|  |_| |_| |_|_|_| |_|\__,_|_|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37         | |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37         |_|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   Local:    http://localhost:8000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   Network:  http://172.18.0.3:8000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   Warning: Listening on all network interfaces.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   Use --host 127.0.0.1 to restrict to this machine.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   ┌─────────────────────────────────────────────────────────────┐&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;2026-06-28 17:09:37   │  ⚠  CORS is set to &amp;#39;&lt;/span&gt;*&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;allow all origins&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;                 │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37   │                                                             │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37   │  Any website can make requests to this server.              │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37   │  For production, restrict with:                             │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37   │    --cors-allowed-origins https://your-domain.com           │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37   └─────────────────────────────────────────────────────────────┘&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:37&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:38 INFO:     Started server process&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:38 INFO:     Waiting &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; application startup.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:38 INFO:     Application startup complete.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:09:38 INFO:     Uvicorn running on http://0.0.0.0:8000 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Press CTRL+C to quit&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;connecting-open-webui-with-the-terminal-container&#34;&gt;Connecting Open WebUI with the Terminal Container&#xA;&lt;/h3&gt;&lt;p&gt;Finally, the Open WebUI instance needs to be configured for access.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Click on the user icon, then on &lt;code&gt;Admin Panel&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Click on &lt;code&gt;Integrations&lt;/code&gt;, then on the &lt;code&gt;+&lt;/code&gt; symbol next to &lt;code&gt;Open Terminal&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the popup dialog, enter &lt;code&gt;http://open-webui-terminal:8000&lt;/code&gt; for a Docker-internal connection, and enter the API key that you generated above&lt;/li&gt;&#xA;&lt;li&gt;Click on the small rounded-arrows symbol to test the connection, and then on the &lt;code&gt;Save&lt;/code&gt; button&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The &lt;code&gt;open-terminal&lt;/code&gt; Docker container logs should show the following message:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2026-06-28 17:37:15 INFO:     172.18.0.2:55262 - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET /api/config HTTP/1.1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt; OK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;agent-task-tryout-implementing-a-python-rest-api-server-app&#34;&gt;Agent Task Tryout: Implementing a Python REST API Server App&#xA;&lt;/h2&gt;&lt;h3 id=&#34;first-run&#34;&gt;First Run&#xA;&lt;/h3&gt;&lt;p&gt;In the first test, the agent should create a custom Python project that implements a REST API. I prepared an initial prompt and follow-ups, but the agent was eager to do everything in a few turns.&lt;/p&gt;&#xA;&lt;p&gt;Input prompt:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The repository should use Poetry for dependency management. It should be a GitHub repository, and the agent should also gain access to the GitHub Actions runner pipeline.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To set this up, the following prompts will be executed one after another.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Define a GitHub project from scratch &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; a tiny Python agent experiment. Create a repository named python-rest-api with a short README, .gitignore, app/main.py and app/config.json.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From that first prompt alone, the LLM suggested the entire application stack. Here is an excerpt.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Below is a minimal “from scratch” GitHub project structure you can create locally and then push to GitHub.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  1) Repository root structure&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  python-rest-api/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    README.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .gitignore&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      main.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      config.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  2) Create the files&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  README.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  # python-rest-api&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  A tiny Python REST API experiment for a minimal agent workflow.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ## Run&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   python -m venv .venv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source .venv/bin/activate  # (Windows: .venv\Scripts\activate)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pip install -r requirements.txt  # if you add dependencies later&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  python app/main.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Endpoints&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  GET /health - health check&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  app/main.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  from &lt;span style=&#34;font-weight:bold&#34;&gt;__future__&lt;/span&gt; import annotations&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  import json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  import os&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  from http.server import BaseHTTPRequestHandler, HTTPServer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  from pathlib import Path&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  from typing import Any&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  def load_config(config_path: Path) -&amp;gt; dict[str, Any]:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      with config_path.open(&amp;#34;r&amp;#34;, encoding=&amp;#34;utf-8&amp;#34;) as f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          return json.load(f)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  /...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When asked whether those commands were actually executed, the model answered:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No—I&amp;#39;m describing what to create, but I didn’t actually run your terminal or generate the repo in your filesystem. I can’t directly execute commands on your machine unless you provide an environment/session where I can run them.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;What I did instead: I drafted the exact file contents and structure you can create locally, then commit/push.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I learned that the terminal is not enabled by default. In the chat window, there is a small cloud icon that needs to be enabled.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm41_enable_terminal.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Also, on the upper-right side, there is a controls section, and its middle files area shows the content of the terminal container. After a few more prompts, and after repeated clarification that the model could execute commands, it produced files.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm41_tool_execution_tinkering.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;However, it was still difficult to see the output of executed commands. The model repeatedly indicated that the user should run them, or that the environment was not accessible.&lt;/p&gt;&#xA;&lt;p&gt;The GUI showed:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm41_python_app_started.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Example message:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Because in this chat I don’t have access to your running process/network interface to observe the results of the command you executed on your side (the earlier assistant message claimed a run/start, but I can’t reliably capture or retrieve the actual response bytes from your local curl).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;In other words:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I can suggest the command and interpret results if you paste them.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;I can’t directly read the stdout/stderr of your curl unless the execution environment/tool returns the command output back to me (which isn’t happening here).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you paste the exact curl output (including the HTTP status line and headers/body), I’ll diagnose immediately.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Similarily, getting the tool to actually run a &lt;code&gt;curl&lt;/code&gt; call against the started app required multiple attempts.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm41_tool_call_trouble.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;This behavior raised an obvious question: did it come from my specific Open WebUI tool and configuration stack, or was it a limitation of the model?&lt;/p&gt;&#xA;&lt;h3 id=&#34;second-run&#34;&gt;Second Run&#xA;&lt;/h3&gt;&lt;p&gt;For this run, the following aspects were changed:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Base model upgraded to &lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Web search capability disabled&lt;/li&gt;&#xA;&lt;li&gt;Web search and image generation tools disabled&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;One prompt for the whole app.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Create a repository on /app/projects/python-rest-api with a short README, .gitignore, app/main.py and app/config.json. Implement a REST API service with FastAPI. First, create a requirements file with all required packages. Install the libraries. Then create app/main.py and implement a GET /config route that reads app/config.json from disk and returns parsed JSON. In the JSON file, implement a custom data structure that looks like an LLM model list. Run all commands, show their output.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The model executed it flawlessly.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-md&#34; data-lang=&#34;md&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Done. The repository was created at /app/projects/python-rest-api with:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; README.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; .gitignore&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; requirements.txt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; app/main.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; app/config.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Implemented behavior:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; GET /config in FastAPI&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; reads app/config.json from disk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; returns parsed JSON&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; handles:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; missing file with 404&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; invalid JSON with 500&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Notes from command output:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; The install step was attempted with python3 -m pip install -r requirements.txt, but this environment does not have pip available: No module named pip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; File creation succeeded, and python3 -m compileall app successfully compiled app/main.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; The generated config.json contains a custom LLM-style model list with entries such as gpt-4o-mini, claude-3-5-sonnet, and llama-3.1-70b-instruct, plus default_model and object: &amp;#34;list&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If you want, I can also provide the exact file contents in a clean code block format.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I could also ask it to start the web server and execute a curl request against the local endpoint.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;From /app/projects/python-rest-api, start the app on port 9000, &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt; run curl against the config endpoints. Show the output of all commands.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Answer:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;From the provided context, the app was started successfully on port &lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt; from /app/projects/python-rest-api with Uvicorn.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 -m uvicorn app.main:app --host 127.0.0.1 --port &lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Output&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INFO:     Started server process &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INFO:     Waiting &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; application startup.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INFO:     Application startup complete.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INFO:     Uvicorn running on &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;http://127.0.0.1:9000&lt;span style=&#34;color:#f92672&#34;&gt;](&lt;/span&gt;http://127.0.0.1:9000&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Press CTRL+C to quit&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Then curl was run against both config endpoints&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -i &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;http://127.0.0.1:9000/config&lt;span style=&#34;color:#f92672&#34;&gt;](&lt;/span&gt;http://127.0.0.1:9000/config&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; ; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;---&amp;#39;&lt;/span&gt; ; curl -i &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;http://127.0.0.1:9000/config/&lt;span style=&#34;color:#f92672&#34;&gt;](&lt;/span&gt;http://127.0.0.1:9000/config/&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Output&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HTTP/1.1 &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt; OK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;date: Fri, &lt;span style=&#34;color:#ae81ff&#34;&gt;03&lt;/span&gt; Jul &lt;span style=&#34;color:#ae81ff&#34;&gt;2026&lt;/span&gt; 16:56:45 GMT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;server: uvicorn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content-length: &lt;span style=&#34;color:#ae81ff&#34;&gt;656&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content-type: application/json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;models&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;[{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-4o-mini&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;owned_by&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;context_window&amp;#34;&lt;/span&gt;:128000,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pricing&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input_per_1k_tokens&amp;#34;&lt;/span&gt;:0.00015,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;output_per_1k_tokens&amp;#34;&lt;/span&gt;:0.0006&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;capabilities&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chat&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tools&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;json_mode&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]}&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;claude-3-5-sonnet&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;owned_by&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;anthropic&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;context_window&amp;#34;&lt;/span&gt;:200000,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pricing&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input_per_1k_tokens&amp;#34;&lt;/span&gt;:0.003,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;output_per_1k_tokens&amp;#34;&lt;/span&gt;:0.015&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;capabilities&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chat&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vision&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tools&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]}&lt;/span&gt;,&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;llama-3.1-70b-instruct&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;owned_by&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;context_window&amp;#34;&lt;/span&gt;:131072,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pricing&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;input_per_1k_tokens&amp;#34;&lt;/span&gt;:0.0009,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;output_per_1k_tokens&amp;#34;&lt;/span&gt;:0.0009&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;capabilities&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chat&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;completion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]}]&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;default_model&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-4o-mini&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;:&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;***&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HTTP/1.1 &lt;span style=&#34;color:#ae81ff&#34;&gt;307&lt;/span&gt; Temporary Redirect&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;date: Fri, &lt;span style=&#34;color:#ae81ff&#34;&gt;03&lt;/span&gt; Jul &lt;span style=&#34;color:#ae81ff&#34;&gt;2026&lt;/span&gt; 16:56:45 GMT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;server: uvicorn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;content-length: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;location: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;http://127.0.0.1:9000/config&lt;span style=&#34;color:#f92672&#34;&gt;](&lt;/span&gt;http://127.0.0.1:9000/config&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Summary:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /config returned &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt; OK with the parsed JSON config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terminal:6351ac...un_command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GET /config/ returned &lt;span style=&#34;color:#ae81ff&#34;&gt;307&lt;/span&gt; Temporary Redirect to /config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;terminal:6351ac...un_command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;In this blog post, you learned how to set up a custom coding agent in Open WebUI. Starting from a set of requirements, all configuration steps were shown: a) start custom model creation with a suitable base model from an LLM provider, b) add a custom prompt, c) activate memory, and d) define capabilities and tools. To execute code, an Open Terminal container needs to be added, for which a custom Docker image was built and added to the &lt;code&gt;docker-compose&lt;/code&gt; file. The agent was tasked with creating a Python REST API with a single endpoint at &lt;code&gt;/config&lt;/code&gt;. In the first run with a &lt;code&gt;gpt-5.4-nano&lt;/code&gt; model, the interaction was cumbersome because the model only executed commands after repeated clarification that it could run them. In the second run, with &lt;code&gt;gpt-5.5&lt;/code&gt; as the base model, two one-shot prompts created all files, started the server process, and ran a &lt;code&gt;curl&lt;/code&gt; command against the endpoint to test the application. This worked flawlessly, and highlights the importance of using capable models in capable agentic harnesses.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Open WebUI: Admin Configuration Options in a Nutshell</title>
            <link>https://admantium.com/blog/llm40_open_webui_admin_configuration/</link>
            <pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://admantium.com/blog/llm40_open_webui_admin_configuration/</guid>
            <description>&lt;!-- META&#xA;  STARTED 2026-07-12&#xA;  FINISHED 2026-07-22&#xA;--&gt;&#xA;&lt;p&gt;Open WebUI is a universal chat interface with connectivity to local or remote LLM providers, custom files, documents, and a knowledge base, with full customization of model capabilities. Application features are configured both personally for a user account and globally by admin users.&lt;/p&gt;&#xA;&lt;p&gt;This article continues the exploration of Open WebUI configuration and utilization. Following the extensive coverage of user features and settings, this article provides complete coverage of admin settings. Learn how to provide defaults for base models and connections, web search, and connections to a terminal code execution environment and built-in databases.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;The technical context of this article is &lt;code&gt;Open WebUI v0.9.6&lt;/code&gt;, published on 2026-06-01. The setup and configuration examples should also work with newer versions.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;While I am fascinated by the capabilities of artificial intelligence tools and applications, crafting blog articles remains my personal skill. Every character, number, and symbol in this article was typed manually, with the exception of verbatim copies from log messages and screenshots.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;admin-configuration-entrypoint&#34;&gt;Admin Configuration Entrypoint&#xA;&lt;/h2&gt;&lt;p&gt;The admin user account has access to an additional settings dialog. It can be accessed by clicking the user icon and selecting &lt;code&gt;Admin Panel&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_admin_settings.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;It is structured into four horizontal tabs: &lt;code&gt;Users&lt;/code&gt;, &lt;code&gt;Evaluations&lt;/code&gt;, &lt;code&gt;Functions&lt;/code&gt;, &lt;code&gt;Settings&lt;/code&gt;. The &lt;code&gt;Settings&lt;/code&gt; area displays a vertical list of configuration items. To better understand when to apply each setting, the following sections group options into coherent lifecycle phases or concerns.&lt;/p&gt;&#xA;&lt;h2 id=&#34;model-management&#34;&gt;Model Management&#xA;&lt;/h2&gt;&lt;h3 id=&#34;model-definition&#34;&gt;Model Definition&#xA;&lt;/h3&gt;&lt;p&gt;With &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Models&lt;/code&gt;, all base models offered by connected API endpoints are shown. Similar to custom model declarations, all base models can be adjusted with their prompts, knowledge, files, tools, and skills. Base models can also be pinned to the sidebar, hidden or disabled, and their settings exported as a JSON file.&lt;/p&gt;&#xA;&lt;p&gt;Here is an example export:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-5-mini&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;created&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1754425928&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;owned_by&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;connection_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;external&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-5-mini&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-5-mini&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;model&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;created&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1754425928&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;owned_by&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;system&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;connection_type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;external&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;provider&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;urlIdx&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;is_active&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;model-providers&#34;&gt;Model Providers&#xA;&lt;/h3&gt;&lt;p&gt;Open WebUI requires external LLM providers. Via &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Connections&lt;/code&gt;, different OpenAI API-compatible LLM endpoints and Ollama instances can be configured.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_connections.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;For direct OpenAI API connections, the toggle &lt;code&gt;OpenAI API&lt;/code&gt; needs to be active. Then, with the &lt;code&gt;+&lt;/code&gt; button next to &lt;code&gt;Manage OpenAI API Connections&lt;/code&gt;, additional connections can be set up. Each one requires the following steps:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Enter the API endpoint URL, e.g. &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Insert the API key.&lt;/li&gt;&#xA;&lt;li&gt;Click on the double-arrow icon to validate the connection; a green popup appears to show success.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For Ollama instances, the &lt;code&gt;Ollama API&lt;/code&gt; toggle needs to be active too. Similarly, the &lt;code&gt;+&lt;/code&gt; button next to &lt;code&gt;Manage Ollama API Connections&lt;/code&gt; opens a configuration dialog in which at minimum the URL and authentication details need to be entered, and additionally a prefix and model ID to better distinguish these models once selected.&lt;/p&gt;&#xA;&lt;p&gt;Two more options exist. The &lt;code&gt;Direct Connections&lt;/code&gt; toggle enables non-admin users to add connections too. The &lt;code&gt;Cache Base Model List&lt;/code&gt; can improve performance when many connections are defined: available model results are cached locally and are not fetched again every time a user selects a model or a base model for customization.&lt;/p&gt;&#xA;&lt;h3 id=&#34;model-ratings&#34;&gt;Model Ratings&#xA;&lt;/h3&gt;&lt;p&gt;All user ratings during chats are correlated per model, and comparison scores are computed. This can help when using custom models to determine their long-term effectiveness. Of course, for all LLM providers, public leaderboards can provide ratings from a much broader audience.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_evaluations.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Via the &lt;code&gt;Evaluations&lt;/code&gt; tab, or from &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;Evaluations&lt;/code&gt;, two subfeatures can be accessed.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;Leaderboard&lt;/code&gt; is a full list of all configured models and captures individual users&amp;rsquo; scores for particular chats. Each chat bubble provides quick feedback via the “Thumbs Up” and “Thumbs Down” buttons. When users regenerate answers and score them, a data point about cross-model scoring is completed. Over time, this private leaderboard should provide valuable insights based on the users&amp;rsquo; utilization of Open WebUI for their purposes, and is therefore better fitting than any public leaderboard and its scores.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;Feedback&lt;/code&gt; section shows concrete data points rendered as a list. Individual data points can be selected, which opens a popup with the evaluated text snippet and the rating.&lt;/p&gt;&#xA;&lt;h2 id=&#34;model-capabilities&#34;&gt;Model Capabilities&#xA;&lt;/h2&gt;&lt;h3 id=&#34;web-search&#34;&gt;Web Search&#xA;&lt;/h3&gt;&lt;p&gt;For most use cases, web search is a mandatory requirement for fetching up-to-date information. This feature can be configured via &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Web Search&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Internally, the search process is handled by two components. A Web Search Engine processes a search query and returns a list of relevant links, and the Web Loader Engine fetches the links and extracts text.&lt;/p&gt;&#xA;&lt;p&gt;For the Search Engine, more than 20 different providers can be configured, such as Ollama Cloud, Perplexity, Brave, or Firecrawl. For each of them, a slightly different dialog is shown, containing the authorization information for the service, typically an API key, and other specific options.&lt;/p&gt;&#xA;&lt;p&gt;The loader engine can be configured as Playwright, Firecrawl, Tavily, or an external endpoint. Options exist for providing embeddings to the results or processing them as-is.&lt;/p&gt;&#xA;&lt;p&gt;Here is an example of configuring the Brave search engine.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_web_search_configuration.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Note that merely configuring web search does not mean the model uses it. It needs to be configured as both a capability and tool access.&lt;/p&gt;&#xA;&lt;h3 id=&#34;code-execution&#34;&gt;Code Execution&#xA;&lt;/h3&gt;&lt;p&gt;Before full privileged code generation and execution by LLMs became a standard feature, Open WebUI offered small-scale code execution inside chats, intended for data processing and data visualization with Python code.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Code Execution&lt;/code&gt; screen shows two different sections corresponding to individual features: Code Execution activates the selected interpreter instance, and the Code Interpreter toggle enables this capability for models. The settings dialog for both is very similar:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A feature toggle for activation or deactivation.&lt;/li&gt;&#xA;&lt;li&gt;The Python engine to be used, either &lt;a class=&#34;link&#34; href=&#34;https://pyodide.org/en/stable/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Pyodide&lt;/a&gt;, which executes WebAssembly directly in your browser, or a connection to a locally running Jupyter Notebook environment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;content-management&#34;&gt;Content Management&#xA;&lt;/h2&gt;&lt;h3 id=&#34;documents&#34;&gt;Documents&#xA;&lt;/h3&gt;&lt;p&gt;When a document is added to Open WebUI, e.g. by uploading it into a conversation or when maintaining a knowledge base, its content is parsed, chunked, and stored. The &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Documents&lt;/code&gt; page provides complex options for this process - here is a screenshot.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_document_management.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Configurable are the following aspects:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Extraction Engine: Choose from third-party OCR providers like &lt;a class=&#34;link&#34; href=&#34;https://www.datalab.to/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Datalab&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://docs.mistral.ai/studio-api/document-processing/basic_ocr&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Mistral OCR&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://github.com/PaddlePaddle/PaddleOCR&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;PaddleOCR&lt;/a&gt;, or configure self-hosted instances of &lt;a class=&#34;link&#34; href=&#34;https://tika.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Tika&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://github.com/docling-project/docling&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Docling&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://github.com/opendatalab/MinerU&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;MinerU&lt;/a&gt;. Instance-specific details, at least a URL and access token, need to be provided too.&lt;/li&gt;&#xA;&lt;li&gt;Text Splitting: Text can be split by character or token, and the chunk size and overlap can be configured. A toggle for splitting markdown headers is also configurable.&lt;/li&gt;&#xA;&lt;li&gt;Embedding Engine: The chunks are embedded, which means converted to a vector representation for better semantic search and retrieval. Different engines are configurable: the built-in &lt;a class=&#34;link&#34; href=&#34;https://www.sbert.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Sentence Transformers&lt;/a&gt; model, a connection to local &lt;a class=&#34;link&#34; href=&#34;https://docs.ollama.com/index&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ollama&lt;/a&gt;, or outbound connections to &lt;a class=&#34;link&#34; href=&#34;https://platform.openai.com/docs/api-reference/introduction&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenAI&lt;/a&gt; or &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/en-gb/azure/ai-services/openai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Azure OpenAI&lt;/a&gt;. The concrete embedding model offered by the connection needs to be defined. But take care: Changing the model invalidates all prior embeddings and starts a batch process to reindex all existing documents.&lt;/li&gt;&#xA;&lt;li&gt;Retrieval: During a conversation, relevant content from the documents is queried and added as context to the LLM. The amount and scope of retrieved documents can be controlled with several settings:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Full Context Mode&lt;/code&gt;: Instead of only sending the highest-probability chunks, the complete document is retrieved. Helpful when the documents themselves are small, and might lose relevance when only parts of them are processed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Hybrid Search&lt;/code&gt;: When enabled, the internally triggered search combines keyword and semantic search in its vector DB of embedded chunks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Reranking Batch Size&lt;/code&gt;: A technical setting that determines how many chunks are grouped together during a reranking of results.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Top K&lt;/code&gt;: The absolute number of chunks that are returned.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;RAG Template&lt;/code&gt;: The internal system prompt that the model uses to trigger a keyword or semantic search in the vector database.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;images&#34;&gt;Images&#xA;&lt;/h3&gt;&lt;p&gt;During a conversation, the intent to generate an image might occur. When configured, Open WebUI sends this request to the configured provider, not the base model of the chat, to generate the images.&lt;/p&gt;&#xA;&lt;p&gt;The configuration dialog at &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Image&lt;/code&gt; is separated into two sections for image generation and image editing, as shown in the following picture.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_image_generation_options.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Both sections follow the same set of required inputs:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A toggle to activate the feature.&lt;/li&gt;&#xA;&lt;li&gt;The image generation engine, which can be &lt;a class=&#34;link&#34; href=&#34;https://openai.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenAI&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.comfy.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ComfyUI&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://github.com/AUTOMATIC1111/stable-diffusion-webui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AUTOMATIC1111&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://ai.google.dev/gemini-api&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Gemini&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The base URL for the selected provider (upstream provider URL or local endpoint).&lt;/li&gt;&#xA;&lt;li&gt;An API key for authentication.&lt;/li&gt;&#xA;&lt;li&gt;The API version that is queried for the image generation or editing request.&lt;/li&gt;&#xA;&lt;li&gt;Additional parameters are passed as the request body to the configured model.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;user-management&#34;&gt;User Management&#xA;&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;Users&lt;/code&gt; section is a complete management interface. New users can be registered with their username, e-mail, and role. Accounts can be added via a pop-up menu or via CSV, which is convenient for large user bases.&lt;/p&gt;&#xA;&lt;p&gt;For existing users, their chats can be browsed, and a preview of their access rights to models, knowledge, and tools is shown. Their details can be modified, or the account can be deleted.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_user_management.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Other user settings are a bit hidden. In &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;General&lt;/code&gt;, the following options are presented:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User signup: Enable or disable new signups, and determine the default role and group for new users.&lt;/li&gt;&#xA;&lt;li&gt;Pending users: Following signup, users need to be accepted by another user with admin rights. Admin users see an overlay for pending users, which can be given a custom name and content. Also, the admin e-mail address might be shown to users so that they can contact the admin on their own.&lt;/li&gt;&#xA;&lt;li&gt;API keys: When this option is enabled, users can generate custom JWT access keys for opening Open WebUI&amp;rsquo;s internal API to external systems.&lt;/li&gt;&#xA;&lt;li&gt;LDAP: Instead of managing usernames and credentials inside the Open WebUI internal database, user accounts can also be gathered from a connected LDAP instance. Enabling this feature via its toggle shows a wealth of settings typically required for an LDAP setup.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_user_registration_settings.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;plugin-management&#34;&gt;Plugin Management&#xA;&lt;/h2&gt;&lt;p&gt;For extending Open WebUI, two mechanisms exist: Pipelines, now deprecated and not further explained here, and functions.&lt;/p&gt;&#xA;&lt;p&gt;The function management GUI, accessible via &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Functions&lt;/code&gt;, allows you to create, read, update, and delete configured functions.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_function_definition.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;A complete coverage of functions is outside the scope of this article, but the following overview gives a summary of their capabilities.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Actions: Implement additional buttons that are shown on the chat bubbles and provide additional functions, e.g. for adding a permission grant before code execution, turning text into an image or downloadable audio file, or creating visualizations.&lt;/li&gt;&#xA;&lt;li&gt;Filters: Modify messages before they are sent to the LLM, or intercept messages from an LLM to the user. Use cases are numerous: general content moderation, e.g. disallowing specific topics, masking personal information, detecting and blocking prompt injections, or rate limiting. Filters can be defined globally, then scoped to specific models, and either automatically applied or shown as a toggle button in chats for user-on-demand activation.&lt;/li&gt;&#xA;&lt;li&gt;Modify Model Outputs (Outlet Function): Adjust the AI&amp;rsquo;s response after it is processed, before showing it to the user. This can help refine, log, or adapt the data for a cleaner user experience.&lt;/li&gt;&#xA;&lt;li&gt;Pipes: When a user chat with a base model or custom model occurs, the back-and-forth of message passing between the chat interface and the LLM provider follows fixed steps. Pipes are an advanced concept that breaks down this fixed structure. They allow the definition of additional LLM providers, or, for that matter, wrap any other service to behave like an OpenAI API, and support custom orchestration between them. With this, intelligent model routing can be built based on the complexity of the conversation. Or imagine a chain of models along which LLM output is passed to validate and enrich an answer before it is passed to the user.&lt;/li&gt;&#xA;&lt;li&gt;Events: A new feature published with &lt;code&gt;Open WebUI v0.10.0&lt;/code&gt; allows code to run at any of 170 system events such as user login, model definition, chat creation, knowledge database update, and much more. This effectively opens the door to programming Open WebUI&amp;rsquo;s behavior, enabling automatic routines to be triggered.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;general-features--settings&#34;&gt;General Features &amp;amp; Settings&#xA;&lt;/h2&gt;&lt;h3 id=&#34;user-features&#34;&gt;User Features&#xA;&lt;/h3&gt;&lt;p&gt;In &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;General&lt;/code&gt;, at the bottom section, a host of general features can be configured.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_general_feature_configuration.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Most of them are tied to which features users have access to.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Enable Community Sharing: When active, users can export a conversation to the public community page. The granularity and visibility of this export are controlled by four different types: private, public, or public with full history.&lt;/li&gt;&#xA;&lt;li&gt;Enable Message Rating: This feature enables users to provide feedback to particular answers in a conversation. These ratings provide the basis for the earlier explained &lt;code&gt;evaluation&lt;/code&gt; feature.&lt;/li&gt;&#xA;&lt;li&gt;Folders: Allows users to structure their chats into folders, which helps keep ongoing conversations about different topics organized. A limit on the maximum files per user can be set up too.&lt;/li&gt;&#xA;&lt;li&gt;Calendar: Enables the user-specific calendar feature, allowing custom entries and programmable event scheduling to trigger automations.&lt;/li&gt;&#xA;&lt;li&gt;Automations: Automations allow users to trigger predefined instructions with a specific model, effectively starting an asynchronous chat. The toggle enables this feature.&lt;/li&gt;&#xA;&lt;li&gt;User Webhooks: Webhooks are meant to inform external systems about an event. For users, only one type of event is documented: the completion of a &lt;code&gt;chat_response&lt;/code&gt;. The event payload includes the chat ID, title, and last_message. It only triggers for asynchronous, not interactive, user chats.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Additional beta features can be configured too:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Memories: Enables long-term storage of user-specific facts that are injected into each conversation. It is meant for customizing the chat experience and keeps track of personalization, like the preferred user name or conversation tone, and processes recommendations for complex tasks.&lt;/li&gt;&#xA;&lt;li&gt;Notes: This user feature allows custom text notes to be created and used in chats. It needs to be enabled by the admin.&lt;/li&gt;&#xA;&lt;li&gt;Channels: This novel feature changes conversation completely. Instead of 1:1 chats between users and an agent, multiple users can join a conversation space, and multiple models can be attached and called. Also see the official documentation about &lt;a class=&#34;link&#34; href=&#34;https://docs.openwebui.com/features/channels/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Channels&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;interface-settings&#34;&gt;Interface Settings&#xA;&lt;/h3&gt;&lt;p&gt;In &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;General&lt;/code&gt;, following interface settings are exposed.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User Status: This toggle enables active reporting of user status, showing which users are logged in and using the Open WebUI instance.&lt;/li&gt;&#xA;&lt;li&gt;Response Watermark: In this field, a custom text can be entered, which is appended to each system message, visibly in user chats.&lt;/li&gt;&#xA;&lt;li&gt;Banners: From time to time, general information for large user bases needs to be shown, for example announcing updates or LLM model deprecations. This feature lets the admin user configure such a banner, which other users can see once they log into the system.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;system-settings&#34;&gt;System Settings&#xA;&lt;/h3&gt;&lt;p&gt;The admin user can configure externally visible URLs via &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;General&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;WebUI URL: When the Open WebUI instance generates events, it includes its public URL string from this field.&lt;/li&gt;&#xA;&lt;li&gt;Webhook URL: Defines the external WebHook API endpoint to which all system events are sent.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;conversation-features&#34;&gt;Conversation Features&#xA;&lt;/h3&gt;&lt;p&gt;Open WebUI generates background tasks for generating the conversation title, follow-up questions, tags, RAG, and web search queries.&lt;/p&gt;&#xA;&lt;p&gt;In &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Interface&lt;/code&gt;, these tasks can be enabled or disabled, the used model determined (defaulting to the selected model, but can be a fixed light model for cost savings), and open prompt overrides configured.&lt;/p&gt;&#xA;&lt;p&gt;Also, prompts for autocompletion and tool function calling can be defined, which can be helpful when tool calls are not generated or properly executed.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_interface_settings.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;speech-settings&#34;&gt;Speech Settings&#xA;&lt;/h3&gt;&lt;p&gt;In &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Audio&lt;/code&gt;, several aspects of &lt;code&gt;Speech-to-Text&lt;/code&gt; and &lt;code&gt;Text-to-Speech&lt;/code&gt; become configurable.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Supported MIME Types: Determines which media MIME types are supported, which means which audio files can be dropped into a chat bubble. The default configuration allows all &lt;code&gt;audio/*&lt;/code&gt; and the &lt;code&gt;video/webm&lt;/code&gt; format.&lt;/li&gt;&#xA;&lt;li&gt;Speech-to-Text Engine: Determines the backend service to generate text, which is either: a) Web API, the browser internal engine, b) a local Whisper model, or c) an external provider from &lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/api/docs/guides/speech-to-text&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenAI&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://deepgram.com/product/speech-to-text&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Deepgram&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/azure/ai-services/speech-service/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Azure AI Speech&lt;/a&gt;, or &lt;a class=&#34;link&#34; href=&#34;https://docs.mistral.ai/studio-api/audio/speech_to_text&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Mistral AI&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Text-to-Speech Engine: The backend service for generating speech, with these options: a) Web API, which is browser internal, b) Transformers (local), which connects to local models published at &lt;a class=&#34;link&#34; href=&#34;https://github.com/microsoft/SpeechT5&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;SpeechT5&lt;/a&gt;, or c) one of the external providers &lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/api/docs/guides/text-to-speech&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenAI&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://elevenlabs.io/docs/overview/capabilities/text-to-speech&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ElevenLabs&lt;/a&gt;, and &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/en-us/azure/ai-services/speech-service/index-text-to-speech&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Azure AI Speech&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Response Splitting: Configure how natural language pauses are recognized in the source material.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm40_audio_settings.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;operations&#34;&gt;Operations&#xA;&lt;/h2&gt;&lt;h3 id=&#34;database-backup&#34;&gt;Database Backup&#xA;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;Settings&lt;/code&gt; =&amp;gt; &lt;code&gt;Database&lt;/code&gt; dialog is intended for storing or importing the configuration database or settings. Specifically, it offers the following functions:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Configuration: All configuration options are represented in JSON format. The existing configuration can be exported, e.g. to make a permanent backup, and imported. Here is a small excerpt from such a file.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ui&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enable_signup&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enable&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;api_base_urls&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.openai.com/v1&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://api.openai.com/v1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;models&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;base_models_cache&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;rag&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;embedding_engine&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;embedding_model&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sentence-transformers/all-MiniLM-L6-v2&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;embedding_batch_size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enable_async_embedding&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;embedding_concurrent_requests&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;google_drive&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enable&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;onedrive&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enable&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;terminal_server&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;connections&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;6351ac6b-cb9e-48d3-bf87-d64da77f93ff&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://open-webui-terminal:8000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;tool_server&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;connections&amp;#34;&lt;/span&gt;: []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Database: Exports the internal database that contains the following items:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User accounts and authentication data.&lt;/li&gt;&#xA;&lt;li&gt;Chat history and conversation metadata.&lt;/li&gt;&#xA;&lt;li&gt;App settings and configuration (similar to the JSON export).&lt;/li&gt;&#xA;&lt;li&gt;Model/config entries.&lt;/li&gt;&#xA;&lt;li&gt;File-related records and other system state.&lt;/li&gt;&#xA;&lt;li&gt;RAG-related non-vector metadata.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Chats: Exports a JSON document with all chats. Here is a small excerpt.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;88dfd8b0-6758-45d9-bf00-bdc540b2253e&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;user_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Daily News Check&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;chat&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Daily News Check&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;models&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;history&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;currentId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;4f914f3d-b089-4563-b139-d2562b1d3ad8&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;messages&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;b8051ec5-fa8b-4945-8401-7c5619066d78&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b8051ec5-fa8b-4945-8401-7c5619066d78&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parentId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Check the Daily News, write a summary.&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;childrenIds&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;4f914f3d-b089-4563-b139-d2562b1d3ad8&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1784888705&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;models&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;version-information&#34;&gt;Version Information&#xA;&lt;/h3&gt;&lt;p&gt;In &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;General&lt;/code&gt;, at the top of various other options, the current version, banners for accessing the project&amp;rsquo;s Discord server, social media presence, and GitHub repo are shown.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;Open WebUI is a highly customizable, multi-provider chat interface. This article explored all settings that the admin user can configure, typically global defaults that other users consume or further customize. You learned about these features: a) model management, b) model capabilities, c) content management, d) user management, e) plugin management, f) General Features &amp;amp; Settings, and g) Operations.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Open WebUI: Complete Guide to User Settings</title>
            <link>https://admantium.com/blog/llm39_open_webui_user_configuration/</link>
            <pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://admantium.com/blog/llm39_open_webui_user_configuration/</guid>
            <description>&lt;!-- META&#xA;  STARTED 2026-06-21&#xA;  FINISHED 2026-06-27&#xA;  REFINED 2026-07-10&#xA;--&gt;&#xA;&lt;p&gt;Open WebUI is one of the first chat interfaces that evolved around LLMs. Initially designed to work with local Ollama models only, it has since evolved to support any OpenAI API-compatible endpoint. With the addition of skills, tools, memory, and the recent ability to execute code with the terminal connection, all features for defining agents are present.&lt;/p&gt;&#xA;&lt;p&gt;In this blog series, all Open WebUI aspects, from setup to configuration and utilization, are covered. This article explores all user features and settings. Learn about custom model definition, automations, the model playground, and various GUI and model-calling settings.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;The technical context of this article is &lt;code&gt;Open WebUI v0.9.6&lt;/code&gt;, published on 2026-06-01. The setup and configuration examples should also work with newer versions.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;While I am fascinated by the capabilities of artificial intelligence tools and applications, crafting blog articles remains my personal skill. Every character, number, and symbol in this article was typed manually, with the exception of verbatim copies from log messages and screenshots.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;user-settings-entrypoint&#34;&gt;User Settings Entrypoint&#xA;&lt;/h2&gt;&lt;p&gt;The main window of Open WebUI presents a chat interface, a list of past chats, and search capabilities. When clicking on the user icon, a popup is shown, which renders several user features, depicted by &lt;code&gt;1&lt;/code&gt;, and an option to open user settings, depicted by &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_gui_sections.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Each setting group is explored in the next sections.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Note: In an early draft of this article, all features or settings were listed in the order that they appear in the menu. However, grouping them helps to better understand their context.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;user-features&#34;&gt;User Features&#xA;&lt;/h2&gt;&lt;p&gt;Customizable user features determine the extent of functions available in chats. They can be grouped into four sections.&lt;/p&gt;&#xA;&lt;h3 id=&#34;information-and-reflection&#34;&gt;Information and Reflection&#xA;&lt;/h3&gt;&lt;h4 id=&#34;archived-chats&#34;&gt;Archived Chats&#xA;&lt;/h4&gt;&lt;p&gt;Chats in the &amp;ldquo;Folder&amp;rdquo; sections or under the &amp;ldquo;Chats&amp;rdquo; section can be archived. This option shows all archived chats, from which they can be restored, exported, or permanently deleted.&lt;/p&gt;&#xA;&lt;h4 id=&#34;documentation&#34;&gt;Documentation&#xA;&lt;/h4&gt;&lt;p&gt;This menu entry is a direct link to the documentation page &lt;a class=&#34;link&#34; href=&#34;https://docs.openwebui.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;docs.openwebui.com&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;releases&#34;&gt;Releases&#xA;&lt;/h4&gt;&lt;p&gt;Similarly, this opens the GitHub releases page with details of all &lt;a class=&#34;link&#34; href=&#34;https://github.com/open-webui/openwebui/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Open WebUI releases&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;keyboard-shortcuts&#34;&gt;Keyboard Shortcuts&#xA;&lt;/h4&gt;&lt;p&gt;Displays a graphical overview of all defined keyboard shortcuts.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_keyboard_shortcuts.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;personal-documents&#34;&gt;Personal Documents&#xA;&lt;/h3&gt;&lt;h4 id=&#34;notes&#34;&gt;Notes&#xA;&lt;/h4&gt;&lt;p&gt;Opens a list of all stored notes and allows editing or creating notes with a text editor. This feature was extensively covered in my previous article about &lt;a class=&#34;link&#34; href=&#34;https://admantium.com/blog/llm38_open_webui_chat_features/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Open WebUI features&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;calendar&#34;&gt;Calendar&#xA;&lt;/h4&gt;&lt;p&gt;Renders a browsable calendar in which events can be scheduled. Calendars can be shared between users, and model access can be enabled. Based on current findings, the calendar data remains disconnected from other calendar platforms, requiring duplication of content.&lt;/p&gt;&#xA;&lt;p&gt;Here is an overview of a calendar with scheduled automations.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_calendar_with_automations.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;model-customization&#34;&gt;Model Customization&#xA;&lt;/h3&gt;&lt;h4 id=&#34;workspace&#34;&gt;Workspace&#xA;&lt;/h4&gt;&lt;p&gt;This rather misnomered menu exposes all options to define custom models that can be used for chats or even agentic use. It shows vertical menus that allow the customization of these aspects:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Models: Provides a full list of all defined models by the configured model provider, and allows you to customize them or define your own models that use a base model. Each model can have custom system prompts, tools, skills, and capabilities.&lt;/li&gt;&#xA;&lt;li&gt;Knowledge: This section manages individual collections of documents termed knowledge bases. Each should have a definite name, description, and then a set of text, PDF, or CSV documents. Uploads are parsed automatically and vectorized so that they can be used as context for a model.&lt;/li&gt;&#xA;&lt;li&gt;Prompts: Manage reusable prompts that serve as a strong context for an LLM. The menu allows users to add, edit, and even browse prompts for the community, which can be imported too. In Open WebUI, prompts are invoked by a preceding &lt;code&gt;/&lt;/code&gt;.&#xA;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_prompts.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/li&gt;&#xA;&lt;li&gt;Skills: Precise instructions, typically in the form of how to break down a complex goal into individual tasks. The GUI for this element allows the same CRUD operations as the others. To invoke them, the &lt;code&gt;$&lt;/code&gt; prefix needs to be used.&lt;/li&gt;&#xA;&lt;li&gt;Tools: Python snippets with a predefined structure that can be invoked by the Open WebUI server directly. Since they run with the current user permissions, tools should be checked rigorously to ensure that they work as intended. Tools extend the capabilities of an LLM, and when used, Open WebUI injects tool definitions so that a sufficiently modern LLM can issue tool calls automatically, which Open WebUI executes.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;model-utilization&#34;&gt;Model Utilization&#xA;&lt;/h3&gt;&lt;h4 id=&#34;automations&#34;&gt;Automations&#xA;&lt;/h4&gt;&lt;p&gt;Automations are chat messages triggered at a specified time or interval. An automation includes instructions, a model (and therefore custom prompts, skills, and tools), and optionally a terminal server where code can be executed. Automation runs result in the same chat structure as user chats.&lt;/p&gt;&#xA;&lt;h4 id=&#34;playground&#34;&gt;Playground&#xA;&lt;/h4&gt;&lt;p&gt;An admin-only feature that allows experimentation with how different system prompts affect models. When using an Ollama backend, model parameter calls can also be adjusted. Advanced features such as tool calls or providing chat context from external sources are not supported.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_playground.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;user-settings&#34;&gt;User Settings&#xA;&lt;/h2&gt;&lt;p&gt;User settings are displayed as a popup overlay. A list of settings and a search bar appear on the left, while the configuration panel for the selected option appears on the right.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/agent05_user_settings.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Options are extensive and are explained in their individual sections.&lt;/p&gt;&#xA;&lt;h3 id=&#34;account-settings&#34;&gt;Account Settings&#xA;&lt;/h3&gt;&lt;p&gt;In the &lt;code&gt;Account&lt;/code&gt; group, customization like name, user icon, background information, birth date, and the ability to change the login password are provided.&lt;/p&gt;&#xA;&lt;h3 id=&#34;gui--interface-settings&#34;&gt;GUI &amp;amp; Interface Settings&#xA;&lt;/h3&gt;&lt;p&gt;Several different sections contribute to this group.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;General&lt;/code&gt; section allows a mixed set of configuration options. Related to the GUI are the theme, the language, and whether to show notifications or not.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;code&gt;Interface&lt;/code&gt; section, a large number of options are rendered.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;UI &amp;amp; Notifications: Scale, notification sounds, and haptic feedback options when Open WebUI is accessed on mobile phones.&lt;/li&gt;&#xA;&lt;li&gt;Chat: Chat bubble design, custom background, fading effect for streaming tokens, markdown formatting, quick action buttons.&lt;/li&gt;&#xA;&lt;li&gt;Chat automation: Title generation, follow-up generation, tag generation.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here is an example of a custom chat interface with a changed background image:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_chat_window_custom_background.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;Audio&lt;/code&gt; menu item handles how speech-to-text and text-to-speech are handled. For speech-to-text, the default engine is a local Whisper model, and for text-to-speech, the community project &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/kokoro-js?activeTab=versions&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kokoro.js&lt;/a&gt; can be used. For readout, different voice sets can be selected.&lt;/p&gt;&#xA;&lt;h3 id=&#34;model-settings&#34;&gt;Model Settings&#xA;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;General&lt;/code&gt; section also exposes two settings that apply to all model invocations. First, a system prompt override can be configured, prepending any conversation. Second, several parameters for calling models can be defined, such as &lt;code&gt;temperature&lt;/code&gt; (randomness factor), &lt;code&gt;top_k&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, &lt;code&gt;min_p&lt;/code&gt; (to influence token likelihood), and others. They are forwarded completely in API calls to a locally connected Ollama instance, and some of them are also used for configured OpenAI API connections, given that the provider accepts them.&lt;/p&gt;&#xA;&lt;p&gt;Here is a screenshot of the available settings.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_advanced_parameters.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Additionally, the &lt;code&gt;Personalization&lt;/code&gt; setting features only one entry: Memory. Flagged as an experimental feature, these are user-specific facts that serve as permanent context for all invocations. It supplements conversation history and other context sources. By default, they need to be added manually. When advanced models capable of function calling are used, they may gain access to the memory tool.&lt;/p&gt;&#xA;&lt;h3 id=&#34;tools&#34;&gt;Tools&#xA;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;Integrations&lt;/code&gt; section allows user chats to access external systems. Two specific categories exist.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Manage Tool Server: Connect to OpenAPI-compatible tool servers, which integrate external system access and content. Implementations need to follow specific framework definitions implemented in Python. See, for example, the &lt;a class=&#34;link&#34; href=&#34;https://github.com/open-webui/openapi-servers/tree/main/servers/sql&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;SQL server&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Open Terminal: Connect to a Docker container that serves as a sandbox for file access and code execution. It is a specific custom Docker image prepared by Open WebUI, with a curated set of tools. See the official GitHub repository &lt;a class=&#34;link&#34; href=&#34;https://github.com/open-webui/open-terminal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;open-terminal&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;information--reflection&#34;&gt;Information &amp;amp; Reflection&#xA;&lt;/h3&gt;&lt;p&gt;In &lt;code&gt;Data Controls&lt;/code&gt;, broad import and export functions for chats are exposed. Also, archived and starred chats can be managed, which renders a list of items that can be restored or permanently deleted. Likewise, all uploaded images or files can be seen and optionally deleted.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_file_manager.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;About&lt;/code&gt; section shows information and badges to access the Discord, X, and GitHub accounts of Open WebUI.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm39_about_dialog.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;Open WebUI evolved from local Ollama to a multi-provider OpenAI API connection with full customization of the chat experience, including custom models, tools, skills, and local documents. This article explored the many user features and settings. You learned about four different user feature groups: a) Information and Reflection to access archived chats, documentation, releases, and keyboard shortcuts, b) Personal Documents to browse notes and a built-in calendar, c) Model Customization with base models, knowledge bases, prompts, tools, and skills, and d) Model Utilization, in which a playground for non-stored interactions and automations are provided. The user settings can be grouped into a) Account, b) GUI and Interface, c) Model, including parameters like a model&amp;rsquo;s temperature or token likelihood values, d) Integrations that connect to tool servers or a terminal, a custom Docker container in which arbitrary code can be executed, and e) Information, with access to archived chats, files, and images, and general release information.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Open WebUI: Chat Interface &amp; Context Options</title>
            <link>https://admantium.com/blog/llm38_open_webui_chat_features/</link>
            <pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://admantium.com/blog/llm38_open_webui_chat_features/</guid>
            <description>&lt;!-- META&#xA;  STARTED 2026-06-20&#xA;  FINISHED 2026-06-21&#xA;--&gt;&#xA;&lt;p&gt;Open WebUI is one of the first tools that appeared in conjunction with Large Language Models. Initially intended as a tool for chatting with a connected local Ollama instance, it evolved to work with any OpenAI API provider and succinctly extended its features to support agentic chats.&lt;/p&gt;&#xA;&lt;p&gt;Following the setup of Open WebUI in my previous post, this article explores its core features. Learn about conversation essentials, see how notes and knowledge bases are created, and understand the different options to provide chat context.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;The technical context of this article is &lt;code&gt;openwebui v0.9.6&lt;/code&gt;, published on 2026-06-01. The setup and configuration examples should also work with newer versions.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;While I am fascinated by the capabilities of artificial intelligence tools and applications, crafting blog articles remains my personal skill. Every character, number, and symbol in this article was typed manually, with the exception of verbatim copies from log messages and screenshots.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;open-webui-startpage&#34;&gt;Open WebUI Startpage&#xA;&lt;/h2&gt;&lt;p&gt;Open WebUI&amp;rsquo;s start page shows organizational features in the menu list on the left side, and a chat interface to start a new conversation on the right side.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm38_startpage.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;In this view, the following options can be accessed:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;New Chat: Reloads the current window with a new chat on the right panel side&lt;/li&gt;&#xA;&lt;li&gt;Search: Searches for keywords in past conversations and also allows starting a new conversation or creating a new node&lt;/li&gt;&#xA;&lt;li&gt;Notes: Create markdown-structured files that serve as structural content for your conversations&lt;/li&gt;&#xA;&lt;li&gt;Workspace: Create customized models with a base model, prompts, tools, and knowledge bases&lt;/li&gt;&#xA;&lt;li&gt;Folders: Structure individual chats into topics by either clicking on a folder and starting a new chat or by dragging and dropping an existing chat into the folder&lt;/li&gt;&#xA;&lt;li&gt;Chats: A list of past interactions&lt;/li&gt;&#xA;&lt;li&gt;User Icon: Access additional settings specific to the user&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Features related to the chat interface are explored in the next sections.&lt;/p&gt;&#xA;&lt;h2 id=&#34;basic-chat-features&#34;&gt;Basic Chat Features&#xA;&lt;/h2&gt;&lt;p&gt;Chatting is the core user interaction feature of Open WebUI. As it has become a de facto standard, chat bubbles from the user and model are displayed top-down, right- and left-aligned respectively. For the latest model answer, all interaction icons are shown, as well as a list of follow-up prompts.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm38_main_chat_window.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;When hovering over a user chat bubble, the following functions are shown:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Edit: Changes the content of the message but does not trigger a new answer generation from the model&lt;/li&gt;&#xA;&lt;li&gt;Copy: Puts the message content into the computer&amp;rsquo;s clipboard&lt;/li&gt;&#xA;&lt;li&gt;Delete: Deletes this message and the immediately following LLM answer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The model answer bubble offer these features:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Edit: Opens an inline editor to modify the LLM answer and, when saved, persists this answer to the internal chat log&lt;/li&gt;&#xA;&lt;li&gt;Copy: Copies the complete message, including its formatting, to the computer&amp;rsquo;s memory&lt;/li&gt;&#xA;&lt;li&gt;Read aloud: Starts the browser&amp;rsquo;s text-to-speech integration to read the answer&lt;/li&gt;&#xA;&lt;li&gt;Good Response &amp;amp; Bad Response: Rate a particular LLM answer, see below for an explanation&lt;/li&gt;&#xA;&lt;li&gt;Continue Response: Sends the user message and the assistant message again, which can extend the original answer&lt;/li&gt;&#xA;&lt;li&gt;Regenerate: Recreates the selected answer by passing all previous conversation context to the LLM again once completed, the new answer is shown to the user and saved in the conversation history&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;An interesting feature is the option to rate the answer, called &amp;ldquo;Good Response&amp;rdquo; and &amp;ldquo;Bad Response&amp;rdquo;. When clicked, a dialog is opened at the top of the screen where a numerical rating and a short tag can be provided. This data is stored in your Open WebUI instance, and admin users can access analytics and evaluation dashboards that factor in these answers. Ratings are useful for a large user base and model availability, helping to determine which models are perceived as most helpful for their intended tasks. Here is a screenshot for rating an unhelpful answer.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm38_unhelpfull_answer_rating.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Additionally to storing locally, you can also add a public review of this model which is published on the &lt;a class=&#34;link&#34; href=&#34;https://openwebui.com/models&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Open WebUI model rating page&lt;/a&gt;, where you can provide a review for this specific model.&lt;/p&gt;&#xA;&lt;h2 id=&#34;notes&#34;&gt;Notes&#xA;&lt;/h2&gt;&lt;p&gt;Notes are named files stored internally in your Open WebUI instance.&lt;/p&gt;&#xA;&lt;p&gt;The notes menu shows a list of browsable and searchable notes, and you can add a new note or open an existing one.&lt;/p&gt;&#xA;&lt;p&gt;The note editor provides standard text formatting including headings, lists, tasks, bold and italic fonts, and code blocks. Note content can be recorded from an audio message, and a model can be invoked to edit the content directly. The complete note can also be exported to other formats and even a link can be generated. Here is a screenshot.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm38_note_editor.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Notes can be used in chats in three different ways: a) directly in the note editor, you can start a chat with the note, b) in a chat by adding the note, c) when an advanced feature called terminal - a separate runtime in which code can be executed - is available, tool calls like &lt;code&gt;search_notes&lt;/code&gt; or &lt;code&gt;write_note&lt;/code&gt; can access notes dynamically.&lt;/p&gt;&#xA;&lt;h2 id=&#34;workspace-knowledge&#34;&gt;Workspace Knowledge&#xA;&lt;/h2&gt;&lt;p&gt;Workspaces are a powerful feature that governs support for agentic usage. In the context of this article, only knowledge bases as context to chats are explored.&lt;/p&gt;&#xA;&lt;p&gt;Follow these steps:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In the main GUI click on &lt;code&gt;Workspace&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;In the horizontal menu area click on Knowledge and then on the button &lt;code&gt;+ New Knowledge&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Fill in the following form then click on &lt;code&gt;Create Knowledge&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This results in a new screen showing a list of sources. With the &lt;code&gt;+&lt;/code&gt; symbol, the knowledge base can be edited.&lt;/p&gt;&#xA;&lt;p&gt;New original resources can be added with these options:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Upload files: Upload files from your computer supporting text documents PDF DOC and CSV files but not images&lt;/li&gt;&#xA;&lt;li&gt;Upload directory: Select a local directory which triggers individual file uploads for all of its contained and supported files&lt;/li&gt;&#xA;&lt;li&gt;Add webpage: Process the provided HTTP resource extract its text content and store it note be sure to add an address for which no HTTP redirect occurs or otherwise the redirect information will be stored instead&lt;/li&gt;&#xA;&lt;li&gt;Add text content: This option opens an editor field into which you can paste any text information&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The structure and content of the knowledge base can be altered as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;New directory: Create a logical node to help structure documents&lt;/li&gt;&#xA;&lt;li&gt;Sync directory: Rescans an uploaded directory which removes any files from the knowledge base that are no longer present and adds all new or modified sources&lt;/li&gt;&#xA;&lt;li&gt;Reset: Completely deletes all stored content from the knowledge base&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;When documents are added to the knowledge base, the same process is triggered: text is extracted from the sources, split into content chunks, processed by an embedding model, and stored in an internal database.&lt;/p&gt;&#xA;&lt;p&gt;Here is a screenshot of a knowledge base that includes my blog articles about Claude Code.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm38_knowledge_base_list.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;providing-chat-context&#34;&gt;Providing Chat Context&#xA;&lt;/h2&gt;&lt;p&gt;Open WebUI offers several options to provide context to your chat interactions.&lt;/p&gt;&#xA;&lt;p&gt;Here is a screenshot where a note is already attached and additional sources can be added.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm38_attaching_notes_to_chats.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;original-documents&#34;&gt;Original Documents&#xA;&lt;/h3&gt;&lt;p&gt;New information is injected into the conversation as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Upload files: Supported documents are parsed and their full content attached to the next message&lt;/li&gt;&#xA;&lt;li&gt;Capture: Opens the browser&amp;rsquo;s function to make a screenshot of specific windows or the entire screen&lt;/li&gt;&#xA;&lt;li&gt;Attach Webpage: Provide an HTTP link as a document source from which plain text information will be obtained and added to the message sent to the LLM endpoint&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Two aspects should be noted:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Automatic embedding: Open WebUI automatically detects the data format determines token splitting and embedding for text processes and stores these files This results in typical log messages as shown&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:49.769+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;192.168.65.1:45505 - \&amp;#34;POST /api/v1/files/?process=true HTTP/1.1\&amp;#34; 200&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uvicorn.protocols.http.httptools_impl:send:483&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:51.487+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;192.168.65.1:45505 - \&amp;#34;GET /api/v1/files/db47a1a8-3f19-4a5c-afcd-1cdb056306c1/process/status?stream=true HTTP/1.1\&amp;#34; 200&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uvicorn.protocols.http.httptools_impl:send:483&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:51.518+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Using markdown header text splitter&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.routers.retrieval:save_docs_to_vector_db:1412&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:51.521+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;generating embeddings for file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.routers.retrieval:save_docs_to_vector_db:1490&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;Batches:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;%|██████████|&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;02&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;00&lt;/span&gt;,  &lt;span style=&#34;color:#ae81ff&#34;&gt;7.88&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;it/s&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:53.569+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;embeddings generated 16 for 16 items&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.routers.retrieval:save_docs_to_vector_db:1536&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:53.570+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;adding to collection file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.routers.retrieval:save_docs_to_vector_db:1548&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:53.840+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;added 16 items to collection file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.routers.retrieval:save_docs_to_vector_db:1554&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:16:53.840+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;added 1 items to collection file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.routers.retrieval:process_file:1730&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Session specificity: Documents are used for one turn in the chat conversation only meaning one message to and from the LLM Later user messages cannot implicitly reference an already added document from earlier messages However Open WebUI itself can query uploaded documents and extract relevant content Here is an example log message where I uploaded a blog article and asked about its content&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;open-webui&lt;/span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&lt;/span&gt; {&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-06-21T08:34:27.873+00:00&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;level&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;info&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;query_doc:result [[&amp;#39;1c2776cd-b009-4d43-b20e-7f400b31269d&amp;#39;, &amp;#39;08ea65ce-4c62-42f0-a897-6d2cbc0e2bd1&amp;#39;, &amp;#39;ae5f230c-ad8b-41a2-8d43-eaeedd75db99&amp;#39;]] [[{&amp;#39;source&amp;#39;: &amp;#39;claude01_introduction.md&amp;#39;, &amp;#39;start_index&amp;#39;: 2434, &amp;#39;hash&amp;#39;: &amp;#39;3e1955b782967e3d3ba5eed557e3c6a1de1b7c930b8267bd8ad76c122d5834c6&amp;#39;, &amp;#39;file_id&amp;#39;: &amp;#39;db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#39;, &amp;#39;embedding_config&amp;#39;: \&amp;#34;{&amp;#39;engine&amp;#39;: &amp;#39;&amp;#39;, &amp;#39;model&amp;#39;: &amp;#39;sentence-transformers/all-MiniLM-L6-v2&amp;#39;}\&amp;#34;, &amp;#39;created_by&amp;#39;: &amp;#39;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&amp;#39;, &amp;#39;name&amp;#39;: &amp;#39;claude01_introduction.md&amp;#39;}, {&amp;#39;embedding_config&amp;#39;: \&amp;#34;{&amp;#39;engine&amp;#39;: &amp;#39;&amp;#39;, &amp;#39;model&amp;#39;: &amp;#39;sentence-transformers/all-MiniLM-L6-v2&amp;#39;}\&amp;#34;, &amp;#39;created_by&amp;#39;: &amp;#39;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&amp;#39;, &amp;#39;source&amp;#39;: &amp;#39;claude01_introduction.md&amp;#39;, &amp;#39;start_index&amp;#39;: 1753, &amp;#39;name&amp;#39;: &amp;#39;claude01_introduction.md&amp;#39;, &amp;#39;file_id&amp;#39;: &amp;#39;db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#39;, &amp;#39;hash&amp;#39;: &amp;#39;3e1955b782967e3d3ba5eed557e3c6a1de1b7c930b8267bd8ad76c122d5834c6&amp;#39;}, {&amp;#39;hash&amp;#39;: &amp;#39;3e1955b782967e3d3ba5eed557e3c6a1de1b7c930b8267bd8ad76c122d5834c6&amp;#39;, &amp;#39;file_id&amp;#39;: &amp;#39;db47a1a8-3f19-4a5c-afcd-1cdb056306c1&amp;#39;, &amp;#39;embedding_config&amp;#39;: \&amp;#34;{&amp;#39;engine&amp;#39;: &amp;#39;&amp;#39;, &amp;#39;model&amp;#39;: &amp;#39;sentence-transformers/all-MiniLM-L6-v2&amp;#39;}\&amp;#34;, &amp;#39;start_index&amp;#39;: 721, &amp;#39;created_by&amp;#39;: &amp;#39;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&amp;#39;, &amp;#39;source&amp;#39;: &amp;#39;claude01_introduction.md&amp;#39;, &amp;#39;name&amp;#39;: &amp;#39;claude01_introduction.md&amp;#39;}]]&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;open_webui.retrieval.utils:query_doc:285&amp;#34;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;stored-documents-and-knowledge-base&#34;&gt;Stored Documents and Knowledge Base&#xA;&lt;/h3&gt;&lt;p&gt;When adding existing information, several types of documents can be used:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Attach Files: When a user uploads any file, it will be stored in a user specific file instance and therefore can be attached again in any following chat&#xA;&lt;a class=&#34;link&#34; href=&#34;https://admantium.com/images/blog/llm38_reference_uploaded_files.png&#34; &gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Attach Notes: Choose from any created note that is added as message context&lt;/li&gt;&#xA;&lt;li&gt;Attach Knowledge: Attach the complete knowledge database from a workspace&lt;/li&gt;&#xA;&lt;li&gt;Reference Chats: Add a complete conversation as context It includes all user messages system messages and any other added context&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;Open WebUI is one of the first tools that offered a chat interface to LLMs. This article explored its core features. You learned about, a) the start page, b) the main chat features for user and system messages, including editing, reading, regenerating and rating answers, c) how to create individual note files or d) complete document collections called knowledge bases, which can include different document types or web pages, and e) providing chat context with original documents and already uploaded document notes or knowledge bases.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>LLM Agent Tools: Setup &amp; Installation of OpenWeb UI</title>
            <link>https://admantium.com/blog/llm37_open_webui_setup/</link>
            <pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://admantium.com/blog/llm37_open_webui_setup/</guid>
            <description>&lt;!-- META&#xA;  STARTED 2026-06-14&#xA;  FINISHED 2026-06-19&#xA;--&gt;&#xA;&lt;p&gt;LLMs are a fascinating technology. Trained on a sufficient subset of the public internet and other curated sources, they are knowledge experts in many fields. Chat interfaces for LLMs have become a daily helper for many knowledge workers. Step by step, agent capabilities are driving the evolution of these interfaces.&lt;/p&gt;&#xA;&lt;p&gt;In an ongoing series about agentic tools, capabilities, and technical components, the next articles focus on Open WebUI. This article is concerned with the initial setup - you will learn how to install and run a Docker container, and see how to connect with an LLM provider to start chatting.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;The technical context of this article is &lt;code&gt;openwebui v0.9.6&lt;/code&gt;, published on 2026-06-01. The setup and configuration examples should also work with newer versions.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;While I am fascinated by the capabilities of artificial intelligence tools and applications, crafting blog articles remains my personal skill. Every character, number, and symbol in this article was typed manually, with the exception of verbose copies from log messages and screenshots.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;setup&#34;&gt;Setup&#xA;&lt;/h2&gt;&lt;p&gt;Any software needs the required libraries in specific versions. To avoid cluttering one’s own system, container-based software can be used instead. Each container provides a separate environment, and it exposes its services via defined ports. Docker is the primary tool for starting containers, and it is the tool of choice for setting up agentic tools in the context of this article.&lt;/p&gt;&#xA;&lt;p&gt;For Open WebUI, complete Docker containers for all releases are published automatically. Check the available tags, then download the required container. For &lt;code&gt;v0.9.6&lt;/code&gt;, execute the following command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull ghcr.io/open-webui/open-webui:v0.9.6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once the image is downloaded, it can be started with a simple follow-up command. If you want to try Open WebUI with the default config, simply run the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:v0.9.6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then access the application at &lt;code&gt;http://localhost:3000&lt;/code&gt; and start configuring the admin account. While you can use the container as-is, its state will not be persisted. When the Docker daemon of your host system is restarted, all data in the container is lost. The recommended approach is to define a &lt;code&gt;docker-compose.yml&lt;/code&gt; file, which tracks the applied configuration options and also persists the created data as a volume.&lt;/p&gt;&#xA;&lt;h2 id=&#34;docker-compose-configuration&#34;&gt;Docker Compose Configuration&#xA;&lt;/h2&gt;&lt;p&gt;Open WebUI exposes several configuration options. To keep the state persistent, it should be started with a config file to define aspects like its users and LLM configuration. It should also have a volume in which all permanent data is stored so it survives container restarts.&lt;/p&gt;&#xA;&lt;p&gt;Create the following file structure:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── docker-compose.yml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── .open-webui.env&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Use the following template for the &lt;code&gt;docker-compose.yml&lt;/code&gt; file as a kickstart.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;openwebui&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;open-webui&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ghcr.io/open-webui/open-webui:v0.9.6&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;open-webui&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;env_file&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./open-webui.env&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3000:8080&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;open-webui-data:/app/backend/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;openwebui&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;openwebui&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;openwebui&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;external&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;open-webui-data&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;open-webui-data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;driver&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;local&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, add the following &lt;code&gt;.open-webui.env&lt;/code&gt; file with a minimal configuration:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;OPENWEBUI_PORT&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;3000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Only once, you need to run the following command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network create openwebui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then start the container with the following command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose up open-webui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should print these log messages, indicating a successful initial setup.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose up open-webui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | No WEBUI_SECRET_KEY environment variable set, loading from file.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | Generating new WEBUI_SECRET_KEY...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | Loading WEBUI_SECRET_KEY from .webui_secret_key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | INFO  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;alembic.runtime.migration&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Context impl SQLiteImpl.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | INFO  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;alembic.runtime.migration&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Will assume non-transactional DDL.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | INFO  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;alembic.runtime.migration&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Running upgrade  -&amp;gt; 7e5b5dc7342b&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |  ██████╗ ██████╗ ███████╗███╗   ██╗    ██╗    ██╗███████╗██████╗ ██╗   ██╗██╗&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | ██╔═══██╗██╔══██╗██╔════╝████╗  ██║    ██║    ██║██╔════╝██╔══██╗██║   ██║██║&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | ██║   ██║██████╔╝█████╗  ██╔██╗ ██║    ██║ █╗ ██║█████╗  ██████╔╝██║   ██║██║&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | ██║   ██║██╔═══╝ ██╔══╝  ██║╚██╗██║    ██║███╗██║██╔══╝  ██╔══██╗██║   ██║██║&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | ╚██████╔╝██║     ███████╗██║ ╚████║    ╚███╔███╔╝███████╗██████╔╝╚██████╔╝██║&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |  ╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═══╝     ╚══╝╚══╝ ╚══════╝╚═════╝  ╚═════╝ ╚═╝&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | v0.9.6 - building the best AI user interface.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  | https://github.com/open-webui/open-webui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;open-webui-manual  |&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Two options exist for the initial onboarding; see the next two paragraphs.&lt;/p&gt;&#xA;&lt;h2 id=&#34;manual-onboarding&#34;&gt;Manual Onboarding&#xA;&lt;/h2&gt;&lt;p&gt;The first step is to create an admin account. Access the application at &lt;code&gt;http://localhost:3000&lt;/code&gt; and fill out the shown fields.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm37_admin_account_creation.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;p&gt;Once completed, you will see the initial welcome message and a popup showing current version information. While manual onboarding is an option, the better approach is to extend the &lt;code&gt;.open-webui.env&lt;/code&gt; file so that the admin account and other settings are controlled and persisted between container restarts. This is explained in the next section.&lt;/p&gt;&#xA;&lt;h2 id=&#34;onboarding-with-config-file&#34;&gt;Onboarding with Config File&#xA;&lt;/h2&gt;&lt;p&gt;Alternatively to the dialog-based setup, settings about the admin user and additional variables to influence privacy and telemetry can be configured. The list of supported variables is extensive; see the &lt;a class=&#34;link&#34; href=&#34;https://docs.openwebui.com/reference/env-configuration#general&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;official documentation&lt;/a&gt; for all options.&lt;/p&gt;&#xA;&lt;p&gt;What you should also persist is the &lt;code&gt;WEBUI_SECRET_KEY&lt;/code&gt;. Its value is used to encrypt JWT access tokens and stored secrets. As shown in the container start logs, its value is dynamically created. Therefore, restarting the container invalidates current sessions and also makes encrypted data obsolete. Check the file content of &lt;code&gt;/app/backend/.webui_secret_key&lt;/code&gt;, and add it too.&lt;/p&gt;&#xA;&lt;p&gt;Here is the extended &lt;code&gt;.open-webui.env&lt;/code&gt; with all options.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Port, persistence, logging&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBUI_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://localhost:8080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_PERSISTENT_CONFIG&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;True&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GLOBAL_LOG_LEVEL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;INFO&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LOG_FORMAT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBUI_SECRET_KEY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;REDACTED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Only allow one pre-configured admin user&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBUI_ADMIN_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;Admin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBUI_ADMIN_EMAIL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;REDACTED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBUI_ADMIN_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;REDACTED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_SIGNUP&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_LOGIN_FORM&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;True&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_PASSWORD_AUTH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;True&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_PASSWORD_CHANGE_FORM&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;True&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Better privacy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_ADMIN_ANALYTICS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_PUBLIC_ACTIVE_USERS_COUNT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_USER_STATUS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_EASTER_EGGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE_OTEL_LOGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now restart the container once, and from then on all settings persist.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose restart open-webui&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A warning: all of these variables, and additional changes in the GUI, are persisted. To reset, for example, the login values, stop the container, set &lt;code&gt;ENABLE_PERSISTENT_CONFIG=True&lt;/code&gt;, then restart it. If there is a further problem, you can also set &lt;code&gt;RESET_CONFIG_ON_START=true&lt;/code&gt; to delete the database, or take the final option to completely delete the Docker container and the volume.&lt;/p&gt;&#xA;&lt;h2 id=&#34;model-configuration&#34;&gt;Model Configuration&#xA;&lt;/h2&gt;&lt;p&gt;To use Open WebUI for its intended purpose, you need to add an LLM provider endpoint. Essentially, any endpoint that supports the OpenAI API format can be used. Besides OpenAI itself, you can choose from any direct provider, OpenRouter, or even GitHub Copilot with an additional proxy server.&lt;/p&gt;&#xA;&lt;p&gt;For brevity, let&amp;rsquo;s invoke the ChatGPT API directly.&lt;/p&gt;&#xA;&lt;p&gt;First, create an OpenAI API key as follows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Log in to the OpenAI service&lt;/li&gt;&#xA;&lt;li&gt;Go to the &lt;a class=&#34;link&#34; href=&#34;https://platform.openai.com/api-keys&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;API key page&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Click the “+ Create New Secret Key” button, provide a name, and copy the key from the popup&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Second, configure the endpoint in Open WebUI:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Access the Open WebUI dashboard&lt;/li&gt;&#xA;&lt;li&gt;Click on the admin user icon in the bottom-left corner, and then click “Admin Panel”&lt;/li&gt;&#xA;&lt;li&gt;In the horizontal tab bar, click “Settings,” then “Connections”&lt;/li&gt;&#xA;&lt;li&gt;Disable all toggles from the bottom up&lt;/li&gt;&#xA;&lt;li&gt;Enable the “OpenAI API” toggle&lt;/li&gt;&#xA;&lt;li&gt;Click the “+” symbol next to “Manage OpenAI API Connections”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Now, the following dialogue should appear.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    &lt;img src=&#34;https://admantium.com/images/blog/llm37_model_configuration.png&#34;&#xA;        loading=&#34;lazy&#34;&#xA;        &#xA;        &#xA;    &gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;For the API endpoint URL, enter &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Enter your created API key&lt;/li&gt;&#xA;&lt;li&gt;Click on the double-arrow icon to validate the connection; a green popup appears to show success&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Finally, you can start a new chat from the dashboard.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;Many tools exist for ongoing, contextual conversations with an LLM. Open WebUI is one of the earliest tools to support contextual conversations with LLMs. Since its inception in October 2023, many features were added. In this article, you learned how to set up and configure the tool as a Docker container with defined, persisted config. You saw the relevant &lt;code&gt;docker-compose.yml&lt;/code&gt; and &lt;code&gt;.env&lt;/code&gt; file, learned about the nuances of onboarding, the consequences of not persisting the central encryption key, and how to configure an LLM provider. The next article continues the feature exploration.&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
