diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 0b67c6deed..6543afe535 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2808,7 +2808,11 @@ async def process_chat_payload(request, form_data, user, metadata, model): if note_files: files = [*(files or []), *note_files] - if skill_ids or use_builtin_tools: + use_skill_tools = use_builtin_tools and (model.get('info', {}).get('meta', {}).get('builtinTools') or {}).get( + 'skills', True + ) + + if skill_ids or use_skill_tools: from open_webui.models.skills import Skills as SkillsModel from open_webui.utils.terminals import ( format_terminal_skill_context, @@ -2821,7 +2825,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): db_skill_ids = [sid for sid in skill_ids if not sid.startswith(terminal_skill_prefix)] terminal_skill_ids = [sid for sid in skill_ids if sid.startswith(terminal_skill_prefix)] - if use_builtin_tools: + if use_skill_tools: accessible_skills = {s.id: s for s in await SkillsModel.get_skills(user_id=user.id)} db_skill_ids = sorted(accessible_skills) else: @@ -2834,7 +2838,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): skill_manifest = '' for skill in available_skills: - if skill.id in mentioned_skill_ids or not use_builtin_tools: + if skill.id in mentioned_skill_ids or not use_skill_tools: form_data['messages'] = add_or_update_system_message( f'\n{skill.content}\n', form_data['messages'], @@ -2855,7 +2859,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): listed_terminal_skills = listed if isinstance(listed, list) else [] - if terminal_id and use_builtin_tools: + if terminal_id and use_skill_tools: terminal_skills = listed_terminal_skills elif terminal_skill_ids: terminal_skill_map = {skill['id']: skill for skill in listed_terminal_skills} @@ -2863,7 +2867,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): for skill in terminal_skills: sid = skill['id'] - if sid in mentioned_skill_ids or not use_builtin_tools: + if sid in mentioned_skill_ids or not use_skill_tools: skill_name = unquote(sid.removeprefix(terminal_skill_prefix)) loaded = await get_terminal_skill(request, user.model_dump(), metadata, skill_name, extra_params) if loaded: diff --git a/src/lib/components/workspace/Models/BuiltinTools.svelte b/src/lib/components/workspace/Models/BuiltinTools.svelte index 9164f55a8b..6daa3fa496 100644 --- a/src/lib/components/workspace/Models/BuiltinTools.svelte +++ b/src/lib/components/workspace/Models/BuiltinTools.svelte @@ -73,6 +73,10 @@ subagents: { label: $i18n.t('settings.admin.models.builtinTools.subagents.label'), description: $i18n.t('settings.admin.models.builtinTools.subagents.description') + }, + skills: { + label: $i18n.t('settings.admin.models.builtinTools.skills.label'), + description: $i18n.t('settings.admin.models.builtinTools.skills.description') } }; diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index ee7dba23b5..d8b8e4cd03 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -2562,6 +2562,8 @@ "settings.admin.models.builtinTools.notes.label": "Notes", "settings.admin.models.builtinTools.notifications.description": "Send notifications to configured webhook targets", "settings.admin.models.builtinTools.notifications.label": "Notifications", + "settings.admin.models.builtinTools.skills.description": "Find and load skill instructions on demand", + "settings.admin.models.builtinTools.skills.label": "Skills", "settings.admin.models.builtinTools.subagents.description": "Delegate focused work to parallel sub-agents", "settings.admin.models.builtinTools.subagents.label": "Sub-agents", "settings.admin.models.builtinTools.tasks.description": "Break down complex requests into trackable steps",