diff --git a/backend/open_webui/routers/skills.py b/backend/open_webui/routers/skills.py index 4fefa2cb7a..7d2daabf8e 100644 --- a/backend/open_webui/routers/skills.py +++ b/backend/open_webui/routers/skills.py @@ -38,6 +38,7 @@ router = APIRouter() @router.get('/', response_model=list[SkillUserResponse]) async def get_skills( request: Request, + query: Optional[str] = None, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -60,6 +61,10 @@ async def get_skills( ) ] + if query: + q = query.casefold() + skills = [skill for skill in skills if q in (skill.name or '').casefold()] + return skills diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index f14b89d6ad..fb44bfc0a7 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -66,6 +66,7 @@ async def get_tool_module(request, tool_id, load_from_db=True): @router.get('/', response_model=list[ToolUserResponse]) async def get_tools( request: Request, + query: Optional[str] = None, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -165,10 +166,7 @@ async def get_tools( ) ) - if user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL: - # Admin can see all tools - return tools - else: + if not (user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL): user_group_ids = {group.id for group in await Groups.get_groups_by_member_id(user.id, db=db)} filtered_tools = [] for tool in tools: @@ -192,7 +190,13 @@ async def get_tools( db=db, ): filtered_tools.append(tool) - return filtered_tools + tools = filtered_tools + + if query: + q = query.casefold() + tools = [tool for tool in tools if q in (tool.name or '').casefold()] + + return tools ############################ diff --git a/src/lib/apis/skills/index.ts b/src/lib/apis/skills/index.ts index fc1dc24ce1..5185d5efaf 100644 --- a/src/lib/apis/skills/index.ts +++ b/src/lib/apis/skills/index.ts @@ -31,10 +31,13 @@ export const createNewSkill = async (token: string, skill: object) => { return res; }; -export const getSkills = async (token: string = '') => { +export const getSkills = async (token: string = '', query: string | null = null) => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/skills/`, { + const searchParams = new URLSearchParams(); + if (query) searchParams.append('query', query); + + const res = await fetch(`${WEBUI_API_BASE_URL}/skills/?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', diff --git a/src/lib/apis/tools/index.ts b/src/lib/apis/tools/index.ts index 5d26e50fee..8378299923 100644 --- a/src/lib/apis/tools/index.ts +++ b/src/lib/apis/tools/index.ts @@ -65,10 +65,13 @@ export const loadToolByUrl = async (token: string = '', url: string) => { return res; }; -export const getTools = async (token: string = '') => { +export const getTools = async (token: string = '', query: string | null = null) => { let error = null; - const res = await fetch(`${WEBUI_API_BASE_URL}/tools/`, { + const searchParams = new URLSearchParams(); + if (query) searchParams.append('query', query); + + const res = await fetch(`${WEBUI_API_BASE_URL}/tools/?${searchParams.toString()}`, { method: 'GET', headers: { Accept: 'application/json', diff --git a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte index b840eb5c96..40d7c49dbc 100644 --- a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte +++ b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte @@ -1,17 +1,8 @@ { if (state === false) { onClose(); @@ -141,11 +276,12 @@
- + {#if tab === ''} -
+
{#if tools} {#if Object.keys(tools).length > 0} - {#each Object.keys(tools) as toolId} -
+ + {#if (tools?.[toolId]?.authenticated ?? true) && toolId.startsWith('server:mcp:')} +
+ + + +
+ {/if} + + {#if tools?.[toolId]?.has_user_valves && ($user?.role === 'admin' || ($user?.permissions?.chat?.valves ?? true))} +
+ + + +
+ {/if} + +
+ +
+ + {/each}
- - {#if (tools[toolId]?.authenticated ?? true) && toolId.startsWith('server:mcp:')} -
- - - -
- {/if} - - {#if tools[toolId]?.has_user_valves && ($user?.role === 'admin' || ($user?.permissions?.chat?.valves ?? true))} -
- - - -
- {/if} - -
- -
- - {/each} + {/if} +
{:else if tab === 'skills' && skills} -
+
- {#each Object.keys(skills) as skillId} -
-
-
- +
+ +
+ + {/each}
- - {/each} + {/if} + {/if}