<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Sebastian on Medium]]></title>
        <description><![CDATA[Stories by Sebastian on Medium]]></description>
        <link>https://medium.com/@admantium?source=rss-59c791c55f3f------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*gcv5oj2o-aqerq0XbOZ5Qw.png</url>
            <title>Stories by Sebastian on Medium</title>
            <link>https://medium.com/@admantium?source=rss-59c791c55f3f------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 11:42:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@admantium/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[LiteLLM: Model and Key Management]]></title>
            <link>https://admantium.medium.com/litellm-model-and-key-management-ef0520cc9925?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/ef0520cc9925</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[litellm]]></category>
            <category><![CDATA[llm]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Thu, 12 Nov 2026 07:01:02 GMT</pubDate>
            <atom:updated>2026-11-12T07:01:02.027Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aFeQgYWgVk0_t3on3Rbpxg.png" /></figure><p>LiteLLM is a versatile LLM proxy server. It provides developers with a single service that accepts OpenAI and Anthropic API requests and forwards them to the configured models. It supports rolling budgets and cost tracking to prevent unrestricted token consumption. It also provides observability into external LLM usage.</p><p>Following the deployment options and local setup described in the previous article, this article focuses on model and key management. It provides a concise overview of the API routes and organizes the available request parameters into logical groups. Specifically, it covers model definitions, health checks, and key configuration.</p><p><em>The technical context of this article is </em><em>litellm v1.94.1, published on 2026-07-31. Setup and configuration examples should work with newer versions too.</em></p><p><em>The background material for this article stems from the official </em><a href="https://docs.litellm.ai/docs/simple_proxy"><em>LiteLLM documentation</em></a><em>, specifically the pages </em><a href="https://docs.litellm.ai/docs/proxy/model_management"><em>Model Management</em></a><em>, </em><a href="https://docs.litellm.ai/docs/proxy/health"><em>Health Checks</em></a><em>, and </em><a href="https://docs.litellm.ai/docs/proxy/virtual_keys"><em>Virtual Keys</em></a><em>.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm44_litellm_key_and_cost_management/"><em>admantium.com</em></a>.</p><h3>Model Management</h3><p>One of the fundamental configuration items that any LiteLLM proxy administrator deals with is the model provider. For any upstream model, a configuration item can be added that encapsulates its access, parameters, routing rules, and much more.</p><h3>API Structure and Properties</h3><p>The API provides routes for managing individual models or access groups, which are sets of models. API operations can be divided into the following categories:</p><p>Create</p><ul><li>POST /model/new</li><li>POST /access_group/new</li></ul><p>Read</p><ul><li>GET /{v1/}/models</li><li>GET /{v1/}models</li><li>GET /{v1/|/v2/}model/info</li><li>GET /model_group/info</li><li>GET /access_group/list</li><li>GET /access_group/{access_group}/info</li></ul><p>Update</p><ul><li>POST /model/update</li><li>PATCH /model/{model_id}/update</li><li>PUT /access_group/{access_group}/update</li></ul><p>Lifecycle</p><ul><li>POST /model/block</li><li>POST /model/unblock</li></ul><p>Delete</p><ul><li>POST /model/delete</li><li>DELETE /access_group/{access_group}/delete</li></ul><p>Another set of API routes is concerned with the internal model hub feature, such as GET /public/model_hub. The API documentation lists these routes as part of model management. They are omitted here to stay focused on provider model activation.</p><p>The parameters for model creation are both slim and expansive. They are slim because only model_name, model_info, and litellm_params are required. They are expansive because litellm_params lists more than 100 different parameters that are provider-specific, provider-agnostic, or internal to LiteLLM; no distinction is made in the official Swagger documentation. Here is an attempt to group them semantically:</p><ul><li>Provider authentication: Essential parameters such as the API base, API version, credentials, and region information (api_base, api_version, api_key)</li><li>LiteLLM credentials: Instead of defining the LLM provider credentials verbosely, an ID for an existing stored credential can be provided (litellm_credential_name, litellm_trace_id)</li><li>Price information / Tokens: Input, output, and cache-hit prices per token or per 100,000 tokens (input_cost_per_token, output_cost_per_token, cache_read_input_token_cost)</li><li>Price information /Multimodal models: Pricing information for working with images, audio, and video (input_cost_per_image, input_cost_per_image)</li><li>Proxy: Controls whether other proxies are involved in cascading provider API resolution and which authentication method to use (use_litellm_proxy, use_xai_oauth)</li><li>API throughput: Controls internal file-size limits, whether to allow pass-through when making external requests, and which type of external API to use (max_file_size_mb, use_in_pass_through, use_chat_completions_api)</li><li>Embeddings: Configures the logical vector shape and which vector store to use when writing to or reading from vector stores (output_vector_size, vector_store_id, milvus_text_field)</li><li>Routing / Auto: An interesting concept involving a policy-like declaration of how model requests reach their intended or reflected provider (auto_router_config_path, auto_router_default_model, auto_router_embedding_model)</li><li>Routing / Complexity: Rule sets that determine a weighted assumption about request content to drive routing (complexity_router_config, complexity_router_default_model)</li><li>Routing / Adaptive: Dynamic routing based on live data about costs, performance, or the measured quality of answers (adaptive_router_config, adaptive_router_default_model, quality_router_config)</li><li>Routing / Operational controls: Provides absolute token-based limits, API retries, and more (tpm, rpm, max_retries)</li><li>Metadata: Documents additional fields such as descriptions, labels, and model classifications, which can be used as placeholder values in other configuration options (model_info, tags, tag_regex)</li></ul><h3>Model Definition Example</h3><p>Model declaration follows two patterns: at startup, models are present in configuration files; at runtime, they are added through the GUI or by invoking specific API endpoints.</p><p>For the first option, the canonical litellm-config.yml file can be extended. Here is an example that declares (at the time of writing novel) GPT 5.6 models:</p><pre>model_list:<br>  - model_name: gpt-5.6-luna<br>    litellm_params:<br>      model: openai/gpt-5.6-luna<br>      api_key: os.environ/OPENAI_API_KEY<br>  - model_name: gpt-5.6-terra<br>    litellm_params:<br>      model: openai/gpt-5.6-terra<br>      api_key: os.environ/OPENAI_API_KEY<br>  - model_name: gpt-5.6-sol<br>    litellm_params:<br>      model: openai/gpt-5.6-sol<br>      api_key: os.environ/OPENAI_API_KEY</pre><p>Adding a model through the API can be done with this command:</p><pre>curl -X POST &quot;http://0.0.0.0:4000/model/new&quot; \<br>    -H &quot;Authorization: Bearer $LITELLM_MASTER_KEY&quot; \<br>    -H &quot;Content-Type: application/json&quot; \<br>    -d &#39;{<br>      &quot;model_name&quot;: &quot;gpt-5-pro&quot;,<br>      &quot;litellm_params&quot;: {<br>        &quot;model&quot;: &quot;openai/gpt-5-pro&quot;,<br>        &quot;api_key&quot;: &quot;os.environ/OPENAI_API_KEY&quot;<br>      }<br>    }&#39;</pre><p>And the response:</p><pre>{<br>  &quot;model_id&quot;: &quot;b8f3dedc-ed78-4531-a805-dc54ba4aff7e&quot;,<br>  &quot;model_name&quot;: &quot;gpt-5-pro&quot;,<br>  &quot;litellm_params&quot;: {<br>    &quot;model&quot;: &quot;o2K565rjul8ofeW5pKuHD1vQpi2lxBuHXiRV-vsD5TeDlxN7bkvnyNGf7IubKSlQ9oWhgnYCvHE=&quot;,<br>    &quot;api_key&quot;: &quot;xTxk2kljn1JiEjxeu8xhfhFOnEQ_9b7GJE2Yz4Xa-Nn0G9I3C5wXsZnfH67zYugWjq6qGN91BTQnJXdnuJ77qgo=&quot;,<br>    &quot;use_xai_oauth&quot;: false,<br>    &quot;use_litellm_proxy&quot;: false,<br>    &quot;use_in_pass_through&quot;: false,<br>    &quot;merge_reasoning_content_in_choices&quot;: false<br>  },<br>  &quot;model_info&quot;: {<br>    &quot;id&quot;: &quot;b8f3dedc-ed78-4531-a805-dc54ba4aff7e&quot;,<br>    &quot;db_model&quot;: false<br>  },<br>  &quot;blocked&quot;: false,<br>  &quot;created_at&quot;: &quot;2026-08-01T12:32:10.585000Z&quot;,<br>  &quot;created_by&quot;: &quot;default_user_id&quot;,<br>  &quot;updated_at&quot;: &quot;2026-08-01T12:32:10.585000Z&quot;,<br>  &quot;updated_by&quot;: &quot;default_user_id&quot;<br>}</pre><p>The origin of models is shown in the GUI. Models from a configuration file display a closed-lock symbol. They are effectively immutable: the GUI does not allow edits, and API calls return an error code indicating that no changes are accepted.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*palPfWnOniDQ5CTS.png" /></figure><h3>Model Health Checks</h3><p>External providers offer LLMs through their managed infrastructure. Even the original providers, OpenAI and Anthropic, can sometimes experience service degradations or outright downtime.</p><p>With LiteLLM, health checks for specific models can be configured. Applications and tools connected to LiteLLM will only be served healthy endpoints. For handling unavailable models, model aliases can be configured, but they must be explicitly requested by the application, or a fallback policy can be defined and applied.</p><p>To apply health checks and view their results graphically, open the Models + Endpoints section through the dashboard, then select Health Status from the horizontal menu.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*CRXGoPv-QQx3LZfh.png" /></figure><p>The alternative API call is as follows:</p><pre>curl &quot;http://0.0.0.0:4000/health?model=gpt-5.6-luna&quot; \<br>    --header &quot;Authorization: Bearer $LITELLM_MASTER_KEY&quot;<br><br>{<br>  &quot;healthy_endpoints&quot;: [<br>    {<br>      &quot;custom_llm_provider&quot;: &quot;openai&quot;,<br>      &quot;use_in_pass_through&quot;: false,<br>      &quot;use_litellm_proxy&quot;: false,<br>      &quot;use_xai_oauth&quot;: false,<br>      &quot;merge_reasoning_content_in_choices&quot;: false,<br>      &quot;model&quot;: &quot;gpt-5.6-luna&quot;,<br>      &quot;max_tokens&quot;: 16,<br>      &quot;cache&quot;: {<br>        &quot;no-cache&quot;: true<br>      },<br>      &quot;x-ratelimit-remaining-requests&quot;: &quot;499&quot;,<br>      &quot;x-ratelimit-remaining-tokens&quot;: &quot;199994&quot;,<br>      &quot;model_id&quot;: &quot;e4a50849-1dae-47fd-8759-a71f175b11dd&quot;<br>    }<br>  ],<br>  &quot;unhealthy_endpoints&quot;: [],<br>  &quot;healthy_count&quot;: 1,<br>  &quot;unhealthy_count&quot;: 0<br>}</pre><p>Health checks are applied whenever a model is requested. As a large model catalog could create a substantial number of health checks, this behavior can be turned off so that only explicit checks through the API endpoint trigger a status update. The following snippet needs to be placed in the configuration file:</p><pre>general_settings:<br>  background_health_checks: false</pre><h3>Key Management</h3><p>With a catalog of defined and configured models, LiteLLM virtual keys govern and control access to its proxy API routes and, therefore, to external connections.</p><h3>API Structure and Properties</h3><p>For managing keys, the following API routes are essential:</p><p>Create</p><ul><li>POST /key/generate</li><li>POST /key/service-account/generate</li></ul><p>Read</p><ul><li>GET /key/info</li><li>GET /key/list</li><li>GET /key/aliases</li></ul><p>Update</p><ul><li>POST /key/update</li><li>POST /key/bulk_update</li><li>POST /team/key/bulk_update</li></ul><p>Lifecycle</p><ul><li>POST /key/regenerate</li><li>POST /key/{key}/regenerate</li><li>POST /key/{key}/reset_spend</li><li>POST /key/block</li><li>POST /key/unblock</li><li>POST /key/health</li></ul><p>Delete</p><ul><li>POST /key/delete</li></ul><p>Keys are fundamental. The complete set of API parameters for keys encompasses more than 50 fields, divided into the following aspects:</p><p>It is important to bear in mind that key ownership defined through roles in LiteLLM grants permissions only for CRUD operations on the key itself. The encoded key’s access to models, routes, and budgets remains unchanged, so any person or system with the key credential can use it to access the proxy’s API routes.</p><ul><li>Identity: Keys are alphanumeric character sequences. Their creation results in a random value with a defined pattern, but a value can also be explicitly set (key, key_alias)</li><li>Ownership: Keys can belong to users, teams, or organizations, or they can be defined as service accounts (user_id, team_id, organization_id)</li><li>Model management: The available models for a specific key default interestingly to all models, but they can be restricted by defining model names or key aliases; in the case of group ownership, these restrictions are also inherited (models, aliases)</li><li>Access management: Provides total or restricted access to LiteLLM API routes (llm_api, management, read_only), or can construct sets of explicitly named paths (allowed_routes)</li><li>Usage restrictions: Limits key applicability through required request parameters (enforced_params, prompts), or can temporarily disable a key altogether (block)</li><li>Budget management: Defines absolute or rolling periods of available budgets when using associated models (max_budget, budget_duration, budget_fallbacks)</li><li>Rate limits: Defines throughput barriers that consistent usage cannot violate (rpm_limit, tpm_limit, max_parallel_requests)</li><li>Guardrails: Safeguards input, output, and tool-call content (guardrails, policies)</li><li>Information and status: Sets additional identifiable information for keys (metadata, tags), or controls whether key creation leads to notifications (send_invite_email)</li><li>Lifecycle: Defines automatic key rotation (auto_rotate, rotation_interval)</li></ul><h3>Key Generation Example</h3><p>Keys can be added through the GUI and the API. Management through the API should be preferred: not only is the full set of options available, but the specificity of inputs can also be persisted in version control systems, allowing for controlled and audited changes.</p><p>Key creation through the GUI was covered in my previous article <a href="https://admantium.com/blog/llm43_litellm_setup_and_configuration/">getting started with LiteLLM</a>.</p><p>Through the API, new keys are created through the /key/generate and /key/service-account routes. Here is an introductory call that includes all the attributes covered so far:</p><pre>&gt; curl -X POST &quot;http://0.0.0.0:4000/key/generate&quot; \<br>    --header &quot;Authorization: Bearer $LITELLM_MASTER_KEY&quot; \<br>    --header &quot;Content-Type: application/json&quot; \<br>    --data-raw &#39;{<br>      &quot;key_alias&quot;: &quot;sys-ops-default-key&quot;,<br>      &quot;team_id&quot;: &quot;sys-ops&quot;,<br>      &quot;models&quot;: [&quot;gpt-5.6-luna&quot;],<br>      &quot;aliases&quot;: {&quot;mistral&quot;: &quot;local-llms&quot;}<br>    }&#39;{<br>  &quot;key_alias&quot;: &quot;sys-ops-default-key&quot;,<br>  &quot;duration&quot;: null,<br>  &quot;models&quot;: [<br>    &quot;gpt-5.6-luna&quot;<br>  ],<br>  &quot;spend&quot;: 0.0,<br>  &quot;max_budget&quot;: null,<br>  # ...<br>  &quot;team_id&quot;: &quot;sys-ops&quot;,<br>  # ...<br>  &quot;aliases&quot;: {<br>    &quot;mistral&quot;: &quot;local-llms&quot;<br>  },<br>  # ...<br>  &quot;key_name&quot;: &quot;sk-...hJCg&quot;,<br>  &quot;key_type&quot;: &quot;default&quot;,<br>  &quot;expires&quot;: null,<br>  # ...<br>  &quot;token_id&quot;: &quot;c9996271b8f97687bdc78c91d1ab6e91b95317aad5b922b49943fd0fbec49d17&quot;,<br>  &quot;organization_id&quot;: null,<br>  &quot;project_id&quot;: null,<br>  &quot;litellm_budget_table&quot;: null,<br>  &quot;token&quot;: &quot;c9996271b8f97687bdc78c91d1ab6e91b95317aad5b922b49943fd0fbec49d17&quot;,<br>  &quot;created_by&quot;: &quot;default_user_id&quot;,<br>  &quot;updated_by&quot;: &quot;default_user_id&quot;,<br>  &quot;created_at&quot;: &quot;2026-08-04T17:46:52.040000Z&quot;,<br>  &quot;updated_at&quot;: &quot;2026-08-04T17:46:52.040000Z&quot;<br>}<br></pre><h3>Conclusion</h3><p>An LLM proxy is essential for transparently managing a large group of models for a substantial user base. It helps connect different providers, translate and transform requests from applications to provider APIs, keep costs within monetary and token budgets, and provide observability into LLM usage. This article showed two essential concepts of the LiteLLM proxy: model and API key management. For each, a concise summary of lifecycle-based API routes, request parameter groups, and concrete invocation examples was provided.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ef0520cc9925" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LiteLLM: Getting Started with LLM Proxies]]></title>
            <link>https://admantium.medium.com/litellm-getting-started-with-llm-proxies-069af90ad279?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/069af90ad279</guid>
            <category><![CDATA[litellm]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Mon, 02 Nov 2026 07:01:02 GMT</pubDate>
            <atom:updated>2026-11-02T07:01:02.356Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*_FM_b3ksOTmO1ZiB.png" /></figure><p>When running multiple applications that interact with LLM provider endpoints, management of keys, token consumption and cost spending, operational aspects like failover and semantic routing, or observability topics like availability, latency, and traces become important. Especially customer-facing apps that expose chat functionality need tight guards to prevent misuse and runaway costs. These aspects are the domain of LLM proxies, dedicated projects that sit between applications and LLM endpoints.</p><p>LiteLLM is a sophisticated LLM proxy, available as open-source software for self-hosting, as well as production-grade deployments on infrastructure or even fully managed cloud solutions. This article starts a new blog series and explores the rich feature set of LiteLLM. This first article discusses features, deployment options, and a step-by-step manual for local setup as Docker containers.</p><p><em>The technical context of this article is </em><em>litellm v1.94.1, published on 2026-07-31. Setup and configuration examples should work with newer versions too.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm43_litellm_setup_and_configuration/"><em>admantium.com</em></a>.</p><h3>LiteLLM Feature Set at a Glance</h3><p>The LiteLLM proxy provides the following feature set, grouped into different stages of handling AI tools.</p><ul><li>API key management: Provide virtual API keys to persons, teams, or applications, and set fixed token or cost budgets.</li><li>Cost tracking: Actively monitor token consumption and accumulated costs.</li><li>Guardrails: Filter both incoming and generated messages for inappropriate topics or language.</li><li>Fallback and retry: Detect upstream provider outages and switch to other available models to keep systems operational.</li><li>Caching: Add semantic caches to frequent requests, saving both costs and round-trip time for a better user experience.</li><li>OpenTelemetry traces: Requests and responses are separated into GenAI OTEL spans, allowing precise control over how LLM usage, e.g. by an agent app, is internally structured into thinking loops, tool calls, RAG searches, and answer synthesis.</li><li>Observability: With traces, also identify latency within the LLM call stack, e.g. by figuring out slow tool calls or a massive context window due to bloated RAG results.</li><li>Enterprise features: Provide company-wide single sign-on logic, audit logs, and multi-tenant governance by setting up multiple organizations and teams for managed keys. IP restriction and deeper multi-tenant governance are positioned as enterprise features.</li></ul><h3>Installation Options</h3><p>LiteLLM is geared towards enterprise usage, and as such, multiple installation options in terms of cloud environments and multiple components for load balancing requests and long-term storage of operational data are supported.</p><p>The essential components in each stack are these:</p><ul><li>LiteLLM microservices: To enhance scalability and improve redundancy, functional aspects of LiteLLM can be broken down into different services</li><li>Gateway: Central component to which applications connect</li><li>Backend: Process and storage engine; provides a REST API and frontend APIs for management</li><li>Frontend: The management GUI of LiteLLM</li><li>LiteLLM proxy: A single service that combines the functions of the gateway, backend, and configuration GUI</li><li>PostgreSQL: Stores keys, teams, users, and configuration items</li></ul><p>When hosted in cloud environments, these specific components are added:</p><ul><li>Load balancer</li><li>AWS: Application Load Balancer (ALB) or Network Load Balancer (NLB)</li><li>GCP: GKE Ingress (managed Kubernetes)</li><li>Azure: Application Load Balancer (ALB)</li><li>Redis: Saves router state and provides global caching</li></ul><p>The deployment mechanisms are:</p><ul><li>Helm chart: Deploy to managed Kubernetes clusters in AWS (Elastic Kubernetes Service), GCP (Google Kubernetes Engine), or Azure (Azure Kubernetes Service)</li><li>Terraform: Deploy to AWS and GCP by using dedicated Terraform providers</li><li>Docker: For on-premises and local installations</li></ul><p>For more information about cloud-based production deployments, see the official <a href="https://docs.litellm.ai/docs/proxy/deploy">LiteLLM Deployment Guidelines</a>.</p><h3>Local Setup</h3><p>LiteLLM can be installed natively, via the LiteLLM CLI that comes packaged with an SDK, or as a Docker container. For local setup, the last option is preferable: The complete application stack, all dependencies, and binaries are versioned inside the container, and essential configurations will be mounted via volumes. You only keep relevant stateful information and can provide safe updates via version pinning.</p><p>The <a href="https://docs.litellm.ai/docs/proxy/docker_quick_start">LiteLLM Quickstart Guidelines</a> outline all steps in detail. Here is a step-by-step manual, which provide the most recent application versions, and the start for using configuration files effectivly.</p><ul><li>Docker Compose file</li><li>Download the official Docker Compose file from the <a href="https://raw.githubusercontent.com/BerriAI/litellm/main/docker-compose.yml">LiteLLM GitHub repository</a></li><li>Open the file and change the image tags with the following up-to-date version pinning:</li></ul><pre>image: litellm/litellm:v1.94.1<br>  image: postgres:18.4-trixie<br>  image: prom/prometheus:v3.13.1</pre><ul><li>LiteLLM environment variables</li><li>Create a .env file</li><li>Generate two random passwords for LiteLLM by running LC_ALL=C tr -dc &#39;A-Za-z0-9&#39; &lt; /dev/urandom | head -c 20; echo</li><li>Open the .env file and add these passwords</li></ul><pre>LITELLM_MASTER_KEY=&quot;sk-REDACTED&quot;<br>LITELLM_SALT_KEY=&quot;REDACTED&quot;</pre><ul><li>Configuration files</li><li>Create the local directory config/</li><li>Create config/litellm.yml and paste and edit the following content:</li></ul><pre>general_settings:<br>    master_key: sk-REDACTED # same key as above<br>    database_url: &quot;postgresql://llmproxy:dbpassword9090@db:5432/litellm&quot;</pre><ul><li>Configuration files</li><li>Create config/prometheus.yml and add these lines:</li></ul><pre>global:<br>    scrape_interval: 15s<br>    evaluation_interval: 15s<br><br>scrape_configs:<br>    - job_name: &quot;litellm&quot;<br>      static_configs:<br>        - targets: [&quot;litellm:4000&quot;]</pre><ul><li>Docker Compose file changes</li><li>Edit the container volume mounts to reflect the configuration file locations:</li></ul><pre>litellm:<br>    volumes:<br>      - ./config/litellm.yml:/app/litellm-config.yml<br>    command:<br>      - &quot;--config=/app/litellm-config.yml&quot;<br><br># ... <br><br>  prometheus:<br>    volumes:<br>      - prometheus_data:/prometheus<br>      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml</pre><ul><li>Edit the Postgres volume target path, required in postgres:18.4:</li></ul><pre>db:<br>    volumes:<br>      - postgres_litellm:/var/lib/postgresql</pre><ul><li>Start the Docker Compose stack</li><li>Run docker compose up, and be patient while all the images are completely loaded:</li></ul><pre>&gt; docker compose up<br><br># log messages<br>  [+] Running 15/19<br>  ✔ prometheus Pulled                                                       1.9s<br>  ✔ litellm Pulled                                                          2.5s<br>  ✔ db Pulled                                                               4.2s<br>  ⠦ open-webui 15 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⡀⣿⣿⡀] 35.33MB/1.315GB Pulling          8.6s<br>  ...</pre><ul><li>During startup, the litellm container needs to set up its database, which can also take some time to complete</li></ul><pre>litellm-1     | 2026-07-31 16:54:12,717 - litellm_proxy_extras - INFO - Running prisma migrate deploy<br>  litellm-1     | 2026-07-31 16:54:12,718 - litellm_proxy_extras - INFO - Using custom Prisma CLI at /opt/prisma/binaries/node_modules/.bin/prisma<br>  litellm_db    | 2026-07-31 16:54:16.529 UTC  LOG:  could not receive data from client: Connection reset by peer<br>  litellm-1     | 2026-07-31 16:54:16,645 - litellm_proxy_extras - INFO - prisma migrate deploy stdout: Prisma schema loaded from schema.prisma<br>  litellm-1     | Datasource &quot;client&quot;: PostgreSQL database &quot;litellm&quot;, schema &quot;public&quot; at &quot;db:5432&quot;<br>  litellm-1     |<br>  litellm-1     | 140 migrations found in prisma/migrations<br>  litellm-1     |<br>  litellm-1     | Applying migration `20250326162113_baseline`<br>  litellm-1     | Applying migration `20250326171002_add_daily_user_table`<br>  litellm-1     | Applying migration `20250327180120_add_api_requests_to_daily_user_table`<br><br>...<br><br>  litellm-1     | 2026-07-31 16:54:21,890 - litellm_proxy_extras - INFO - ✅ Migration diff applied successfully<br>  litellm-1     | 2026-07-31 16:54:21,891 - litellm_proxy_extras - INFO - ✅ Post-migration sanity check completed<br>  litellm-1     | INFO:     Started server process [1]<br>  litellm-1     | INFO:     Waiting for application startup.<br>  litellm-1     | LiteLLM Proxy: Using default (v1) migration resolver. If your deployment has seen schema thrashing during rolling deploys, try --use_v2_migration_resolver (safer: avoids the diff-and-force recovery that caused the thrash).<br>  litellm-1     |<br>  litellm-1     |    ██╗     ██╗████████╗███████╗██╗     ██╗     ███╗   ███╗<br>  litellm-1     |    ██║     ██║╚══██╔══╝╔════╝██║     ██║     ████╗ ████║<br>  litellm-1     |    ██║     ██║   ██║   █████╗  ██║     ██║     ██╔████╔██║<br>  litellm-1     |    ██║     ██║   ██║   ██╔══╝  ██║     ██║     ██║╚██╔╝██║<br>  litellm-1     |    ███████╗██║   ██║   ███████╗███████╗███████╗██║ ╚═╝ ██║<br>  litellm-1     |    ╚══════╝╚═╝   ╚═╝   ╚══════╝╚══════╝╚══════╝╚═╝     ╚═╝<br>  litellm-1     |</pre><p>Then, open http://localhost:4000/ui/ and see the dashboard:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/799/0*cuyN31RhPXaXEgdA.png" /></figure><h3>Model and Virtual API Key Definition</h3><p>To start using LiteLLM as a proxy, an LLM provider needs to be configured, and then a virtual API key added that the client applications, or any tool working with an OpenAPI endpoint for this matter, uses.</p><h3>Model Setup</h3><p>LiteLLM provides many built-in providers, including direct access to <a href="https://platform.openai.com/docs">OpenAI</a>, <a href="https://docs.anthropic.com/">Anthropic</a>, cloud providers like <a href="https://learn.microsoft.com/azure/ai-services/">Azure AI</a>, <a href="https://cloud.google.com/vertex-ai/docs">Google Vertex AI</a>, and <a href="https://docs.aws.amazon.com/bedrock/">AWS Bedrock</a>, as well as <a href="https://docs.mistral.ai/">Mistral</a>, <a href="https://docs.cohere.com/">Cohere</a>, and <a href="https://openrouter.ai/docs">OpenRouter</a>. See the full list at <a href="https://docs.litellm.ai/docs/providers">LiteLLM providers</a>.</p><p>For demonstration purposes, a direct connection to OpenAI will be configured.</p><ul><li>On the dashboard, in the left menu, click on Model + Endpoint</li><li>In the vertical tab list, click on Add Model, and the same-named dialogue appears</li><li>Fill out the details as follows:</li><li>Provider: OpenAI</li><li>LiteLLM Model Name(s): Put in the models of you choice, e.g. the moste recent gpt-5.6-luna, gpt-5.6-terra and gpt-5.6-sol</li><li>Mode: Chat - /chat/completions</li><li>OpenAI API key: sk-21113tfa … no, just kidding, use your own key</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*W0BlVs1bA1VPv063.png" /></figure><p>Click on Test Connection, and when the success message appears, click on Save Model.</p><h3>API Key</h3><p>Virtual API keys are a strong feature of LiteLLM, allowing the provision to individual developers or groups.</p><p>Follow these steps for key generation:</p><ul><li>On the dashboard, in the left menu, click on Model + Endpoint &gt; Virtual Keys.</li><li>Click on the + Create New Key button</li><li>In the resulting dialog, fill out these details:</li><li>Owned By: You</li><li>Key Name: Provide a custom name, e.g. openai-api-key</li><li>Models: leave empty</li><li>Key Type: stick with “AI APIs” (so that it can use only the model APIs)</li><li>Under Additional Options, several interesting features are provided, but outside the scope of this article</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*DkZc1Dqmd1sWW7oV.png" /></figure><h3>Testing</h3><p>To use the API key, you can either issue a curl statement to the local endpoint …</p><pre>curl http://localhost:4000/v1/chat/completions \<br>  -H &#39;Authorization: Bearer sk-REDACTED&#39; \<br>  -H &#39;Content-Type: application/json&#39; \<br>  -d &#39;{<br>    &quot;model&quot;: &quot;gpt-5.6-luna&quot;,<br>    &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Say hello in five words.&quot;}]<br>  }&#39;</pre><p>… or acces the LiteLLM dashboard and cick on Playground in the vertical menu. Enter the virtual key, select the model, and start chatting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*p2Siu0dFV_PW6qK7.png" /></figure><h3>Conclusion</h3><p>The proliferation of LLM providers creates both opportunity and overhead. When an increasing array of tools and applications access LLMs unrestrained, excessive token usage and cost explosion is just a matter of time. LLM proxies provide essential key management and budget management options, reducing operational risks tremendously.</p><p>In this introductory article, you learned about LiteLLM. Specifically: a) its feature set, b) the production setup options that support the major cloud providers and deployment options via Kubernetes or Terraform, c) a full guide to local setup using Docker containers, and d) the configuration of an LLM provider, an API key, and testing the LiteLLM proxy access through curl or via the buildin playground.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=069af90ad279" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Open WebUI: Scheduling Agents]]></title>
            <link>https://admantium.medium.com/open-webui-scheduling-agents-cb8adf38c6ae?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/cb8adf38c6ae</guid>
            <category><![CDATA[open-webui]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Thu, 22 Oct 2026 06:31:01 GMT</pubDate>
            <atom:updated>2026-10-22T06:31:01.736Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/716/1*HZ_dU2VjRzE7Vt-Cro1VwQ.png" /></figure><p>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.</p><p>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.</p><p><em>The technical context of this article is </em><em>Open WebUI v0.9.6, published on 2026-06-01. The setup and configuration examples should also work with newer versions.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm42_open_webui_custom_agents_and_invocations/"><em>admantium.com</em></a>.</p><h3>Custom Tools</h3><h3>Definition</h3><p>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.</p><h3>Adding Custom Tools to Open WebUI</h3><p>While there is the option to implement a custom tool following the <a href="https://docs.openwebui.com/features/extensibility/plugin/tools/development">official documentation</a>, tools can also be imported from the <a href="https://openwebui.com/search?sort=top&amp;t=all&amp;page=1">Community Tool Library</a>.</p><p>Here is an example of adding a tool that shows the current weather.</p><p>The first step is to find an appropriate tool and get its files.</p><p>On the community marketplace:</p><ul><li>Search for the tool in the community marketplace.</li><li>Click on the Get button (an account is required).</li><li>Download the JSON file.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/0*Jz7pANUsAT99MUUJ.png" /></figure><p>Alternatively, the Python file can be downloaded from the linked <a href="https://github.com/iChristGit/OpenWebui-Tools/blob/main/Tools/weather.py">GitHub repository</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3qWFQiy9pHRqhmq9.png" /></figure><p>The second step is to define the tool in the Open WebUI instance. With an admin user account, Workspace =&gt; Tools needs to be opened. When the tool was downloaded from the community page, clicking on Import and selecting the downloaded JSON file suffices. If the Python source code file is used, then clicking on + New Tool and pasting the file content is required.</p><h3>Model Configuration</h3><p>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:</p><ol><li>Go to Workspace, then Models</li><li>Select an existing base model, or define a new one</li><li>The tools section lists all imported or self-defined tools; activate them for the target model</li></ol><h3>Tool Invocation</h3><p>To test this new weather tool, I created a new model named assistant, based on GPT-5.4, and added the tool.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*td2l_2cpd0B8Rxgj.png" /></figure><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/716/0*yPz5lgpDywsl30vV.png" /></figure><h3>Custom Skills</h3><h3>Definition</h3><p>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.</p><p>Skill repositories are abundant, and <a href="https://www.skills.sh/">skills.sh</a> provides an easy entry point. Search for skills that support GitLab interactions; I encountered <a href="https://github.com/github/awesome-copilot/blob/main/skills/git-commit/SKILL.md">git-commit</a> and <a href="https://github.com/YPares/agent-skills/blob/main/github-pr-workflow/SKILL.md">github-pr-workflow</a>.</p><p>Here is an excerpt of the skill file.</p><pre># Source: https://github.com/github/awesome-copilot/blob/main/skills/git-commit/SKILL.md<br><br>***<br>name: github-pr-workflow<br>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.<br>***<br># GitHub PR Workflow<br>## Key Concepts<br>### Comment Types<br>GitHub PRs have **two different types of comments**:<br>1. **PR-level comments** - General discussion on the PR (shown via `gh pr view --comments`)<br>2. **Inline code review comments** - Comments attached to specific lines of code (requires API)<br>**Important**: `gh pr view --comments` does NOT show inline code review comments!<br>## Scripts<br>| Script | Purpose |<br>|--------|---------|<br>| `gh-pr-info &lt;PR&gt; [REPO]` | **Comprehensive PR info**: summary, CI checks, and unresolved review and inline comments |<br>The script auto-detects the repo from the git remote, or accepts `[REPO]` as a second argument (format: `owner/repo`).<br>**Key features**:<br>- Uses GitHub&#39;s GraphQL API to reliably filter out already resolved/addressed comments.<br>- Excludes collapsed/hidden review threads.<br>- Excludes minimized comments (marked as spam/off-topic/resolved).<br>- Excludes dismissed reviews.<br>- Shows only what still needs attention.<br>## Common Commands<br># Get complete PR info with UNRESOLVED comments only<br>gh-pr-info &lt;PR&gt; [REPO]             # ✅ Everything you need: summary, checks, reviews, unresolved comments</pre><h3>Adding Custom Skills</h3><p>The declaration of custom skills in Open WebUI follows similar steps to those of tools. Follow these steps:</p><ol><li>On the skill repository page, open the skill file in markdown format, and either save the file or copy its content</li><li>In Open WebUI, click on Workspace =&gt; Skills, and either Import to select the downloaded file, or + New Skill and paste the file content in the editor window</li><li>In the top-right corner, click on Access, and ensure that Public is selected in the appearing drop-down menu -see the following screenshot:</li></ol><h3>Model Configuration</h3><p>The skill needs to be configured for the model too.</p><ol><li>Go to Workspace, then Models.</li><li>Select an existing base model, or define a new one.</li><li>In the Skills section, all defined skills should appear. Activate them by selecting their respective checkbox.</li></ol><h3>Skill Invocation</h3><p>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 $.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/452/0*bOneKA8Rpe76VQkU.png" /></figure><p>Here is an example chat output in which the Python project from my previous article about is continued. The prompt instructed the model to systematically commit the changes.</p><pre>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.<br><br>Approved. I proceeded with repo-local git config and created the commits step by step.<br>Plan executed<br>- Set local git identity<br>- Inspect repo state<br>- Initialize git repo if needed<br>- Create 4 logical commits:<br>  - `chore: initialize repository structure`<br>  - `build: add Python API dependencies`<br>  - `feat(api): add FastAPI app with config endpoint`<br>  - `feat(config): add model config data`</pre><p>Running a git log command in the folder shows the successful application of these commands.</p><pre>commit a01ddf84128e6f09276c449d94b62da1ff9064ba (HEAD -&gt; master)<br>Author: python-engineer &lt;agent4223@python.org&gt;<br>Date:   Sun Jul 5 14:21:42 2026 +0000<br>feat(config): add model config data<br><br>commit 53991af08e9d57b1b89503c9ac0ddcd39e1519e0<br>Author: python-engineer &lt;agent4223@python.org&gt;<br>Date:   Sun Jul 5 14:21:42 2026 +0000<br>feat(api): add FastAPI app with config endpoint<br><br>commit 4905c33d72afd5a95929a2313c331b36da83ca08<br>Author: python-engineer &lt;agent4223@python.org&gt;<br>Date:   Sun Jul 5 14:21:42 2026 +0000<br>build: add Python API dependencies<br><br>commit d2ea8ce702ff159b1438949d26f83e56f2d7d55d<br>Author: python-engineer &lt;agent4223@python.org&gt;<br>Date:   Sun Jul 5 14:21:42 2026 +0000<br>chore: initialize repository structure</pre><h3>Model Invocation</h3><p>Models with custom tools and skills can be invoked in four different ways.</p><h3>Chat Interface</h3><p>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.</p><h3>Scheduled</h3><p>Automations allow model calls on defined schedules. They are accessible from the user menu. Follow these steps:</p><ul><li>Click the user icon, then click Automations</li><li>Click the + New Automation button</li><li>Provide a suitable prompt, and program the schedule with an RRULE, an iCalendar-specific format</li></ul><p>To run a command every 5 minutes, the time modifier would be RRULE:FREQ=MINUTELY;INTERVAL=5.</p><p>Here is a screenshot showing how this invocation is defined:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/869/0*Y6bcWi24qB4kDDxC.png" /></figure><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IPL8QFY3fvXmGtxq.png" /></figure><h3>Agent Runtime</h3><p>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: <a href="https://github.com/openclaw/openclaw">OpenClaw</a>, <a href="https://github.com/nousresearch/hermes-agent">Hermes</a>, and <a href="https://github.com/open-webui/computer">Open WebUI Computer</a>, 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.</p><h3>External Apps</h3><p>There is no native integration to connect Open WebUI to a communication channel. But during my research, I encountered the following GitHub projects.</p><ul><li><a href="https://github.com/Sid-Sun/openwebui-telegram">openwebui-telegram</a>: 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</li><li><a href="https://github.com/open-webui/bot">open-webui/bot</a>: 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</li><li><a href="https://github.com/jakkph32/open-webui-utils">open-webui-utils</a>: A repository that contains two Open WebUI tools for outbound message integration, one for Telegram and one for Discord</li></ul><p>Additional projects can be found on the Open WebUI Community page when searching for messaging platforms.</p><h3>Conclusion</h3><p>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.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cb8adf38c6ae" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Open WebUI: Creating Custom Agents]]></title>
            <link>https://admantium.medium.com/open-webui-creating-custom-agents-d69b8104171d?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/d69b8104171d</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[open-webui]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Mon, 12 Oct 2026 06:31:01 GMT</pubDate>
            <atom:updated>2026-10-12T06:31:01.693Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*crPc0oFMJHygRBH7f1ZDKw.png" /></figure><p>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.</p><p>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.</p><p><em>The technical context of this article is </em><em>Open WebUI v0.9.6, published on 2026-06-01. The setup and configuration examples should also work with newer versions.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm41_open_webui_how_to_define_agents/"><em>admantium.com</em></a>.</p><h3>Agent Setup</h3><h3>Requirements</h3><p>The custom coding agent should meet the following requirements:</p><ul><li>Base model: A recent model capable of coding</li><li>Custom prompt: A senior Python full-stack engineer with a structured, rigorous work method</li><li>Tools: No special tools</li><li>Knowledge: No specialized local knowledge required</li><li>Memory: The coding session should persist; for example, stack choices should be remembered</li></ul><h3>Base Model</h3><p>The agent is implemented as a custom model, accessible from the Open WebUI GUI via Workspace, then Models.</p><p>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, gpt-5.4-nano offered a good input and output token cost profile. All prices for OpenAI models can be derived from <a href="https://developers.openai.com/api/docs/pricing">OpenAI API Pricing</a>.</p><h3>Prompt</h3><p>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:</p><pre># Senior Python Engineer — Prompt<br><br>You are a **SENIOR PYTHON ENGINEER** with **FULL-STACK** capability.<br>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.<br>## Role<br>Design, build, debug, and improve production-grade software across backends, APIs, data flows, infrastructure boundaries, and frontend integration points.<br>## Expectations<br>- Write clean, idiomatic, maintainable Python.<br>- Prefer strong typing, clear abstractions, and explicit trade-offs.<br>- Think in systems: performance, reliability, observability, security, and developer ergonomics.<br>- Operate as a full-stack engineer when needed: backend first, but comfortable with frontend architecture, API contracts, and integration details.<br>- Default to pragmatic solutions over fashionable complexity.<br>## Working Style<br>- **Enigmatic**: find non-obvious but explainable solutions.<br>- **Machinist**: engineer with precision, repeatability, and mechanical discipline.<br>- **Archivist**: preserve context, document decisions, and keep codebases legible over time.<br>- **Empirical**: validate assumptions through measurement, tests, benchmarks, and evidence.<br>## Technical Principles<br>- Use Python thoughtfully: typing, async when justified, testing, profiling, and clear module boundaries.<br>- Design APIs and services for scale, debuggability, and failure tolerance.<br>- Make observability native: logs, metrics, traces, and actionable errors.<br>- Treat security as a design constraint, not an afterthought.<br>- Keep code easy to review, extend, and operate.<br>## Response Rules<br>- Give concise, technically sharp answers.<br>- Provide working code when implementation is requested.<br>- State assumptions before designing complex solutions.<br>- Explain trade-offs briefly and clearly.<br>- Avoid filler, vague advice, and unnecessary abstraction.<br>- Favor production-suitable patterns over tutorial-style shortcuts.<br>## Output Preference<br>Return answers as a senior engineer would: precise, grounded, structured, and directly useful.</pre><h3>Knowledge, Skills, and Custom Skills</h3><p>To test agent invocation and gauge performance, I decided against adding additional configurations here.</p><h3>Memory</h3><p>Open WebUI’s default configuration has memory disabled. Each user needs to activate it explicitly. Click on the user icon, then on Settings, and then on Personalization. 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.</p><h3>Capabilities and Built-in Tools</h3><p>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.</p><p>The configuration for the custom model is as follows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/910/0*sjJy3_7P4RlPHb0r.png" /></figure><p>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.</p><p>Web search, as also explained in my <a href="https://admantium.com/blog/llm39_open_webui_agent_features/">previous article</a>, requires you to create an account with a search provider, get an API key, and paste it here.</p><p>The Terminal feature and its setup are a bit more involved and warrant an additional section.</p><h3>Open WebUI Terminal</h3><p>The <a href="https://github.com/open-webui/open-terminal">open-terminal GitHub project</a> 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.</p><p>Docker images with different capabilities are provided in four variants:</p><ul><li>latest: A heavyweight 4 GB image with a complete C++, Python, Node.js, and data science library stack, and the default user can run sudo to install additional packages</li><li>slim: A production image with only git as an additional tool</li><li>alpine: A slim variant based on Alpine, further reducing image size to 230 MB</li><li>openshift: A security-context-constrained (SCC) image that further minimizes access rights</li></ul><p>Since I already run Open WebUI as a Docker container, configured via a docker-compose.yml file, it is only natural to extend it with an open-terminal section. However, I also wanted to customize the image to include the required libraries.</p><h3>Custom Image</h3><p>From the GitHub repository, we only need Dockerfile.slim. Download the repository with this command:</p><pre>git clone --depth=1 https://github.com/open-webui/open-terminal.git</pre><p>Then open the Dockerfile and add all additional libraries that are required. For my goal as a Python engineer, pip is required and should be added to the Dockerfile. There is a section for adding custom packages; extend it as follows:</p><pre>...<br>RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends \<br>        python3-pip \<br>        tini \<br>        ...</pre><p>Build the image and provide a custom tag.</p><pre>docker build -f Dockerfile.slim -t open-terminal-custom-python:20260628 .</pre><h3>Extend Docker Compose File</h3><p>Add this to the compose file from my <a href="https://admantium.com/blog/llm37_open_webui_setup/">Open WebUI setup article</a>.</p><pre>open-webui-terminal:<br>    image: open-terminal-custom-python:20260628<br>    container_name: open-webui-terminal<br>    restart: unless-stopped<br>    env_file:<br>      - ./open-terminal.env<br>    volumes:<br>      - open-terminal:/home/user<br>    networks:<br>      - Open WebUI</pre><p>In the open-terminal.env file, enter the following value with a self-generated secret:</p><pre>OPEN_TERMINAL_API_KEY=REDACTED</pre><p>Then start the updated stack with docker compose up. The container logs should show the following:</p><pre>2026-06-28 17:09:37    ____                    _____                   _             _<br>2026-06-28 17:09:37   / __ \                  |_   _|                 (_)           | |<br>2026-06-28 17:09:37  | |  | |_ __   ___ _ __   | | ___ _ __ _ __ ___  _ _ __   __ _| |<br>2026-06-28 17:09:37  | |  | | &#39;_ \ / _ | &#39;_ \  | |/ _ | &#39;__| &#39;_ ` _ \| | &#39;_ \ / _` | |<br>2026-06-28 17:09:37  | |__| | |_) |  __| | | | | |  __| |  | | | | | | | | | | (_| | |<br>2026-06-28 17:09:37   \____/| .__/ \___|_| |_| \_/\___|_|  |_| |_| |_|_|_| |_|\__,_|_|<br>2026-06-28 17:09:37         | |<br>2026-06-28 17:09:37         |_|<br>2026-06-28 17:09:37<br>2026-06-28 17:09:37   Local:    http://localhost:8000<br>2026-06-28 17:09:37   Network:  http://172.18.0.3:8000<br>2026-06-28 17:09:37<br>2026-06-28 17:09:37   Warning: Listening on all network interfaces.<br>2026-06-28 17:09:37   Use --host 127.0.0.1 to restrict to this machine.<br>2026-06-28 17:09:37<br>2026-06-28 17:09:37   ┌─────────────────────────────────────────────────────────────┐<br>2026-06-28 17:09:37   │  ⚠  CORS is set to &#39;*&#39; (allow all origins)                 │<br>2026-06-28 17:09:37   │                                                             │<br>2026-06-28 17:09:37   │  Any website can make requests to this server.              │<br>2026-06-28 17:09:37   │  For production, restrict with:                             │<br>2026-06-28 17:09:37   │    --cors-allowed-origins https://your-domain.com           │<br>2026-06-28 17:09:37   └─────────────────────────────────────────────────────────────┘<br>2026-06-28 17:09:37<br>2026-06-28 17:09:38 INFO:     Started server process[3]<br>2026-06-28 17:09:38 INFO:     Waiting for application startup.<br>2026-06-28 17:09:38 INFO:     Application startup complete.<br>2026-06-28 17:09:38 INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)</pre><h3>Connecting Open WebUI with the Terminal Container</h3><p>Finally, the Open WebUI instance needs to be configured for access.</p><ul><li>Click on the user icon, then on Admin Panel</li><li>Click on Integrations, then on the + symbol next to Open Terminal</li><li>In the popup dialog, enter http://open-webui-terminal:8000 for a Docker-internal connection, and enter the API key that you generated above</li><li>Click on the small rounded-arrows symbol to test the connection, and then on the Save button</li></ul><p>The open-terminal Docker container logs should show the following message:</p><pre>2026-06-28 17:37:15 INFO:     172.18.0.2:55262 - &quot;GET /api/config HTTP/1.1&quot; 200 OK</pre><h3>Agent Task Tryout: Implementing a Python REST API Server App</h3><h3>First Run</h3><p>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.</p><p>Input prompt:</p><pre>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.</pre><p>To set this up, the following prompts will be executed one after another.</p><pre>Define a GitHub project from scratch for a tiny Python agent experiment. Create a repository named python-rest-api with a short README, .gitignore, app/main.py and app/config.json.</pre><p>From that first prompt alone, the LLM suggested the entire application stack. Here is an excerpt.</p><pre>Below is a minimal “from scratch” GitHub project structure you can create locally and then push to GitHub.<br><br>1) Repository root structure<br>  python-rest-api/<br>    README.md<br>    .gitignore<br>    app/<br>      main.py<br>      config.json<br>  2) Create the files<br>  README.md<br>  # python-rest-api<br>  A tiny Python REST API experiment for a minimal agent workflow.<br>  ## Run<br>   python -m venv .venv<br>  source .venv/bin/activate  # (Windows: .venv\Scripts\activate)<br>  pip install -r requirements.txt  # if you add dependencies later<br>  python app/main.py<br>  Endpoints<br>  GET /health - health check<br> <br>  app/main.py<br><br>  from __future__ import annotations<br>  import json<br>  import os<br>  from http.server import BaseHTTPRequestHandler, HTTPServer<br>  from pathlib import Path<br>  from typing import Any<br><br>  def load_config(config_path: Path) -&gt; dict[str, Any]:<br>      with config_path.open(&quot;r&quot;, encoding=&quot;utf-8&quot;) as f:<br>          return json.load(f)<br><br>  /..</pre><p>When asked whether those commands were actually executed, the model answered:</p><pre>No—I&#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.<br><br><br>What I did instead: I drafted the exact file contents and structure you can create locally, then commit/push.</pre><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/956/0*QaQQmsmq31FwnaYP.png" /></figure><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*bJJ8gpYYkODQRN5C.png" /></figure><p>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.</p><p>The GUI showed:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Rjts5G8AOJa6O-Ft.png" /></figure><p>Example message:</p><pre>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).<br><br>In other words:<br>I can suggest the command and interpret results if you paste them.<br>I can&#39;t directly read the stdout/stderr of your curl unless the execution environment/tool returns the command output back to me (which isn&#39;t happening here).<br>If you paste the exact curl output (including the HTTP status line and headers/body), I&#39;ll diagnose immediately.</pre><p>Similarily, getting the tool to actually run a curl call against the started app required multiple attempts.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/856/0*Efg-UzxQgB_pxnkY.png" /></figure><p>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?</p><h3>Second Run</h3><p>For this run, the following aspects were changed:</p><ul><li>Base model upgraded to gpt-5.5</li><li>Web search capability disabled</li><li>Web search and image generation tools disabled</li></ul><p>One prompt for the whole app.</p><pre>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.</pre><p>The model executed it flawlessly.</p><pre>Done. The repository was created at /app/projects/python-rest-api with:<br>- README.md<br>- .gitignore<br>- requirements.txt<br>- app/main.py<br>- app/config.json<br><br>Implemented behavior:<br>- GET /config in FastAPI<br>- reads app/config.json from disk<br>- returns parsed JSON<br>- handles:<br>- missing file with 404<br>- invalid JSON with 500<br>Notes from command output:<br>- 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<br>- File creation succeeded, and python3 -m compileall app successfully compiled app/main.py<br>- 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: &quot;list&quot;<br>If you want, I can also provide the exact file contents in a clean code block format.</pre><p>I could also ask it to start the web server and execute a curl request against the local endpoint.</p><pre>From /app/projects/python-rest-api, start the app on port 9000, then run curl against the config endpoints. Show the output of all commands.</pre><p>Answer:</p><pre>From the provided context, the app was started successfully on port 9000 from /app/projects/python-rest-api with Uvicorn.<br><br>Command<br>python3 -m uvicorn app.main:app --host 127.0.0.1 --port 9000<br>Output<br>INFO:     Started server process <br>INFO:     Waiting for application startup.<br>INFO:     Application startup complete.<br>INFO:     Uvicorn running on [http://127.0.0.1:9000](http://127.0.0.1:9000) (Press CTRL+C to quit)<br>Then curl was run against both config endpoints<br>Command<br>curl -i [http://127.0.0.1:9000/config](http://127.0.0.1:9000/config) ; echo &#39;---&#39; ; curl -i [http://127.0.0.1:9000/config/](http://127.0.0.1:9000/config/)<br>Output<br>HTTP/1.1 200 OK<br>date: Fri, 03 Jul 2026 16:56:45 GMT<br>server: uvicorn<br>content-length: 656<br>content-type: application/json<br>{&quot;models&quot;:[{&quot;id&quot;:&quot;gpt-4o-mini&quot;,&quot;object&quot;:&quot;model&quot;,&quot;owned_by&quot;:&quot;openai&quot;,&quot;context_window&quot;:128000,&quot;pricing&quot;:{&quot;input_per_1k_tokens&quot;:0.00015,&quot;output_per_1k_tokens&quot;:0.0006},&quot;capabilities&quot;:[&quot;chat&quot;,&quot;tools&quot;,&quot;json_mode&quot;]},{&quot;id&quot;:&quot;claude-3-5-sonnet&quot;,&quot;object&quot;:&quot;model&quot;,&quot;owned_by&quot;:&quot;anthropic&quot;,&quot;context_window&quot;:200000,&quot;pricing&quot;:{&quot;input_per_1k_tokens&quot;:0.003,&quot;output_per_1k_tokens&quot;:0.015},&quot;capabilities&quot;:[&quot;chat&quot;,&quot;vision&quot;,&quot;tools&quot;]},{&quot;id&quot;:&quot;llama-3.1-70b-instruct&quot;,&quot;object&quot;:&quot;model&quot;,&quot;owned_by&quot;:&quot;meta&quot;,&quot;context_window&quot;:131072,&quot;pricing&quot;:{&quot;input_per_1k_tokens&quot;:0.0009,&quot;output_per_1k_tokens&quot;:0.0009},&quot;capabilities&quot;:[&quot;chat&quot;,&quot;completion&quot;]}],&quot;default_model&quot;:&quot;gpt-4o-mini&quot;,&quot;object&quot;:&quot;list&quot;}<br>***<br>HTTP/1.1 307 Temporary Redirect<br>date: Fri, 03 Jul 2026 16:56:45 GMT<br>server: uvicorn<br>content-length: 0<br>location: [http://127.0.0.1:9000/config](http://127.0.0.1:9000/config)<br>Summary:<br>GET /config returned 200 OK with the parsed JSON config<br>terminal:6351ac...un_command<br>GET /config/ returned 307 Temporary Redirect to /config<br>terminal:6351ac...un_command</pre><h3>Conclusion</h3><p>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 docker-compose file. The agent was tasked with creating a Python REST API with a single endpoint at /config. In the first run with a gpt-5.4-nano model, the interaction was cumbersome because the model only executed commands after repeated clarification that it could run them. In the second run, with gpt-5.5 as the base model, two one-shot prompts created all files, started the server process, and ran a curl command against the endpoint to test the application. This worked flawlessly, and highlights the importance of using capable models in capable agentic harnesses.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d69b8104171d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Open WebUI: Admin Configuration Options in a Nutshell]]></title>
            <link>https://admantium.medium.com/open-webui-admin-configuration-options-in-a-nutshell-9279d5e10b95?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/9279d5e10b95</guid>
            <category><![CDATA[open-webui]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Thu, 01 Oct 2026 05:19:54 GMT</pubDate>
            <atom:updated>2026-10-01T07:02:50.001Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/1*UVnoxiuZId24abMWXj0RMQ.png" /></figure><p>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.</p><p>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.</p><p><em>The technical context of this article is </em><em>Open WebUI v0.9.6, published on 2026-06-01. The setup and configuration examples should also work with newer versions.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm40_open_webui_admin_configuration"><em>admantium.com</em></a>.</p><h3>Admin Configuration Entrypoint</h3><p>The admin user account has access to an additional settings dialog. It can be accessed by clicking the user icon and selecting Admin Panel.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1016/0*drdYFf_2YrpHIZnJ.png" /></figure><p>It is structured into four horizontal tabs: Users, Evaluations, Functions, Settings. The Settings 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.</p><h3>Model Management</h3><h3>Model Definition</h3><p>With Settings =&gt; Models, 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.</p><p>Here is an example export:</p><pre>[<br>  {<br>    &quot;id&quot;: &quot;gpt-5-mini&quot;,<br>    &quot;object&quot;: &quot;model&quot;,<br>    &quot;created&quot;: 1754425928,<br>    &quot;owned_by&quot;: &quot;openai&quot;,<br>    &quot;connection_type&quot;: &quot;external&quot;,<br>    &quot;name&quot;: &quot;gpt-5-mini&quot;,<br>    &quot;openai&quot;: {<br>      &quot;id&quot;: &quot;gpt-5-mini&quot;,<br>      &quot;object&quot;: &quot;model&quot;,<br>      &quot;created&quot;: 1754425928,<br>      &quot;owned_by&quot;: &quot;system&quot;,<br>      &quot;connection_type&quot;: &quot;external&quot;<br>    },<br>    &quot;provider&quot;: &quot;&quot;,<br>    &quot;urlIdx&quot;: 0,<br>    &quot;is_active&quot;: true<br>  }<br>]</pre><h3>Model Providers</h3><p>Open WebUI requires external LLM providers. Via Settings =&gt; Connections, different OpenAI API-compatible LLM endpoints and Ollama instances can be configured.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nqIjKq7oAEzYQhNn.png" /></figure><p>For direct OpenAI API connections, the toggle OpenAI API needs to be active. Then, with the + button next to Manage OpenAI API Connections, additional connections can be set up. Each one requires the following steps:</p><ul><li>Enter the API endpoint URL, e.g. <a href="https://api.openai.com/v1.">https://api.openai.com/v1.</a></li><li>Insert the API key.</li><li>Click on the double-arrow icon to validate the connection; a green popup appears to show success.</li></ul><p>For Ollama instances, the Ollama API toggle needs to be active too. Similarly, the + button next to Manage Ollama API Connections 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.</p><p>Two more options exist. The Direct Connections toggle enables non-admin users to add connections too. The Cache Base Model List 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.</p><h3>Model Ratings</h3><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MTEp_I15-GyU6ltp.png" /></figure><p>Via the Evaluations tab, or from Settings -&gt; Evaluations, two subfeatures can be accessed.</p><p>The Leaderboard is a full list of all configured models and captures individual users’ 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’ utilization of Open WebUI for their purposes, and is therefore better fitting than any public leaderboard and its scores.</p><p>The Feedback 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.</p><h3>Model Capabilities</h3><h3>Web Search</h3><p>For most use cases, web search is a mandatory requirement for fetching up-to-date information. This feature can be configured via Settings =&gt; Web Search.</p><p>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.</p><p>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.</p><p>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.</p><p>Here is an example of configuring the Brave search engine.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qDeQns2w63EeVs-b.png" /></figure><p>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.</p><h3>Code Execution</h3><p>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.</p><p>The Settings =&gt; Code Execution 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:</p><ul><li>A feature toggle for activation or deactivation.</li><li>The Python engine to be used, either <a href="https://pyodide.org/en/stable/">Pyodide</a>, which executes WebAssembly directly in your browser, or a connection to a locally running Jupyter Notebook environment.</li></ul><h3>Content Management</h3><h3>Documents</h3><p>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 Settings =&gt; Documents page provides complex options for this process - here is a screenshot.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5JF5zLydMc2tVnMH.png" /></figure><p>Configurable are the following aspects:</p><ul><li>Extraction Engine: Choose from third-party OCR providers like <a href="https://www.datalab.to/">Datalab</a>, <a href="https://docs.mistral.ai/studio-api/document-processing/basic_ocr">Mistral OCR</a>, or <a href="https://github.com/PaddlePaddle/PaddleOCR">PaddleOCR</a>, or configure self-hosted instances of <a href="https://tika.apache.org/">Tika</a>, <a href="https://github.com/docling-project/docling">Docling</a>, and <a href="https://github.com/opendatalab/MinerU">MinerU</a>. Instance-specific details, at least a URL and access token, need to be provided too.</li><li>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.</li><li>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 <a href="https://www.sbert.net/">Sentence Transformers</a> model, a connection to local <a href="https://docs.ollama.com/index">Ollama</a>, or outbound connections to <a href="https://platform.openai.com/docs/api-reference/introduction">OpenAI</a> or <a href="https://learn.microsoft.com/en-gb/azure/ai-services/openai/">Azure OpenAI</a>. 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.</li><li>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:</li><li>Full Context Mode: 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.</li><li>Hybrid Search: When enabled, the internally triggered search combines keyword and semantic search in its vector DB of embedded chunks.</li><li>Reranking Batch Size: A technical setting that determines how many chunks are grouped together during a reranking of results.</li><li>Top K: The absolute number of chunks that are returned.</li><li>RAG Template: The internal system prompt that the model uses to trigger a keyword or semantic search in the vector database.</li></ul><h3>Images</h3><p>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.</p><p>The configuration dialog at Settings =&gt; Image is separated into two sections for image generation and image editing, as shown in the following picture.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vJ4prR9rZ_wJKfC4.png" /></figure><p>Both sections follow the same set of required inputs:</p><ul><li>A toggle to activate the feature.</li><li>The image generation engine, which can be <a href="https://openai.com/">OpenAI</a>, <a href="https://www.comfy.org/">ComfyUI</a>, <a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui">AUTOMATIC1111</a>, and <a href="https://ai.google.dev/gemini-api">Gemini</a>.</li><li>The base URL for the selected provider (upstream provider URL or local endpoint).</li><li>An API key for authentication.</li><li>The API version that is queried for the image generation or editing request.</li><li>Additional parameters are passed as the request body to the configured model.</li></ul><h3>User Management</h3><p>The Users 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.</p><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*o7dhblKnm4kHfLcf.png" /></figure><p>Other user settings are a bit hidden. In Settings =&gt; General, the following options are presented:</p><ul><li>User signup: Enable or disable new signups, and determine the default role and group for new users.</li><li>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.</li><li>API keys: When this option is enabled, users can generate custom JWT access keys for opening Open WebUI’s internal API to external systems.</li><li>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.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yjMsG9be8Jxne3-m.png" /></figure><h3>Plugin Management</h3><p>For extending Open WebUI, two mechanisms exist: Pipelines, now deprecated and not further explained here, and functions.</p><p>The function management GUI, accessible via Settings =&gt; Functions, allows you to create, read, update, and delete configured functions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*A5bzgiWQFlEGoGE8.png" /></figure><p>A complete coverage of functions is outside the scope of this article, but the following overview gives a summary of their capabilities.</p><ul><li>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.</li><li>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.</li><li>Modify Model Outputs (Outlet Function): Adjust the AI’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.</li><li>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.</li><li>Events: A new feature published with Open WebUI v0.10.0 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’s behavior, enabling automatic routines to be triggered.</li></ul><h3>General Features &amp; Settings</h3><h3>User Features</h3><p>In Settings -&gt; General, at the bottom section, a host of general features can be configured.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YxD0mBGCCy52rz5p.png" /></figure><p>Most of them are tied to which features users have access to.</p><ul><li>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.</li><li>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 evaluation feature.</li><li>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.</li><li>Calendar: Enables the user-specific calendar feature, allowing custom entries and programmable event scheduling to trigger automations.</li><li>Automations: Automations allow users to trigger predefined instructions with a specific model, effectively starting an asynchronous chat. The toggle enables this feature.</li><li>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 chat_response. The event payload includes the chat ID, title, and last_message. It only triggers for asynchronous, not interactive, user chats.</li></ul><p>Additional beta features can be configured too:</p><ul><li>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.</li><li>Notes: This user feature allows custom text notes to be created and used in chats. It needs to be enabled by the admin.</li><li>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 <a href="https://docs.openwebui.com/features/channels/">Channels</a>.</li></ul><h3>Interface Settings</h3><p>In Settings -&gt; General, following interface settings are exposed.</p><ul><li>User Status: This toggle enables active reporting of user status, showing which users are logged in and using the Open WebUI instance.</li><li>Response Watermark: In this field, a custom text can be entered, which is appended to each system message, visibly in user chats.</li><li>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.</li></ul><h3>System Settings</h3><p>The admin user can configure externally visible URLs via Settings -&gt; General.</p><ul><li>WebUI URL: When the Open WebUI instance generates events, it includes its public URL string from this field.</li><li>Webhook URL: Defines the external WebHook API endpoint to which all system events are sent.</li></ul><h3>Conversation Features</h3><p>Open WebUI generates background tasks for generating the conversation title, follow-up questions, tags, RAG, and web search queries.</p><p>In Settings =&gt; Interface, 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.</p><p>Also, prompts for autocompletion and tool function calling can be defined, which can be helpful when tool calls are not generated or properly executed.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*w_3aR_Gss4zJQCj3.png" /></figure><h3>Speech Settings</h3><p>In Settings =&gt; Audio, several aspects of Speech-to-Text and Text-to-Speech become configurable.</p><ul><li>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 audio/* and the video/webm format.</li><li>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 <a href="https://developers.openai.com/api/docs/guides/speech-to-text">OpenAI</a>, <a href="https://deepgram.com/product/speech-to-text">Deepgram</a>, <a href="https://learn.microsoft.com/azure/ai-services/speech-service/">Azure AI Speech</a>, or <a href="https://docs.mistral.ai/studio-api/audio/speech_to_text">Mistral AI</a>.</li><li>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 <a href="https://github.com/microsoft/SpeechT5">SpeechT5</a>, or c) one of the external providers <a href="https://developers.openai.com/api/docs/guides/text-to-speech">OpenAI</a>, <a href="https://elevenlabs.io/docs/overview/capabilities/text-to-speech">ElevenLabs</a>, and <a href="https://learn.microsoft.com/en-us/azure/ai-services/speech-service/index-text-to-speech">Azure AI Speech</a>.</li><li>Response Splitting: Configure how natural language pauses are recognized in the source material.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_RXfwb9dcx90M6sI.png" /></figure><h3>Operations</h3><h3>Database Backup</h3><p>The Settings =&gt; Database dialog is intended for storing or importing the configuration database or settings. Specifically, it offers the following functions:</p><ul><li>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.</li></ul><pre>{<br>  &quot;version&quot;: 0,<br>  &quot;ui&quot;: {<br>    &quot;enable_signup&quot;: false<br>  },<br>  &quot;openai&quot;: {<br>    &quot;enable&quot;: true,<br>    &quot;api_base_urls&quot;: [<br>      &quot;https://api.openai.com/v1&quot;,<br>      &quot;https://api.openai.com/v1&quot;<br>    ]<br>    // ...<br>  },<br>  &quot;models&quot;: {<br>    &quot;base_models_cache&quot;: false<br>  },<br>  &quot;rag&quot;: {<br>    &quot;embedding_engine&quot;: &quot;&quot;,<br>    &quot;embedding_model&quot;: &quot;sentence-transformers/all-MiniLM-L6-v2&quot;,<br>    &quot;embedding_batch_size&quot;: 1,<br>    &quot;enable_async_embedding&quot;: true,<br>    &quot;embedding_concurrent_requests&quot;: 0<br>    // ...<br>  },<br>  &quot;google_drive&quot;: {<br>    &quot;enable&quot;: false<br>  },<br>  &quot;onedrive&quot;: {<br>    &quot;enable&quot;: false<br>  },<br>  &quot;terminal_server&quot;: {<br>    &quot;connections&quot;: [<br>      {<br>        &quot;id&quot;: &quot;6351ac6b-cb9e-48d3-bf87-d64da77f93ff&quot;,<br>        &quot;name&quot;: &quot;&quot;,<br>        &quot;enabled&quot;: true,<br>        &quot;url&quot;: &quot;http://open-webui-terminal:8000&quot;<br>        // ...<br>      }<br>    ]<br>  },<br>  &quot;tool_server&quot;: {<br>    &quot;connections&quot;: []<br>  }<br>}</pre><p>Database: Exports the internal database that contains the following items:</p><ul><li>User accounts and authentication data.</li><li>Chat history and conversation metadata.</li><li>App settings and configuration (similar to the JSON export).</li><li>Model/config entries.</li><li>File-related records and other system state.</li><li>RAG-related non-vector metadata.</li></ul><p>Chats: Exports a JSON document with all chats. Here is a small excerpt.</p><pre>[<br>  {<br>    &quot;id&quot;: &quot;88dfd8b0-6758-45d9-bf00-bdc540b2253e&quot;,<br>    &quot;user_id&quot;: &quot;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&quot;,<br>    &quot;title&quot;: &quot;Daily News Check&quot;,<br>    &quot;chat&quot;: {<br>      &quot;title&quot;: &quot;Daily News Check&quot;,<br>      &quot;models&quot;: [<br>        &quot;gpt-4o&quot;<br>      ],<br>      &quot;history&quot;: {<br>        &quot;currentId&quot;: &quot;4f914f3d-b089-4563-b139-d2562b1d3ad8&quot;,<br>        &quot;messages&quot;: {<br>          &quot;b8051ec5-fa8b-4945-8401-7c5619066d78&quot;: {<br>            &quot;id&quot;: &quot;b8051ec5-fa8b-4945-8401-7c5619066d78&quot;,<br>            &quot;parentId&quot;: null,<br>            &quot;role&quot;: &quot;user&quot;,<br>            &quot;content&quot;: &quot;Check the Daily News, write a summary.&quot;,<br>            &quot;childrenIds&quot;: [<br>              &quot;4f914f3d-b089-4563-b139-d2562b1d3ad8&quot;<br>            ],<br>            &quot;timestamp&quot;: 1784888705,<br>            &quot;models&quot;: [<br>              &quot;gpt-4o&quot;<br>            ]<br>          }<br>        }<br>      }<br>    }<br>  }<br>]</pre><h3>Version Information</h3><p>In Settings -&gt; General, at the top of various other options, the current version, banners for accessing the project’s Discord server, social media presence, and GitHub repo are shown.</p><h3>Conclusion</h3><p>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; Settings, and g) Operations.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9279d5e10b95" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Open WebUI: Complete Guide to User Settings]]></title>
            <link>https://admantium.medium.com/open-webui-complete-guide-to-user-settings-ee30e09346a9?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/ee30e09346a9</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[open-webui]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Mon, 21 Sep 2026 15:52:54 GMT</pubDate>
            <atom:updated>2026-09-21T15:52:54.055Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/703/1*esyb5mhkc9sG34Q2hgbdkA.png" /></figure><p>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.</p><p>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.</p><p><em>The technical context of this article is </em><em>Open WebUI v0.9.6, published on 2026-06-01. The setup and configuration examples should also work with newer versions.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm39_open_webui_user_configuration/"><em>admantium.com</em></a>.</p><h3>User Settings Entrypoint</h3><p>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 1, and an option to open user settings, depicted by 2.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lTYChSRT2cyaWi0I.png" /></figure><p>Each setting group is explored in the next sections.</p><p><em>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.</em></p><h3>User Features</h3><p>Customizable user features determine the extent of functions available in chats. They can be grouped into four sections.</p><h3>Information and Reflection</h3><h4>Archived Chats</h4><p>Chats in the “Folder” sections or under the “Chats” section can be archived. This option shows all archived chats, from which they can be restored, exported, or permanently deleted.</p><h4>Documentation</h4><p>This menu entry is a direct link to the documentation page <a href="https://docs.openwebui.com/">docs.openwebui.com</a>.</p><h4>Releases</h4><p>Similarly, this opens the GitHub releases page with details of all <a href="https://github.com/open-webui/openwebui/releases">Open WebUI releases</a>.</p><h4>Keyboard Shortcuts</h4><p>Displays a graphical overview of all defined keyboard shortcuts.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/780/0*yQPd1vI9-9y0t_ge.png" /></figure><h3>Personal Documents</h3><h4>Notes</h4><p>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 <a href="https://admantium.com/blog/llm38_open_webui_chat_features/">Open WebUI features</a>.</p><h4>Calendar</h4><p>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.</p><p>Here is an overview of a calendar with scheduled automations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ioSMnZd6s--tQ4Ny.png" /></figure><h3>Model Customization</h3><h4>Workspace</h4><p>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:</p><ul><li>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.</li><li>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.</li><li>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 /.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/881/0*LLhFJO3fI-epjVEZ.png" /></figure><ul><li>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 $ prefix needs to be used.</li><li>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.</li></ul><h3>Model Utilization</h3><h4>Automations</h4><p>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.</p><h4>Playground</h4><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*65NcKAVvOqk6regP.png" /></figure><h3>User Settings</h3><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*--y3Yh2pQTpCuMdH.png" /></figure><p>Options are extensive and are explained in their individual sections.</p><h3>Account Settings</h3><p>In the Account group, customization like name, user icon, background information, birth date, and the ability to change the login password are provided.</p><h3>GUI &amp; Interface Settings</h3><p>Several different sections contribute to this group.</p><p>The General section allows a mixed set of configuration options. Related to the GUI are the theme, the language, and whether to show notifications or not.</p><p>In the Interface section, a large number of options are rendered.</p><ul><li>UI &amp; Notifications: Scale, notification sounds, and haptic feedback options when Open WebUI is accessed on mobile phones.</li><li>Chat: Chat bubble design, custom background, fading effect for streaming tokens, markdown formatting, quick action buttons.</li><li>Chat automation: Title generation, follow-up generation, tag generation.</li></ul><p>Here is an example of a custom chat interface with a changed background image:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*8bxNyK1xT1V7hImV.png" /></figure><p>The Audio 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 <a href="https://www.npmjs.com/package/kokoro-js?activeTab=versions">kokoro.js</a> can be used. For readout, different voice sets can be selected.</p><h3>Model Settings</h3><p>The General 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 temperature (randomness factor), top_k, top_p, min_p (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.</p><p>Here is a screenshot of the available settings.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*spuo-aHe_pRfxa0n.png" /></figure><p>Additionally, the Personalization 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.</p><h3>Tools</h3><p>The Integrations section allows user chats to access external systems. Two specific categories exist.</p><ul><li>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 <a href="https://github.com/open-webui/openapi-servers/tree/main/servers/sql">SQL server</a>.</li><li>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 <a href="https://github.com/open-webui/open-terminal">open-terminal</a>.</li></ul><h3>Information &amp; Reflection</h3><p>In Data Controls, 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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0nMLrhRnBGDrgAet.png" /></figure><p>The About section shows information and badges to access the Discord, X, and GitHub accounts of Open WebUI.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/703/0*Kaok1vCfUPV9Hng_.png" /></figure><h3>Conclusion</h3><p>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’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.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ee30e09346a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Open WebUI: Chat Interface & Context Options]]></title>
            <link>https://admantium.medium.com/open-webui-chat-interface-context-options-d0c2ff57275d?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/d0c2ff57275d</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[open-webui]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Thu, 10 Sep 2026 05:41:02 GMT</pubDate>
            <atom:updated>2026-09-10T05:41:02.090Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7kP1Hl80wZJzcW5noJx5jg.png" /></figure><p>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.</p><p>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.</p><p><em>The technical context of this article is </em><em>openwebui v0.9.6, published on 2026-06-01. The setup and configuration examples should also work with newer versions.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm38_open_webui_chat_features/"><em>admantium.com</em></a>.</p><h3>Open WebUI Startpage</h3><p>Open WebUI’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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*G6fq_QZtKRdbbef3.png" /></figure><p>In this view, the following options can be accessed:</p><ul><li>New Chat: Reloads the current window with a new chat on the right panel side</li><li>Search: Searches for keywords in past conversations and also allows starting a new conversation or creating a new node</li><li>Notes: Create markdown-structured files that serve as structural content for your conversations</li><li>Workspace: Create customized models with a base model, prompts, tools, and knowledge bases</li><li>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</li><li>Chats: A list of past interactions</li><li>User Icon: Access additional settings specific to the user</li></ul><p>Features related to the chat interface are explored in the next sections.</p><h3>Basic Chat Features</h3><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*L_X94UEo0zWJFUBA.png" /></figure><p>When hovering over a user chat bubble, the following functions are shown:</p><ul><li>Edit: Changes the content of the message but does not trigger a new answer generation from the model</li><li>Copy: Puts the message content into the computer’s clipboard</li><li>Delete: Deletes this message and the immediately following LLM answer</li></ul><p>The model answer bubble offer these features:</p><ul><li>Edit: Opens an inline editor to modify the LLM answer and, when saved, persists this answer to the internal chat log</li><li>Copy: Copies the complete message, including its formatting, to the computer’s memory</li><li>Read aloud: Starts the browser’s text-to-speech integration to read the answer</li><li>Good Response &amp; Bad Response: Rate a particular LLM answer, see below for an explanation</li><li>Continue Response: Sends the user message and the assistant message again, which can extend the original answer</li><li>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</li></ul><p>An interesting feature is the option to rate the answer, called “Good Response” and “Bad Response”. 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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/918/0*mO9DcQOZQCREyYVQ.png" /></figure><p>Additionally to storing locally, you can also add a public review of this model which is published on the <a href="https://openwebui.com/models">Open WebUI model rating page</a>, where you can provide a review for this specific model.</p><h3>Notes</h3><p>Notes are named files stored internally in your Open WebUI instance.</p><p>The notes menu shows a list of browsable and searchable notes, and you can add a new note or open an existing one.</p><p>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.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wAqRiDumD92ockab.png" /></figure><p>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 search_notes or write_note can access notes dynamically.</p><h3>Workspace Knowledge</h3><p>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.</p><p>Follow these steps:</p><ul><li>In the main GUI click on Workspace</li><li>In the horizontal menu area click on Knowledge and then on the button + New Knowledge</li><li>Fill in the following form then click on Create Knowledge</li></ul><p>This results in a new screen showing a list of sources. With the + symbol, the knowledge base can be edited.</p><p>New original resources can be added with these options:</p><ul><li>Upload files: Upload files from your computer supporting text documents PDF DOC and CSV files but not images</li><li>Upload directory: Select a local directory which triggers individual file uploads for all of its contained and supported files</li><li>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</li><li>Add text content: This option opens an editor field into which you can paste any text information</li></ul><p>The structure and content of the knowledge base can be altered as follows:</p><ul><li>New directory: Create a logical node to help structure documents</li><li>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</li><li>Reset: Completely deletes all stored content from the knowledge base</li></ul><p>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.</p><p>Here is a screenshot of a knowledge base that includes my blog articles about Claude Code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/962/0*YAXSwr-9ymhTuu3f.png" /></figure><h3>Providing Chat Context</h3><p>Open WebUI offers several options to provide context to your chat interactions.</p><p>Here is a screenshot where a note is already attached and additional sources can be added.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/932/0*NUcwBAcDLKU9sXms.png" /></figure><h3>Original Documents</h3><p>New information is injected into the conversation as follows:</p><ul><li>Upload files: Supported documents are parsed and their full content attached to the next message</li><li>Capture: Opens the browser’s function to make a screenshot of specific windows or the entire screen</li><li>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</li></ul><p>Two aspects should be noted:</p><ul><li>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</li></ul><pre>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:49.769+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;192.168.65.1:45505 - \&quot;POST /api/v1/files/?process=true HTTP/1.1\&quot; 200&quot;, &quot;caller&quot;: &quot;uvicorn.protocols.http.httptools_impl:send:483&quot;}<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:51.487+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;192.168.65.1:45505 - \&quot;GET /api/v1/files/db47a1a8-3f19-4a5c-afcd-1cdb056306c1/process/status?stream=true HTTP/1.1\&quot; 200&quot;, &quot;caller&quot;: &quot;uvicorn.protocols.http.httptools_impl:send:483&quot;}<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:51.518+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;Using markdown header text splitter&quot;, &quot;caller&quot;: &quot;open_webui.routers.retrieval:save_docs_to_vector_db:1412&quot;}<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:51.521+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;generating embeddings for file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&quot;, &quot;caller&quot;: &quot;open_webui.routers.retrieval:save_docs_to_vector_db:1490&quot;}<br>Batches: 100%|██████████| 16/16 [00:02&lt;00:00,  7.88it/s]<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:53.569+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;embeddings generated 16 for 16 items&quot;, &quot;caller&quot;: &quot;open_webui.routers.retrieval:save_docs_to_vector_db:1536&quot;}<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:53.570+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;adding to collection file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&quot;, &quot;caller&quot;: &quot;open_webui.routers.retrieval:save_docs_to_vector_db:1548&quot;}<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:53.840+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;added 16 items to collection file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&quot;, &quot;caller&quot;: &quot;open_webui.routers.retrieval:save_docs_to_vector_db:1554&quot;}<br>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:16:53.840+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;added 1 items to collection file-db47a1a8-3f19-4a5c-afcd-1cdb056306c1&quot;, &quot;caller&quot;: &quot;open_webui.routers.retrieval:process_file:1730&quot;}</pre><ul><li>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</li></ul><pre>open-webui  | {&quot;ts&quot;: &quot;2026-06-21T08:34:27.873+00:00&quot;, &quot;level&quot;: &quot;info&quot;, &quot;msg&quot;: &quot;query_doc:result [[&#39;1c2776cd-b009-4d43-b20e-7f400b31269d&#39;, &#39;08ea65ce-4c62-42f0-a897-6d2cbc0e2bd1&#39;, &#39;ae5f230c-ad8b-41a2-8d43-eaeedd75db99&#39;]] [[{&#39;source&#39;: &#39;claude01_introduction.md&#39;, &#39;start_index&#39;: 2434, &#39;hash&#39;: &#39;3e1955b782967e3d3ba5eed557e3c6a1de1b7c930b8267bd8ad76c122d5834c6&#39;, &#39;file_id&#39;: &#39;db47a1a8-3f19-4a5c-afcd-1cdb056306c1&#39;, &#39;embedding_config&#39;: \&quot;{&#39;engine&#39;: &#39;&#39;, &#39;model&#39;: &#39;sentence-transformers/all-MiniLM-L6-v2&#39;}\&quot;, &#39;created_by&#39;: &#39;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&#39;, &#39;name&#39;: &#39;claude01_introduction.md&#39;}, {&#39;embedding_config&#39;: \&quot;{&#39;engine&#39;: &#39;&#39;, &#39;model&#39;: &#39;sentence-transformers/all-MiniLM-L6-v2&#39;}\&quot;, &#39;created_by&#39;: &#39;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&#39;, &#39;source&#39;: &#39;claude01_introduction.md&#39;, &#39;start_index&#39;: 1753, &#39;name&#39;: &#39;claude01_introduction.md&#39;, &#39;file_id&#39;: &#39;db47a1a8-3f19-4a5c-afcd-1cdb056306c1&#39;, &#39;hash&#39;: &#39;3e1955b782967e3d3ba5eed557e3c6a1de1b7c930b8267bd8ad76c122d5834c6&#39;}, {&#39;hash&#39;: &#39;3e1955b782967e3d3ba5eed557e3c6a1de1b7c930b8267bd8ad76c122d5834c6&#39;, &#39;file_id&#39;: &#39;db47a1a8-3f19-4a5c-afcd-1cdb056306c1&#39;, &#39;embedding_config&#39;: \&quot;{&#39;engine&#39;: &#39;&#39;, &#39;model&#39;: &#39;sentence-transformers/all-MiniLM-L6-v2&#39;}\&quot;, &#39;start_index&#39;: 721, &#39;created_by&#39;: &#39;b5b63a0d-ab5c-463e-ac3f-5ceacb6f3f94&#39;, &#39;source&#39;: &#39;claude01_introduction.md&#39;, &#39;name&#39;: &#39;claude01_introduction.md&#39;}]]&quot;, &quot;caller&quot;: &quot;open_webui.retrieval.utils:query_doc:285&quot;}</pre><h3>Stored Documents and Knowledge Base</h3><p>When adding existing information, several types of documents can be used:</p><ul><li>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</li><li>Attach Notes: Choose from any created note that is added as message context</li><li>Attach Knowledge: Attach the complete knowledge database from a workspace</li><li>Reference Chats: Add a complete conversation as context It includes all user messages system messages and any other added context</li></ul><h3>Conclusion</h3><p>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.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d0c2ff57275d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LLM Agent Tools: Setup & Installation of OpenWeb UI]]></title>
            <link>https://admantium.medium.com/llm-agent-tools-setup-installation-of-openweb-ui-e8763a964a99?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8763a964a99</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[open-webui]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Mon, 31 Aug 2026 04:26:32 GMT</pubDate>
            <atom:updated>2026-08-31T04:26:32.632Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7kP1Hl80wZJzcW5noJx5jg.png" /></figure><p>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.</p><p>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.</p><p><em>The technical context of this article is </em><em>openwebui v0.9.6, published on 2026-06-01. The setup and configuration examples should also work with newer versions.</em></p><p><em>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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm37_open_webui_setup/"><em>admantium.com</em></a>.</p><h3>Setup</h3><p>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.</p><p>For Open WebUI, complete Docker containers for all releases are published automatically. Check the available tags, then download the required container. For v0.9.6, execute the following command:</p><pre>docker pull ghcr.io/open-webui/open-webui:v0.9.6</pre><p>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:</p><pre>docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui ghcr.io/open-webui/open-webui:v0.9.6</pre><p>Then access the application at http://localhost:3000 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 docker-compose.yml file, which tracks the applied configuration options and also persists the created data as a volume.</p><h3>Docker Compose Configuration</h3><p>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.</p><p>Create the following file structure:</p><pre>.<br>├── docker-compose.yml<br>└── .open-webui.env</pre><p>Use the following template for the docker-compose.yml file as a kickstart.</p><pre>name: openwebui<br><br>services:<br>  open-webui:<br>    image: ghcr.io/open-webui/open-webui:v0.9.6<br>    container_name: open-webui<br>    env_file:<br>      - ./open-webui.env<br>    ports:<br>      - &quot;3000:8080&quot;<br>    restart: unless-stopped<br>    volumes:<br>      - open-webui-data:/app/backend/data<br>    networks:<br>      - openwebui<br>networks:<br>  openwebui:<br>    name: openwebui<br>    external: true<br>volumes:<br>  open-webui-data:<br>    name: open-webui-data<br>    driver: local</pre><p>Next, add the following .open-webui.env file with a minimal configuration:</p><pre>OPENWEBUI_PORT=3000</pre><p>Only once, you need to run the following command:</p><pre>docker network create openwebui</pre><p>Then start the container with the following command:</p><pre>docker compose up open-webui</pre><p>It should print these log messages, indicating a successful initial setup.</p><pre>docker compose up open-webui<br><br>open-webui-manual  | No WEBUI_SECRET_KEY environment variable set, loading from file.<br>open-webui-manual  | Generating new WEBUI_SECRET_KEY...<br>open-webui-manual  | Loading WEBUI_SECRET_KEY from .webui_secret_key<br>...<br>open-webui-manual  | INFO  [alembic.runtime.migration] Context impl SQLiteImpl.<br>open-webui-manual  | INFO  [alembic.runtime.migration] Will assume non-transactional DDL.<br>open-webui-manual  | INFO  [alembic.runtime.migration] Running upgrade  -&gt; 7e5b5dc7342b<br>...<br>open-webui-manual  |<br>open-webui-manual  |  ██████╗ ██████╗ ███████╗███╗   ██╗    ██╗    ██╗███████╗██████╗ ██╗   ██╗██╗<br>open-webui-manual  | ██╔═══██╗██╔══██╗██╔════╝████╗  ██║    ██║    ██║██╔════╝██╔══██╗██║   ██║██║<br>open-webui-manual  | ██║   ██║██████╔╝█████╗  ██╔██╗ ██║    ██║ █╗ ██║█████╗  ██████╔╝██║   ██║██║<br>open-webui-manual  | ██║   ██║██╔═══╝ ██╔══╝  ██║╚██╗██║    ██║███╗██║██╔══╝  ██╔══██╗██║   ██║██║<br>open-webui-manual  | ╚██████╔╝██║     ███████╗██║ ╚████║    ╚███╔███╔╝███████╗██████╔╝╚██████╔╝██║<br>open-webui-manual  |  ╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═══╝     ╚══╝╚══╝ ╚══════╝╚═════╝  ╚═════╝ ╚═╝<br>open-webui-manual  |<br>open-webui-manual  |<br>open-webui-manual  | v0.9.6 - building the best AI user interface.<br>open-webui-manual  |<br>open-webui-manual  | https://github.com/open-webui/open-webui<br>open-webui-manual  |</pre><p>Two options exist for the initial onboarding; see the next two paragraphs.</p><h3>Manual Onboarding</h3><p>The first step is to create an admin account. Access the application at http://localhost:3000 and fill out the shown fields.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/759/0*LxxMgjSfq62e3Qur.png" /></figure><p>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 .open-webui.env file so that the admin account and other settings are controlled and persisted between container restarts. This is explained in the next section.</p><h3>Onboarding with Config File</h3><p>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 <a href="https://docs.openwebui.com/reference/env-configuration#general">official documentation</a> for all options.</p><p>What you should also persist is the WEBUI_SECRET_KEY. 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 /app/backend/.webui_secret_key, and add it too.</p><p>Here is the extended .open-webui.env with all options.</p><pre># Port, persistence, logging<br>WEBUI_URL=http://localhost:8080<br>ENABLE_PERSISTENT_CONFIG=True<br>GLOBAL_LOG_LEVEL=INFO<br>LOG_FORMAT=json<br>WEBUI_SECRET_KEY=REDACTED<br><br># Only allow one pre-configured admin user<br>WEBUI_ADMIN_NAME=Admin<br>WEBUI_ADMIN_EMAIL=REDACTED<br>WEBUI_ADMIN_PASSWORD=REDACTED<br>ENABLE_SIGNUP=False<br>ENABLE_LOGIN_FORM=True<br>ENABLE_PASSWORD_AUTH=True<br>ENABLE_PASSWORD_CHANGE_FORM=True<br># Better privacy<br>ENABLE_ADMIN_ANALYTICS=False<br>ENABLE_PUBLIC_ACTIVE_USERS_COUNT=False<br>ENABLE_USER_STATUS=False<br>ENABLE_EASTER_EGGS=False<br>ENABLE_OTEL_LOGS=False</pre><p>Now restart the container once, and from then on all settings persist.</p><pre>docker compose restart open-webui</pre><p>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 ENABLE_PERSISTENT_CONFIG=True, then restart it. If there is a further problem, you can also set RESET_CONFIG_ON_START=true to delete the database, or take the final option to completely delete the Docker container and the volume.</p><h3>Model Configuration</h3><p>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.</p><p>For brevity, let’s invoke the ChatGPT API directly.</p><p>First, create an OpenAI API key as follows:</p><ul><li>Log in to the OpenAI service</li><li>Go to the <a href="https://platform.openai.com/api-keys">API key page</a></li><li>Click the “+ Create New Secret Key” button, provide a name, and copy the key from the popup</li></ul><p>Second, configure the endpoint in Open WebUI:</p><ul><li>Access the Open WebUI dashboard</li><li>Click on the admin user icon in the bottom-left corner, and then click “Admin Panel”</li><li>In the horizontal tab bar, click “Settings,” then “Connections”</li><li>Disable all toggles from the bottom up</li><li>Enable the “OpenAI API” toggle</li><li>Click the “+” symbol next to “Manage OpenAI API Connections”</li></ul><p>Now, the following dialogue should appear.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zF1QP2rMN7LgeGYD.png" /></figure><ul><li>For the API endpoint URL, enter <a href="https://api.openai.com/v1">https://api.openai.com/v1</a></li><li>Enter your created API key</li><li>Click on the double-arrow icon to validate the connection; a green popup appears to show success</li></ul><p>Finally, you can start a new chat from the dashboard.</p><h3>Conclusion</h3><p>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 docker-compose.yml and .env 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.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8763a964a99" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Complete OpenClaw Installation Guide with Telegram Communication Channel]]></title>
            <link>https://admantium.medium.com/complete-openclaw-installation-guide-with-telegram-communication-channel-9f2c91f689a0?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/9f2c91f689a0</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[openclaw]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Thu, 20 Aug 2026 05:11:57 GMT</pubDate>
            <atom:updated>2026-08-20T05:11:57.335Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FU1rO83O_5wfb6RKCa8rwg.png" /></figure><p>In 2026, agentic AI tools and frameworks generated much interest from technical and non-technical users alike. On the forefront of all of these tools is OpenClaw, the most popular open-source project that catapulted agents into mainstream usage.</p><p>This article covers the complete installation steps and setup. You will learn how to install OpenClaw on your local computer, set up Telegram as the communication channel, and perform essential security hardening.</p><p><em>The technical context of this article is </em><em>OpenClaw v2026.6.11 released 2026-06-30. All provided information and command examples should be valid with newer versions too, barring an update of the CLI commands&#39; syntax. However, configuration details differ between OpenClaw versions, and therefore, you should check the most recent documentation guidelines as well.</em></p><p><em>While I’m 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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm36_open_claw_installation/"><em>admantium.com</em></a>.</p><h3>Prerequisites</h3><p>To install and run OpenClaw, you need a computer with either Linux or Windows, and the NodeJS library installed. This opens the option to use a spare laptop or computer, a dedicated VPS like several other installation guides explain, or even just a local Raspberry Pi. The only crucial requirements are available CPU and RAM: 2GB RAM and 2 CPUs are the minimal requirements, and 4GB RAM and 4 vCPUs are sufficient for an installation that produces a medium or high system load.</p><p>PlatformMinimumRecommendedNotesRaspberry PiRaspberry Pi 3+Raspberry Pi 4+32-bit OS supportedLinux x64Ubuntu 20.04+Ubuntu 22.04+Debian/Ubuntu derivativesCloud VPS2GB RAM, 2 vCPU4GB RAM, 4 vCPUAWS EC2, DigitalOcean, etc.</p><p>As for the software, only NodeJS is strictly required. If you want to use Docker for the hosting environment, you need to ensure that a proper version is installed as well.</p><p>LibrariesMinimumRecommendedNodeJSv22.19v24Dockerv20.10+v24.0+</p><h3>Installation</h3><p>OpenClaw can be installed in three ways: As a Docker container that includes all dependencies, as a bash script that checks and installs missing dependencies, or just by adding the NPM packages.</p><p>In a freshly installed, current Linux distribution, adding the NPM package is sufficient. Simply run the following command.</p><pre>npm i -g openclaw@2026.6.11</pre><p>Installation can take up to several minutes. Once completed, a unified OpenClaw process starts which creates both a gateway process and the dashboard.</p><p>An essential command with which to verify the installation, and to identify any issues, is openclaw doctor. Run it once to ensure the installation succeeded, but stop before making any configuration.</p><pre>openclaw doctor<br><br><br>🦞 OpenClaw 2026.6.11 (4dcc39c) - Making &#39;I&#39;ll automate that later&#39; happen now.<br><br>▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄<br>██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██<br>██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██<br>██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██<br>▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀<br>                  🦞 OPENCLAW 🦞<br><br>┌  OpenClaw doctor<br>│<br>◇  Startup optimization ─────────────────────────────────────────────────────────────────────╮<br>│                                                                                            │<br>│  - NODE_COMPILE_CACHE is not set; repeated CLI runs can be slower on small hosts (Pi/VM).  │<br>│  - OPENCLAW_NO_RESPAWN is not set to 1; set it to avoid extra startup overhead from        │<br>│    self-respawn.                                                                           │<br>│  - Suggested env for low-power hosts:                                                      │<br>│    export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache                               │<br>│    mkdir -p /var/tmp/openclaw-compile-cache                                                │<br>│    export OPENCLAW_NO_RESPAWN=1                                                            │<br>│                                                                                            │<br>├────────────────────────────────────────────────────────────────────────────────────────────╯<br>│<br>◇  Gateway ──────────────────────────────────────────────────────────╮<br>│                                                                    │<br>│  gateway.mode is unset; gateway start will be blocked.             │<br>│  Fix: run openclaw configure and set Gateway mode (local/remote).  │<br>│  Or set directly: openclaw config set gateway.mode local           │<br>│  Missing config: run openclaw setup first.                         │<br>│                                                                    │<br>├────────────────────────────────────────────────────────────────────╯<br>│<br>◇  Gateway auth ──────────────────────────────────────────────────────────────────────╮<br>│                                                                                     │<br>│  Gateway auth is off or missing a token. Token auth is now the recommended default  │<br>│  (including loopback).                                                              │<br>│                                                                                     │<br>├─────────────────────────────────────────────────────────────────────────────────────╯<br>│<br>■  Generate and configure a gateway token now?<br>...</pre><h3>Setup</h3><p>The configuration complexity of OpenClaw seems daunting, but all available options are streamlined during the initial onboarding process. I recommend starting the installation with the interactive onboarding wizard, and tweaking individual settings after this initial setup.</p><p>Start the process with the following command:</p><pre>openclaw onboard --install-daemon<br><br>🦞 OpenClaw 2026.6.11 (4dcc39c) - I&#39;ve read more man pages than any human should-so you don&#39;t have to.<br><br>▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄<br>██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██<br>██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██<br>██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██<br>▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀<br>                  🦞 OPENCLAW 🦞<br><br>┌  OpenClaw setup</pre><p>This ongoing setup dialog will guide you through different installation phases. The following list divides the setup decisions, and shows the corresponding dialog prompt printed in the terminal.</p><ol><li>Security Warning</li></ol><pre>◆  I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?<br>│  ● Yes / ○ No</pre><p>A disclaimer about the project’s nature, mentioning risks and concerns, and listing guidelines for a safe initial configuration. You need to answer with Yes in order to continue.</p><p>2. Setup Mode</p><pre>◆  Setup mode<br>│  ● QuickStart (Configure details later via openclaw configure.)<br>│  ○ Manual</pre><p>The Manual setup mode is intended for configuring OpenClaw on a public internet host, detailing network stack configurations including URL and port. Continue with the preselected QuickStart for an instance that runs locally.</p><p>3. Model Configuration</p><pre>◆  Model/auth provider<br>│  ● Alibaba Cloud Model Studio (Coding Plan API key (CN / Global))<br>│  ○ Anthropic<br>│  ○ BytePlus<br>│  ○ Chutes</pre><p>OpenClaw needs at least one LLM provider for processing inputs. The list is quite extensive, enabling free selection from more than 30 providers. It includes well-known options such as OpenAI, Anthropic, DeepSeek, or Minimax, API gateways like LiteLLM, and multi-provider aggregators like OpenRouter.</p><p>4. Channel Configuration</p><pre>Select channel (QuickStart)<br>│  ● Telegram (Bot API) (recommended · newcomer-friendly)<br>│  ○ WhatsApp (QR link)<br>│  ○ Discord (Bot API)</pre><p>An OpenClaw installation exposes a dashboard with many features, one being a chat interface. However, the true appeal of OpenClaw is its compatibility with different communication channels: messengers like WhatsApp and Signal, collaboration tools like Slack and Discord, and integrations with ecosystems like Mattermost or Nextcloud.</p><p>5. Search provider</p><pre>Search provider<br>│  ○ Brave Search<br>│  ● DuckDuckGo Search (experimental) (Free web search fallback with no API key required · key-free)<br>│  ○ Exa Search</pre><p>OpenClaw agents frequently perform web searches to fetch accurate and up-to-date information. Technically, search results should be provided in a non-HTML format, for example JSON. This structure can be obtained from search providers, which require a dedicated, paid account. The alternative is to use a headless Brave browser, which works, but can run into bot-detection challenges.</p><p>6. Skills</p><pre>Skills status ─────────────╮<br>│                             │<br>│  Eligible: 3                │<br>│  Missing requirements: 40   │<br>│  Unsupported on this OS: 7  │<br>│  Blocked by allowlist: 0    │<br>│                             │<br>├─────────────────────────────╯<br>│<br>◆  Configure skills now? (recommended)<br>│  ● Yes / ○ No<br>│<br>Install missing skill dependencies<br>│  ◻ Skip for now (Continue without installing dependencies)<br>│  ◻ 🔐 1password<br>│  ◻ 📰 blogwatcher<br>│  ◻ 🫐 blucli<br>│  ◻ 📸 camsnap<br>│  ◻ 🧩 clawhub<br>│  ◻ 🛌 eightctl</pre><p>Skills extend the capabilities of your OpenClaw agents. Much of the perceived user value stems from sophisticated skill definitions that are included and activated by default. This includes interfacing natively with apps installed on the computer, accessing internet services from Google, BlueSky, or Obsidian, and much more. And of course, you can further extend the skills once the initial setup is completed.</p><p>7. Hooks</p><pre>Hooks ──────────────────────────────────────────────────────────────────╮<br>│                                                                          │<br>│  Hooks let you automate actions when agent commands are issued.          │<br>│  Example: Save session context to memory when you issue /new or /reset.  │<br>│                                                                          │<br>│  Learn more: https://docs.openclaw.ai/automation/hooks                   │<br>│                                                                          │<br>├──────────────────────────────────────────────────────────────────────────╯<br>│<br>◆  Enable hooks?<br>│  ◻ Skip for now<br>│  ◻ 🚀 boot-md<br>│  ◻ 📎 bootstrap-extra-files<br>│  ◻ 📝 command-logger<br>│  ◻ 💾 session-memory</pre><p>When using an OpenClaw agent, the invocation traverses typical lifecycle phases from initialization, tool access, execution, and answer generation. During these phases, hooks can be executed, with the goal of extending or tweaking the default behavior. A common option is to activate an additional prompt during initialization, which can be achieved with the boot-md hook.</p><p>8. Technical Setup</p><pre>◇  Systemd ───────────────────────────────────────────────────────────────────────────────╮<br>│                                                                                         │<br>│  Systemd user services are unavailable. Skipping lingering checks and service install.  │<br>│                                                                                         │<br>├─────────────────────────────────────────────────────────────────────────────────────────╯<br><br><br>...<br><br>◇  Gateway service ─────────────────────────────────────────────────────────────────────╮<br>│                                                                                       │<br>│  Systemd user services are unavailable; skipping service install. Use your container  │<br>│  supervisor or `docker compose up -d`.                                                │<br>│                                                                                       │<br>├───────────────────────────────────────────────────────────────────────────────────────╯<br>│<br><br>...<br><br>◇  Control UI ───────────────────────────────────────────────────────────────────────────────╮<br>│                                                                                            │<br>│  Web UI: &lt;http://127.0.0.1:18789/&gt;                                                        │<br>│  Web UI (with token):                                                                     │<br>│  &lt;http://127.0.0.1:18789/#token=faf2ffc95ec703f656941f8d601e9d8db166e808765abfb7&gt;        │<br>│  Gateway WS: ws://127.0.0.1:18789                                                         │<br>│  Gateway: not detected (gateway closed (1006 abnormal closure (no close frame)): no close │<br>│  reason)                                                                                  │<br>│  Docs: &lt;https://docs.openclaw.ai/web/control-ui&gt;                                          │<br>│                                                                                            │<br>├────────────────────────────────────────────────────────────────────────────────────────────╯<br><br>...<br><br>◇  Security ──────────────────────────────────────────────────────╮<br>│                                                                 │<br>│  Running agents on your computer is risky - harden your setup:  │<br>│  &lt;https://docs.openclaw.ai/security&gt;                            │<br>│                                                                 │<br>├─────────────────────────────────────────────────────────────────╯<br><br>...<br><br>└  Onboarding complete. Use the dashboard link above to control OpenClaw.</pre><p>In this non-interactive phase, the OpenClaw installation sets up a systemd service, starts it, performs a health check, prints access information, and other data.</p><p>This concludes the onboarding, and you can now access the OpenClaw dashboard. To see the required dashboard URL, run the command openclaw dashboard --no-open; it prints a URL string with the required token embedding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*JNe4Bh2QKIKUU-Ja.png" /></figure><h3>Telegram Integration Setup</h3><p>One of OpenClaw’s strengths is its capability to be accessible from many different channels. Integration with the Telegram messenger provides an always-enabled connection for communication with your OpenClaw instance and for receiving messages that result from asynchronous tasks, for example cron jobs.</p><p>Telegram setup follows these steps.</p><h3>Create a New Telegram Bot</h3><p>A bot is a system user configured in Telegram, with a unique ID. It can be created through the Telegram chat interface itself. Follow these steps:</p><ol><li>Open a message to <a href="https://t.me/BotFather">@BotFather</a></li><li>Enter the /newbot command.</li><li>Provide a bot name, which is the unique ID with which to access the bot. You can use acronyms and cryptic letter/number combinations to prevent accidental access from other Telegram users.</li><li>Configure the Bot Username, which is the account name to which you refer in OpenClaw. Use mnemonics or generic names to identify the bot, such as “Researcher”.</li></ol><p>When the bot is configured, a 46-character bot token is printed in Telegram. This access token needs to be configured in the OpenClaw instance to enable access. You can manually edit the openclaw.json configuration file, or use openclaw onboard again and only change the channel configuration. The CLI dialogue is as follows:</p><pre>Telegram bot token ────────────────────────────────────╮<br>│                                                         │<br>│  1) Open Telegram and chat with @BotFather              │<br>│  2) Run /newbot (or /mybots)                            │<br>│  3) Copy the token (looks like 123456:ABC...)           │<br>│  Tip: you can also set TELEGRAM_BOT_TOKEN in your env.  │<br>│  Docs: &lt;https://docs.openclaw.ai/telegram&gt;              │<br>│  Website: &lt;https://openclaw.ai&gt;                         │<br>│                                                         │<br>├─────────────────────────────────────────────────────────╯<br>│<br>◇  How do you want to provide this Telegram bot token?<br>│  Enter Telegram bot token<br>│<br>◆  Enter Telegram bot token</pre><p>The final step is to allow the OpenClaw instance to communicate with the bot. This process, called pairing, is started by sending a new message to the bot via Telegram. This will create a short, 5-character access token. And this token needs to be confirmed in your OpenClaw instance.</p><p>On your instance, run the following commands, and insert this token.</p><pre>openclaw pairing list telegram<br>openclaw pairing approve telegram $TOKEN</pre><p>Now you can send a message to your bot and your instance should answer. If not, please check the troubleshooting hints in the next section.</p><h3>Telegram Troubleshooting</h3><p>A typical error case is that the bot is not answering at all. In my personal experience, this often can be boiled down to a typo in the bot token. You can check this by sending the token to a Telegram status API endpoint. In the following example, replace &quot;${TOKEN}&quot; with the 46-character token.</p><pre>curl -s &quot;https://api.telegram.org/bot${TOKEN}/getMe&quot;</pre><p>If the token is not correct, you will receive a JSON document with the following content.</p><pre>{<br>  &quot;ok&quot;: false,<br>  &quot;error_code&quot;: 401,<br>  &quot;description&quot;: &quot;Unauthorized&quot;<br>}</pre><p>… while a correct token creates this:</p><pre>{<br>  &quot;ok&quot;: true,<br>  &quot;result&quot;: {<br>    &quot;id&quot;: &quot;REDACTED&quot;,<br>    &quot;is_bot&quot;: true,<br>    &quot;first_name&quot;: &quot;claw&quot;,<br>    &quot;username&quot;: &quot;REDACTED&quot;,<br>    &quot;can_join_groups&quot;: true,<br>    &quot;can_read_all_group_messages&quot;: false,<br>    &quot;supports_inline_queries&quot;: false,<br>    &quot;can_connect_to_business&quot;: false,<br>    &quot;has_main_web_app&quot;: false,<br>    &quot;has_topics_enabled&quot;: false,<br>    &quot;allows_users_to_create_topics&quot;: false<br>  }<br>}</pre><p>When the bot token is correct, but the error persists, a network error in the Telegram-to-OpenClaw instance communication is likely. Run the following command:</p><pre>openclaw channels status --probe<br><br>Gateway reachable.<br>- Telegram default: enabled, configured, running, mode:polling, bot:@REDACTED, token:config, works</pre><p>If this shows a specific error message, access the OpenClaw documentation for further information, and hopefully your access problem can be resolved.</p><h3>Conclusion and Next Steps</h3><p>OpenClaw is an agentic tool which provides both full access to a computer and abundant skills to interface with external systems. It is the premier tool that catapulted the capabilities of LLM agents to the public. In this article, you learned how to install OpenClaw from scratch. Installation is simple; a mere NPM package on a current Linux distribution is sufficient. Onboarding is an interactive dialogue, which guides you through model, channel, search provider, skills, and hooks. Telegram channel configuration involves bot creation, bot token configuration, and pairing. With the installation completed, you can start exploring the many use cases that OpenClaw offers.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9f2c91f689a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From Large Language Models to AI Agent Systems]]></title>
            <link>https://admantium.medium.com/from-large-language-models-to-ai-agent-systems-0b2d420d7d98?source=rss-59c791c55f3f------2</link>
            <guid isPermaLink="false">https://medium.com/p/0b2d420d7d98</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Sebastian]]></dc:creator>
            <pubDate>Mon, 10 Aug 2026 04:59:40 GMT</pubDate>
            <atom:updated>2026-08-10T04:59:40.766Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N3xVmjKPmIuFV_9Iw8hKdA.png" /></figure><p>In 2024, the first capable Large Language Models emerged. Self-hosted Ollama with local model inference was one pattern, and using commercial vendors and models like OpenAI’s GPT or Anthropic’s Sonnet models. Several open-source projects started to create AI assistants, targeting working autonomously on tasks ranging from research to productivity and coding.</p><p>In my blog article series about LLMs, I wrote <a href="https://admantium.com/blog/llm34_requirements_of_personal_assistant/">Universal Personal Assistant with LLMs</a> as the last entry in December 2024. I had the goal to investigate agent systems like <a href="https://microsoft.github.io/autogen/stable/user-guide/autogenstudio-user-guide/index.html">AutoGen</a>, <a href="https://docs.crewai.com/">CrewAI</a>, and <a href="https://github.com/frdel/agent-zero">AgentZero</a>. But using these frameworks showed severe limitations: Tool calls did not function reliably, and a human operator needed to constantly shepherd the LLM invocation to stay on track. I did not write a single article following this experience.</p><p>In 2026, the AI agent paradigm is a technical reality, and it keeps evolving rapidly. Commercial products include agent-like capabilities in their products, from the universal ChatGPT, to knowledge organisation with Notion and web search with Perplexity. Open-source frameworks likewise evolved: Chat interfaces with session persistence like OpenWebUI, personal agent frameworks like OpenClaw and Hermes, and several coding tools like Droid, Kilo, and Pi.</p><p>Agents are here now. They autonomously read and compose e-mails, conduct research and write comprehensive overviews, and program web applications and apps.</p><p>In this ongoing blog series, agent applications and their capabilities will be the focus. Two goals are prevalent. First, to explore and categorize the (agentic) features of commercial products and open-source projects. Second, how to set up agentic tools and surrounding infrastructure like LLM proxies and observability tools.</p><p>This introductory blog post provides an overview of application types and concrete commercial and open-source tools.</p><p><em>While I’m 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.</em></p><p><em>This article originally appeared at my blog </em><a href="https://admantium.com/blog/llm35_llm_agent_application_overview/"><em>admantium.com</em></a></p><h3>Commercial Tools</h3><p>The space of commercial tools is enormous. While AI becomes embedded into many types of products, agentic capabilities are the focus in the following groups.</p><h3>Research</h3><p>Gathering information from several webpages, reading several texts, comparing and summarizing — this is a premier task for AI apps.</p><ul><li><a href="https://www.perplexity.ai/">Perplexity AI</a>: Perplexity is an AI-powered search engine with different capabilities: Standard fast web search, and deep research for parallel fetching and comparison of several sources. You can select which model to use, enter text and voice, and instruct it to narrow down sources. Search processes and text generation happen fast, providing accurate results quickly, and always linking the relevant sources for verifying factual claims.</li><li><a href="https://support.google.com/websearch/answer/14901683">Google AI Search/AI Overview</a>: Google also extended its search capabilities with conversational AI. When used, information is synthesized from various sources, providing a quick overview of topics of interest. Follow-up questions can narrow down the results. AI Overview is offered as an installable app for mobile phones only, which provides integration with a phone’s native capabilities, including its camera for pictures or videos.</li></ul><h3>Knowledge Management</h3><p>Knowledge management is concerned with organizing lists, notes, and texts into a coherent, structured format. Keeping this structure with editors requires structural integrity and strict rules to follow, while using a tool is dependent on the provider’s system, making exports difficult.</p><ul><li><a href="https://www.notion.com/product/agents">Notion AI</a>: Notion pages are structured documents accessible from the web or via dedicated app. Adding agents to these pages allows extended search capabilities via connectors, e.g. to external databases, or content improvements like summarization or text rewriting. Since agents can also query the complete workspace, context-aware suggestions can be produced, e.g. to reduce redundancy in notes. The specific strength of Notion is that agent invocation stays inside the workspace itself; no separate search or chat interface is required.</li><li><a href="https://en.wikipedia.org/wiki/NotebookLM">Google NotebookLM</a>: A Gemini-powered research assistant that performs retrieval-augmented generation over uploaded sources such as Docs, PDFs, Slides, and URLs, generating grounded summaries and explanations. It is especially useful when the source set is known in advance and the goal is to stay within those materials. A distinctive feature is source-grounded output that avoids drifting beyond the uploaded corpus.</li><li><a href="https://www.perplexity.ai/">Perplexity Spaces</a>: The Spaces feature is designed as a long-running, continuous session in which you can add sources, configure LLM invocation instructions, attach custom files and other data sources, and then start discussions structured as threads. Additionally, spaces can be shared with other people, allowing collaborative work on dedicated knowledge areas.</li></ul><h3>Productivity</h3><p>Personal productivity is a very attractive area for agent applications. Organizing disjoint data sources, from task lists to calendars, from e-mails to note-taking apps, can be tedious if not structured rigorously. Agent apps provide organization and processes in spite of structural differences.</p><ul><li><a href="https://knowledge.workspace.google.com/admin/gemini/google-workspace-with-gemini">Google Workspace with Gemini</a>: Google apps remain at the frontier of productivity, already providing a tight integration between emails, documents, sheets, and task lists. Their Gemini model can be opened in any workspace app, providing immediate support by AI models. Alternatively, a Gemini chat can be used standalone, with full access to all information, making it seamless to e.g. let an e-mail be composed about the contents of several documents. Also, you can use this feature to generate texts and add them to documents.</li><li><a href="https://help.openai.com/en/articles/11752874-chatgpt-agent">ChatGPT Agent Mode</a>: ChatGPT is the premier interface for invoking LLMs in long, session-based conversations. The agent mode extends this capability, allowing a combined tool array for multi-step workflows, with tasks like web research, file editing, code execution, and connection to various third-party apps. Tasks can even be scheduled regularly, providing timed workflows.</li><li><a href="https://slack.com/blog/news/ai-productivity-tools-slack">Slack AI</a>: Slack is a standard communication tool, used in small businesses and enterprises alike. Integration of AI takes several forms. For channels, summaries can be generated. Inside a huddle, meeting notes can be summarized. And the canvas feature allows collaborative text editing.</li></ul><h3>Content Generation</h3><p>While text generation and image generation are core capabilities in all aforementioned application areas, specialized domains require specific formats or need to follow rules.</p><ul><li><a href="https://www.jasper.ai/agents">Jasper Agents</a>: A complete platform for brand-specific content generation, including landing pages, blogs, and whole campaigns. It structures content generation into strict phases, and uses specialized agents for each step, with fixed guardrails and quality controls. It is also designed for collaborative work, allowing whole teams to structure and refine the workflow processes.</li><li><a href="https://www.ema.ai/">Ema</a>: The Enterprise Machine Assistant promises AI employees that can fill roles from customer support, sales, research, and HR. Workflow engines invoke agents autonomously, and allow connecting to various data sources, ensuring governance and system connectivity.</li><li><a href="https://www.trysight.ai/">Sight AI</a>: An autonomous content-generation platform for researching, writing, and publishing SEO-optimized articles. Specialized agents partake in each workflow phase, and learn from their work. Published page rankings are monitored, their impact measured, and important findings stored in a knowledge graph that serves as a continuously evolving knowledge base for improving all publication aspects.</li></ul><h3>Sales and Support</h3><p>These agents are tuned for CRM workflows, customer engagement, and service automation.</p><ul><li><a href="https://www.salesforce.com/agentforce/">Agentforce</a>: Salesforce’s all-in-one solution for conversational agents that support all CRM processes. They can be employed as customer-facing chatbots, in back-office environments for customer support, and even for reaching out to resellers. All agents are highly customizable by the human team that invokes them.</li><li><a href="https://www.kore.ai/">Kore.ai</a>: Kore offers pre-made AI apps for banking, healthcare, retail, and HR, as well as a complex agentic platform with which to implement and add agents for any business processes. Their focus on and experience with enterprise customers results in well-integrated solutions, orchestrating multimodal workflows that include voice, chat, documents, and system access. A special feature is enterprise-grade virtual assistant deployment across many business functions.</li><li><a href="https://sierra.ai/">Sierra</a>: Sierra provides brand-specific AI support agents for customer services across voice, webpage, and app channels. It handles both FAQ-style information access, and can also handle operational service flows, e.g. triggering returns or handling subscriptions. Their advertised strength is brand awareness, ensuring a coherent customer experience.</li></ul><h3>Workflow Automation</h3><p>These agents orchestrate multi-step workflows and actions across apps and systems.</p><ul><li><a href="https://agentsindex.ai/zapier-agents">Zapier Agents</a>: Zapier has been at the forefront of automation for more than a decade. With their rich experience of inter-system connectivity, it is no surprise that adding agents provides a seamless experience. Many templates are available, resulting in seamless invocation of agents to summarize content or work autonomously. This allows for productive business automation, spawning agents to fulfil customer requests, file invoices, and more.</li><li><a href="https://beam.ai/">Beam AI</a>: Agentic process-automation platform whose agents interpret requests, make routing decisions, and automate workflows in support, sales operations, and HR. A standout feature is decision-making inside process flows, not just form-based task triggering.</li></ul><h3>Low-Code/Visual Coding</h3><p>While dedicated coding agents output complex source code, the entry level into custom applications are visual editors, allowing non-technical users to implement complex logic.</p><ul><li><a href="https://lovable.dev/">Lovable</a>: AI-powered platform for creating full-stack web apps from natural-language prompts. It is especially helpful for fast prototyping and MVP creation. Users can start with a generic prompt, and then quickly refine generated results with follow-ups. Since its inception, capabilities like third-party system integrations were added, allowing the generated code to access these systems immediately.</li><li><a href="https://bubble.io/ai">Bubble</a>: A similar visual app builder with a focus on structured design workflows. Upon the initial prompts, design choices are presented, e.g. a set of features, or the structure of a webpage. The visual editor allows configuring these aspects, and then continuing with the prompt, or rewinding to an earlier version. It also rapidly expanded its capabilities with a third-party API connector, and opened a marketplace for plugins that can be integrated into its GUI.</li><li><a href="https://retool.com/ai-app-generation">Retool</a>: Low-code platform for internal tools that uses AI to generate applications from prompts while keeping visual editing, data bindings, and enterprise controls in place. It is particularly strong when apps must connect to business data, run securely, and evolve over time.</li></ul><h3>General-Purpose Assistant</h3><p>These are broad assistants that handle many task types via chat, tools, and multimodal inputs.</p><ul><li><a href="https://chatgpt.com/">ChatGPT</a>: General assistant for writing, coding, and research, with browsing and agent capabilities for multi-step tasks. It is flexible enough to act as both a conversational helper and a goal-directed autonomous agent with decision-making capabilities.</li><li><a href="https://gemini.google.com/app">Gemini</a>: General assistant for search, reasoning, and productivity tasks, with multimodal support and strong workspace integration. It works well when users need one assistant across documents, mail, search, and visual inputs.</li><li><a href="https://www.meta.ai/">Meta AI</a>: The AI Assistant from Meta, accessible as a standalone web application, and also integrated into WhatsApp, Instagram, and Facebook. It allows seamless follow-up questions inside these apps, accessing user messages for rich, grounded context.</li></ul><h3>Open-Source Projects</h3><p>An agent is a persistent, task-oriented process that has access to tools for editing files, connecting to external systems, and even shell commands in its environment. It also has a memory system, deriving context from several sessions/conversations, which also evolves the agent’s capabilities so as not to repeat mistakes.</p><p>Converging with the appearance of the first Large Language Models, early frameworks that provide single agents were developed. The evolution to multi-agent invocation is rather new, which required experience with agent memory consistency and fixed workflow handovers between the different processes.</p><h3>Single-Agent Frameworks</h3><ul><li><a href="https://github.com/langchain-ai/langchain">LangChain</a>: Modular framework in which strict workflows with agent invocation are designed. Agents have access to their own memory, vector stores for RAG, and other data sources. The framework even features its own domain-specific language for composing complex workflows as functions with streaming support.</li><li><a href="https://github.com/frdel/agent-zero">AgentZero</a>: A general-purpose personal assistant framework with persistent memory and tool-enabled execution. It uses its host system for tool execution, so tasks can incorporate commands, code, and file operations.</li><li><a href="https://github.com/microsoft/autogen">AutoGen</a>: Open-source framework for building AI agents and facilitating cooperation among multiple agents to solve tasks. It adds conversation programming and finite state machine patterns for controlling agent communication. AgentEval is integrated for task-oriented evaluation and iterative self-improvement. Has been declared in maintenance mode as of September 2025.</li><li><a href="https://github.com/emcie-co/parlant">Parlant</a>: An agent harness for reliable customer-facing AI. Agent behavior is modeled as explicit rules and conditions, then selectively injects only the relevant guidelines into the prompt at runtime. This results in fine-grained, predictable control over a single agent.</li></ul><h3>Multi-Agent Frameworks</h3><ul><li><a href="https://github.com/crewAIInc/crewAI">CrewAI</a>: Multi-agent orchestration framework centered on crews, agents, and tasks. The template method separates agents and tasks into YAML files, making projects easier to read and reuse. It also adds built-in tools, planning support, and training-oriented workflows.</li><li><a href="https://milvus.io/blog/openclaw-formerly-clawdbot-moltbot-explained-a-complete-guide-to-the-autonomous-ai-agent.md">OpenClaw</a>: The most famous open-source agent runtime that generated awareness for technical and non-technical users alike. It provides three strong pillars: First, support for more than 20 LLM providers, including OpenAI, Anthropic, the generic OpenRouter, and more. Second, tight integration into the Google and Apple ecosystems, connecting apps from mail to note-taking. Third, a multitude of channels to simplify communication with agents, including popular messaging platforms like WhatsApp and Telegram, and platforms like Slack and Discord. It is also known for fast-moving features, not always with system stability and backwards compatibility.</li><li><a href="https://yuv.ai/blog/hermes-agent">Hermes Agent</a>: A framework for self-improving agents with persistent memory and autonomous skill creation, using searchable past interactions and skill documents to adapt workflows across chat platforms. It is the number one contender to OpenClaw, valued for its stability and strict permission system to keep agents from harming their system.</li><li><a href="https://github.com/RightNow-AI/openfang">OpenFang</a>: A fast-moving open-source agent operating system built in Rust, positioned as a more kernel-level, background-process style alternative to chat-first agents. It emphasizes autonomous execution, skill templates, and a command registry, geared toward reliable scheduling and long-running tasks. It is shipped as a single, production-oriented binary, reducing resource overhead significantly compared to frameworks based on interpreted programming languages.</li><li><a href="https://github.com/zeroclaw-labs/zeroclaw">ZeroClaw</a>: A compact, fully autonomous AI assistant infrastructure, emphasizing simplified practical deployments and channel connectivity. Its support for LLM providers and channels rivals that of OpenClaw, and its roots in Rust provide operational benefits, with a special focus on permissions to execute tools. An interesting feature is its hardware support to access communication protocols like I2C or serial interfaces, making it viable to be deployed on Raspberry Pi or ESP32 platforms.</li></ul><h3>Conclusion</h3><p>In 2026, AI agents perform autonomous tasks in areas like productivity, research, content generation, and coding. This blog article gave a concise overview of both commercial tools and open-source projects in these realms. In the commercial space, the breadth from research to knowledge management, and from low-code to workflow automation, shows how much traction agents are developing. And the open-source projects show the steady progress from single-agent frameworks, requiring manual Python code with LLM invocations, to Telegram-controlled multi-agent environments with full access to the computer they run on.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0b2d420d7d98" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>