[GH-ISSUE #23776] issue: delete_knowledge_by_id fails #107061

Closed
opened 2026-05-18 05:36:05 -05:00 by GiteaMirror · 2 comments
Owner

Originally created by @stelterlab on GitHub (Apr 16, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/23776

Check Existing Issues

  • I have searched for any existing and/or related issues.
  • I have searched for any existing and/or related discussions.
  • I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!).
  • I am using the latest version of Open WebUI.

Installation Method

Docker

Open WebUI Version

v0.8.12

Ollama Version (if applicable)

No response

Operating System

Ubuntu 24.04

Browser (if applicable)

No response

Confirmation

  • I have read and followed all instructions in README.md.
  • I am using the latest version of both Open WebUI and Ollama.
  • I have included the browser console logs.
  • I have included the Docker container logs.
  • I have provided every relevant configuration, setting, and environment variable used in my setup.
  • I have clearly listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc).
  • I have documented step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation. My steps:
  • Start with the initial platform/version/OS and dependencies used,
  • Specify exact install/launch/configure commands,
  • List URLs visited, user input (incl. example values/emails/passwords if needed),
  • Describe all options and toggles enabled or changed,
  • Include any files or environmental changes,
  • Identify the expected and actual result at each stage,
  • Ensure any reasonably skilled user can follow and hit the same issue.

Expected Behavior

no exeception - just deleting the knowledge base

Actual Behavior

When deleting an older knowlegde base - created with 0.6.x - you get an:

