diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 72a71021f9..22845da9a0 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1624,6 +1624,14 @@ USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT = ( os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT', 'False').lower() == 'true' ) +USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT', 'False').lower() == 'true' +) + USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING = ( os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING', 'False').lower() == 'true' @@ -1787,6 +1795,8 @@ DEFAULT_USER_PERMISSIONS = { 'prompts_export': USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT, 'tools_import': USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT, 'tools_export': USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT, + 'skills_import': USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT, + 'skills_export': USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT, }, 'sharing': { 'models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING, diff --git a/backend/open_webui/routers/skills.py b/backend/open_webui/routers/skills.py index ae6c210e29..1e183dd3f7 100644 --- a/backend/open_webui/routers/skills.py +++ b/backend/open_webui/routers/skills.py @@ -130,7 +130,7 @@ async def export_skills( ): if user.role != 'admin' and not await has_permission( user.id, - 'workspace.skills', + 'workspace.skills_export', await Config.get('user.permissions'), db=db, ): @@ -157,8 +157,13 @@ async def create_new_skill( user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): - if user.role != 'admin' and not await has_permission( - user.id, 'workspace.skills', await Config.get('user.permissions'), db=db + if user.role != 'admin' and not ( + await has_permission( + user.id, 'workspace.skills', await Config.get('user.permissions'), db=db + ) + or await has_permission( + user.id, 'workspace.skills_import', await Config.get('user.permissions'), db=db + ) ): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 53d500477c..f5c35a2ca5 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -178,6 +178,8 @@ class WorkspacePermissions(BaseModel): prompts_export: bool = False tools_import: bool = False tools_export: bool = False + skills_import: bool = False + skills_export: bool = False class SharingPermissions(BaseModel): diff --git a/src/lib/components/admin/Users/Groups/Permissions.svelte b/src/lib/components/admin/Users/Groups/Permissions.svelte index 2443531e71..afa272cde9 100644 --- a/src/lib/components/admin/Users/Groups/Permissions.svelte +++ b/src/lib/components/admin/Users/Groups/Permissions.svelte @@ -174,7 +174,22 @@ - {#if defaultPermissions?.workspace?.skills && !permissions.workspace.skills} + {#if permissions.workspace.skills} +
+
+
+ {$i18n.t('Import Skills')} +
+ +
+
+
+ {$i18n.t('Export Skills')} +
+ +
+
+ {:else if defaultPermissions?.workspace?.skills}
{$i18n.t('This is a default user permission and will remain enabled.')} diff --git a/src/lib/components/workspace/Skills.svelte b/src/lib/components/workspace/Skills.svelte index 9982045947..b6ea732044 100644 --- a/src/lib/components/workspace/Skills.svelte +++ b/src/lib/components/workspace/Skills.svelte @@ -263,7 +263,7 @@ }} /> - {#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills} + {#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills_import} {/if} - {#if total && ($user?.role === 'admin' || $user?.permissions?.workspace?.skills)} + {#if total && ($user?.role === 'admin' || $user?.permissions?.workspace?.skills_export)} - {#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills} + {#if $user?.role === 'admin' || $user?.permissions?.workspace?.skills_export}