mirror of
https://github.com/open-webui/open-webui.git
synced 2026-05-07 03:18:23 -05:00
[GH-ISSUE #23946] issue: 400 Model not found for Workspace Models whose base models are not available to the user #58788
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @itsHenry35 on GitHub (Apr 21, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/23946
Check Existing Issues
Installation Method
Docker
Open WebUI Version
v0.9.1
Ollama Version (if applicable)
No response
Operating System
Ubuntu 22.04
Browser (if applicable)
No response
Confirmation
README.md.Expected Behavior
The user should be able to chat with the model
Actual Behavior
400 Model not found
Steps to Reproduce
Logs & Screenshots
2026-04-21 14:21:41.953 | DEBUG | aiosqlite.core:run:104 - executing functools.partial(<built-in method execute of sqlite3.Cursor object at 0x7d8eac79c540>, 'SELECT access_grant.id, access_grant.resource_type, access_grant.resource_id, access_grant.principal_type, access_grant.principal_id, access_grant.permission, access_grant.created_at \nFROM access_grant \nWHERE access_grant.resource_type = ? AND access_grant.resource_id = ? AND access_grant.permission = ? AND (access_grant.principal_type = ? AND access_grant.principal_id = ? OR access_grant.principal_type = ? AND access_grant.principal_id = ? OR access_grant.principal_type = ? AND access_grant.principal_id IN (?, ?, ?))\n LIMIT ? OFFSET ?', ('model', 'deepseek-chat', 'read', 'user', '', 'user', 'cc8ed70f-28e5-40f5-b441-4f91c6a82ac8', 'group', '1e40e3d6-c47f-44f0-9d49-464682edca61', '0d24cdd5-fd18-4a61-80a3-833ddfdea11e', 'b75aeadd-1225-4644-9a1f-df243a015e96', 1, 0))
2026-04-21 14:21:41.953 | DEBUG | aiosqlite.core:run:106 - operation functools.partial(<built-in method execute of sqlite3.Cursor object at 0x7d8eac79c540>, 'SELECT access_grant.id, access_grant.resource_type, access_grant.resource_id, access_grant.principal_type, access_grant.principal_id, access_grant.permission, access_grant.created_at \nFROM access_grant \nWHERE access_grant.resource_type = ? AND access_grant.resource_id = ? AND access_grant.permission = ? AND (access_grant.principal_type = ? AND access_grant.principal_id = ? OR access_grant.principal_type = ? AND access_grant.principal_id = ? OR access_grant.principal_type = ? AND access_grant.principal_id IN (?, ?, ?))\n LIMIT ? OFFSET ?', ('model', 'deepseek-chat', 'read', 'user', '', 'user', 'cc8ed70f-28e5-40f5-b441-4f91c6a82ac8', 'group', '1e40e3d6-c47f-44f0-9d49-464682edca61', '0d24cdd5-fd18-4a61-80a3-833ddfdea11e', 'b75aeadd-1225-4644-9a1f-df243a015e96', 1, 0)) completed
2026-04-21 14:21:41.953 | DEBUG | aiosqlite.core:run:104 - executing functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x7d8eac79c540>)
2026-04-21 14:21:41.953 | DEBUG | aiosqlite.core:run:106 - operation functools.partial(<built-in method fetchall of sqlite3.Cursor object at 0x7d8eac79c540>) completed
2026-04-21 14:21:41.953 | DEBUG | aiosqlite.core:run:104 - executing functools.partial(<built-in method close of sqlite3.Cursor object at 0x7d8eac79c540>)
2026-04-21 14:21:41.953 | DEBUG | aiosqlite.core:run:106 - operation functools.partial(<built-in method close of sqlite3.Cursor object at 0x7d8eac79c540>) completed
2026-04-21 14:21:41.954 | DEBUG | aiosqlite.core:run:104 - executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x7d8eac6c56c0>)
2026-04-21 14:21:41.954 | DEBUG | aiosqlite.core:run:106 - operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x7d8eac6c56c0>) completed
2026-04-21 14:21:41.954 | DEBUG | aiosqlite.core:run:104 - executing functools.partial(<built-in method rollback of sqlite3.Connection object at 0x7d8eac6c56c0>)
2026-04-21 14:21:41.954 | DEBUG | aiosqlite.core:run:106 - operation functools.partial(<built-in method rollback of sqlite3.Connection object at 0x7d8eac6c56c0>) completed
2026-04-21 14:21:41.954 | DEBUG | open_webui.main:chat_completion:1835 - Error processing chat metadata: Model not found
2026-04-21 14:21:41.955 | INFO | uvicorn.protocols.http.httptools_impl:send:483 - 100.75.54.65:0 - "POST /api/chat/completions HTTP/1.1" 400
Additional Information
I don't know if this is intentional, but this is necessary because you sometimes don't want to enable raw models for users, but give them models with fine-tuned system prompts and parameters.
@Classic298 commented on GitHub (Apr 21, 2026):
This is working as designed — access to chained base models is enforced at every hop (has_base_model_access in utils/access_control/init.py). If a user has read-access to the workspace model but not its base model, the request is denied. The "Model not found" wording is misleading (it's actually a 403), we should improve that.
Pragmatic workaround: grant the target users/groups read-access to the base model as well (and hide the base model using the model hide feature if you dont want them to see it). The workspace model's system prompt, params, etc. still apply on top — base-model read-access doesn't automatically expose the raw model in the UI unless you also grant it there.
If you want "workspace model access implies base model access when used through it", please open a separate feature request — it's a meaningful policy change and worth discussing in its own thread rather than as a bug.
@itsHenry35 commented on GitHub (Apr 21, 2026):
Thanks! I've opened a new issue.
BTW, this workaround just has one big limitation that I can't do: i want some users to see it, while only hiding if for a group of users using that workspace model