| pydantic_core._pydantic_core.ValidationError: 1 validation error for ModelForm | access_grants.0 | Input should be a valid dictionary [type=dict_type, input_value=AccessGrantModel(id='9310..., created_at=1773243475), input_type=AccessGrantModel]

Steps to Reproduce

Unclear how reproduce. Seems that knowledge bases created with v0.6.28 seem to be affected when being deleted with v0.8.x.

Logs & Screenshots

`2026-04-08 14:19:11.885 | INFO | uvicorn.protocols.http.httptools_impl:send:483 - xxx.xxx.96.246:0 - "DELETE /api/v1/knowledge/365efe98-2ac2-4e3b-9c71-69308d70a79e/delete HTTP/1.1" 500
Exception in ASGI application

  • Exception Group Traceback (most recent call last):
    | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 81, in collapse_excgroups
    | yield
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 192, in call
    | async with anyio.create_task_group() as task_group:
    | File "/usr/local/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 799, in aexit
    | raise BaseExceptionGroup(
    | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
    +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    | File "/usr/local/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 416, in run_asgi
    | result = await app( # type: ignore[func-returns-value]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in call
    | return await self.app(scope, receive, send)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/fastapi/applications.py", line 1160, in call
    | await super().call(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/applications.py", line 90, in call
    | await self.middleware_stack(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 186, in call
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 164, in call
    | await self.app(scope, receive, _send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/sessions.py", line 88, in call
    | await self.app(scope, receive, send_wrapper)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 96, in call
    | await self.simple_response(scope, receive, send, request_headers=headers)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 154, in simple_response
    | await self.app(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in call
    | with recv_stream, send_stream, collapse_excgroups():
    | File "/usr/local/lib/python3.11/contextlib.py", line 158, in exit
    | self.gen.throw(typ, value, traceback)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in call
    | response = await self.dispatch_func(request, call_next)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/app/backend/open_webui/main.py", line 1472, in inspect_websocket
    | return await call_next(request)
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next
    | raise app_exc from app_exc.cause or app_exc.context
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro
    | await self.app(scope, receive_or_disconnect, send_no_error)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in call
    | with recv_stream, send_stream, collapse_excgroups():
    | File "/usr/local/lib/python3.11/contextlib.py", line 158, in exit
    | self.gen.throw(typ, value, traceback)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in call
    | response = await self.dispatch_func(request, call_next)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/app/backend/open_webui/main.py", line 1454, in check_url
    | response = await call_next(request)
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next
    | raise app_exc from app_exc.cause or app_exc.context
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro
    | await self.app(scope, receive_or_disconnect, send_no_error)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in call
    | with recv_stream, send_stream, collapse_excgroups():
    | File "/usr/local/lib/python3.11/contextlib.py", line 158, in exit
    | self.gen.throw(typ, value, traceback)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in call
    | response = await self.dispatch_func(request, call_next)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/app/backend/open_webui/main.py", line 1421, in commit_session_after_request
    | response = await call_next(request)
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next
    | raise app_exc from app_exc.cause or app_exc.context
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro
    | await self.app(scope, receive_or_disconnect, send_no_error)
    | File "/app/backend/open_webui/main.py", line 1413, in call
    | await self.app(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in call
    | with recv_stream, send_stream, collapse_excgroups():
    | File "/usr/local/lib/python3.11/contextlib.py", line 158, in exit
    | self.gen.throw(typ, value, traceback)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in call
    | response = await self.dispatch_func(request, call_next)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/app/backend/open_webui/utils/security_headers.py", line 11, in dispatch
    | response = await call_next(request)
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next
    | raise app_exc from app_exc.cause or app_exc.context
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro
    | await self.app(scope, receive_or_disconnect, send_no_error)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in call
    | with recv_stream, send_stream, collapse_excgroups():
    | File "/usr/local/lib/python3.11/contextlib.py", line 158, in exit
    | self.gen.throw(typ, value, traceback)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in call
    | response = await self.dispatch_func(request, call_next)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/app/backend/open_webui/main.py", line 1366, in dispatch
    | response = await call_next(request)
    | ^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next
    | raise app_exc from app_exc.cause or app_exc.context
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro
    | await self.app(scope, receive_or_disconnect, send_no_error)
    | File "/usr/local/lib/python3.11/site-packages/starlette_compress/init.py", line 104, in call
    | return await self._zstd(scope, receive, send)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/starlette_compress/_zstd_legacy.py", line 107, in call
    | await self.app(scope, receive, wrapper)
    | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 63, in call
    | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    | await app(scope, receive, sender)
    | File "/usr/local/lib/python3.11/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in call
    | await self.app(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 660, in call
    | await self.middleware_stack(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 680, in app
    | await route.handle(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 276, in handle
    | await self.app(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 130, in app
    | await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    | raise exc
    | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    | await app(scope, receive, sender)
    | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 116, in app
    | response = await f(request)
    | ^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 670, in app
    | raw_response = await run_endpoint_function(
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 324, in run_endpoint_function
    | return await dependant.call(**values)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | File "/app/backend/open_webui/routers/knowledge.py", line 904, in delete_knowledge_by_id
    | model_form = ModelForm(
    | ^^^^^^^^^^
    | File "/usr/local/lib/python3.11/site-packages/pydantic/main.py", line 250, in init
    | validated_self = self.pydantic_validator.validate_python(data, self_instance=self)
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | pydantic_core._pydantic_core.ValidationError: 1 validation error for ModelForm
    | access_grants.0
    | Input should be a valid dictionary [type=dict_type, input_value=AccessGrantModel(id='9310..., created_at=1773243475), input_type=AccessGrantModel]
    | For further information visit https://errors.pydantic.dev/2.12/v/dict_type
    +------------------------------------`

Additional Information

Fix seems to be simple in backend/open_webui/routers/knowledge.py - line 904++

By replacing:

                # Create a ModelForm for the update
                model_form = ModelForm(
                    id=model.id,
                    name=model.name,
                    base_model_id=model.base_model_id,
                    meta=model.meta,
                    params=model.params,
                    access_grants=model.access_grants,
                    is_active=model.is_active,
                )

with

                model_payload = model.model_dump()
                model_payload['meta'] = model.meta
                model_form = ModelForm(**model_payload)
                Models.update_model_by_id(model.id, model_form, db=db)

Worked for me.

Originally created by @stelterlab on GitHub (Apr 16, 2026). Original GitHub issue: https://github.com/open-webui/open-webui/issues/23776 ### Check Existing Issues - [x] I have searched for any existing and/or related issues. - [x] I have searched for any existing and/or related discussions. - [x] I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!). - [x] I am using the latest version of Open WebUI. ### Installation Method Docker ### Open WebUI Version v0.8.12 ### Ollama Version (if applicable) _No response_ ### Operating System Ubuntu 24.04 ### Browser (if applicable) _No response_ ### Confirmation - [x] I have read and followed all instructions in `README.md`. - [x] I am using the latest version of **both** Open WebUI and Ollama. - [ ] I have included the browser console logs. - [x] I have included the Docker container logs. - [x] I have **provided every relevant configuration, setting, and environment variable used in my setup.** - [x] I have clearly **listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup** (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc). - [x] I have documented **step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation**. My steps: - Start with the initial platform/version/OS and dependencies used, - Specify exact install/launch/configure commands, - List URLs visited, user input (incl. example values/emails/passwords if needed), - Describe all options and toggles enabled or changed, - Include any files or environmental changes, - Identify the expected and actual result at each stage, - Ensure any reasonably skilled user can follow and hit the same issue. ### Expected Behavior no exeception - just deleting the knowledge base ### Actual Behavior When deleting an _older_ knowlegde base - created with 0.6.x - you get an: ` | pydantic_core._pydantic_core.ValidationError: 1 validation error for ModelForm | access_grants.0 | Input should be a valid dictionary [type=dict_type, input_value=AccessGrantModel(id='9310..., created_at=1773243475), input_type=AccessGrantModel]` ### Steps to Reproduce Unclear how reproduce. Seems that knowledge bases created with v0.6.28 seem to be affected when being deleted with v0.8.x. ### Logs & Screenshots `2026-04-08 14:19:11.885 | INFO | uvicorn.protocols.http.httptools_impl:send:483 - xxx.xxx.96.246:0 - "DELETE /api/v1/knowledge/365efe98-2ac2-4e3b-9c71-69308d70a79e/delete HTTP/1.1" 500 Exception in ASGI application + Exception Group Traceback (most recent call last): | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 81, in collapse_excgroups | yield | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 192, in __call__ | async with anyio.create_task_group() as task_group: | File "/usr/local/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 799, in __aexit__ | raise BaseExceptionGroup( | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) +-+---------------- 1 ---------------- | Traceback (most recent call last): | File "/usr/local/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 416, in run_asgi | result = await app( # type: ignore[func-returns-value] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__ | return await self.app(scope, receive, send) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/fastapi/applications.py", line 1160, in __call__ | await super().__call__(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/applications.py", line 90, in __call__ | await self.middleware_stack(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 186, in __call__ | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 164, in __call__ | await self.app(scope, receive, _send) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/sessions.py", line 88, in __call__ | await self.app(scope, receive, send_wrapper) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 96, in __call__ | await self.simple_response(scope, receive, send, request_headers=headers) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 154, in simple_response | await self.app(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in __call__ | with recv_stream, send_stream, collapse_excgroups(): | File "/usr/local/lib/python3.11/contextlib.py", line 158, in __exit__ | self.gen.throw(typ, value, traceback) | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/app/backend/open_webui/main.py", line 1472, in inspect_websocket | return await call_next(request) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next | raise app_exc from app_exc.__cause__ or app_exc.__context__ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro | await self.app(scope, receive_or_disconnect, send_no_error) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in __call__ | with recv_stream, send_stream, collapse_excgroups(): | File "/usr/local/lib/python3.11/contextlib.py", line 158, in __exit__ | self.gen.throw(typ, value, traceback) | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/app/backend/open_webui/main.py", line 1454, in check_url | response = await call_next(request) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next | raise app_exc from app_exc.__cause__ or app_exc.__context__ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro | await self.app(scope, receive_or_disconnect, send_no_error) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in __call__ | with recv_stream, send_stream, collapse_excgroups(): | File "/usr/local/lib/python3.11/contextlib.py", line 158, in __exit__ | self.gen.throw(typ, value, traceback) | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/app/backend/open_webui/main.py", line 1421, in commit_session_after_request | response = await call_next(request) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next | raise app_exc from app_exc.__cause__ or app_exc.__context__ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro | await self.app(scope, receive_or_disconnect, send_no_error) | File "/app/backend/open_webui/main.py", line 1413, in __call__ | await self.app(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in __call__ | with recv_stream, send_stream, collapse_excgroups(): | File "/usr/local/lib/python3.11/contextlib.py", line 158, in __exit__ | self.gen.throw(typ, value, traceback) | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/app/backend/open_webui/utils/security_headers.py", line 11, in dispatch | response = await call_next(request) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next | raise app_exc from app_exc.__cause__ or app_exc.__context__ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro | await self.app(scope, receive_or_disconnect, send_no_error) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 191, in __call__ | with recv_stream, send_stream, collapse_excgroups(): | File "/usr/local/lib/python3.11/contextlib.py", line 158, in __exit__ | self.gen.throw(typ, value, traceback) | File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 87, in collapse_excgroups | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 193, in __call__ | response = await self.dispatch_func(request, call_next) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/app/backend/open_webui/main.py", line 1366, in dispatch | response = await call_next(request) | ^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 168, in call_next | raise app_exc from app_exc.__cause__ or app_exc.__context__ | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 144, in coro | await self.app(scope, receive_or_disconnect, send_no_error) | File "/usr/local/lib/python3.11/site-packages/starlette_compress/__init__.py", line 104, in __call__ | return await self._zstd(scope, receive, send) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/starlette_compress/_zstd_legacy.py", line 107, in __call__ | await self.app(scope, receive, wrapper) | File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 63, in __call__ | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app | await app(scope, receive, sender) | File "/usr/local/lib/python3.11/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__ | await self.app(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 660, in __call__ | await self.middleware_stack(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 680, in app | await route.handle(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 276, in handle | await self.app(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 130, in app | await wrap_app_handling_exceptions(app, request)(scope, receive, send) | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app | raise exc | File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app | await app(scope, receive, sender) | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 116, in app | response = await f(request) | ^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 670, in app | raw_response = await run_endpoint_function( | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 324, in run_endpoint_function | return await dependant.call(**values) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | File "/app/backend/open_webui/routers/knowledge.py", line 904, in delete_knowledge_by_id | model_form = ModelForm( | ^^^^^^^^^^ | File "/usr/local/lib/python3.11/site-packages/pydantic/main.py", line 250, in __init__ | validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | pydantic_core._pydantic_core.ValidationError: 1 validation error for ModelForm | access_grants.0 | Input should be a valid dictionary [type=dict_type, input_value=AccessGrantModel(id='9310..., created_at=1773243475), input_type=AccessGrantModel] | For further information visit https://errors.pydantic.dev/2.12/v/dict_type +------------------------------------` ### Additional Information Fix seems to be simple in backend/open_webui/routers/knowledge.py - line 904++ By replacing: ``` # Create a ModelForm for the update model_form = ModelForm( id=model.id, name=model.name, base_model_id=model.base_model_id, meta=model.meta, params=model.params, access_grants=model.access_grants, is_active=model.is_active, ) ``` with ``` model_payload = model.model_dump() model_payload['meta'] = model.meta model_form = ModelForm(**model_payload) Models.update_model_by_id(model.id, model_form, db=db) ``` Worked for me.
GiteaMirror added the bug label 2026-05-18 05:36:06 -05:00
Author
Owner

@Classic298 commented on GitHub (Apr 16, 2026):

should be fixed by https://github.com/open-webui/open-webui/pull/23814

<!-- gh-comment-id:4262768799 --> @Classic298 commented on GitHub (Apr 16, 2026): should be fixed by https://github.com/open-webui/open-webui/pull/23814
Author
Owner

@tjbck commented on GitHub (Apr 17, 2026):

Addressed in dev.

<!-- gh-comment-id:4264960804 --> @tjbck commented on GitHub (Apr 17, 2026): Addressed in dev.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/open-webui#107061