feat: skills backend

This commit is contained in:
Timothy Jaeryang Baek
2026-02-11 14:00:34 -06:00
parent 3fabc085cc
commit c2207887b3
6 changed files with 685 additions and 0 deletions
+23
View File
@@ -2097,6 +2097,29 @@ async def process_chat_payload(request, form_data, user, metadata, model):
tool_ids = form_data.pop("tool_ids", None)
files = form_data.pop("files", None)
# Skills: inject manifest only — model uses view_skill tool to load full content on-demand
user_skill_ids = form_data.pop("skill_ids", None) or []
model_skill_ids = model.get("info", {}).get("meta", {}).get("skills", [])
all_skill_ids = list(set(user_skill_ids + model_skill_ids))
if all_skill_ids:
from open_webui.models.skills import Skills as SkillsModel
accessible_skill_ids = {s.id for s in SkillsModel.get_skills_by_user_id(user.id, "read")}
available_skills = [
s for sid in all_skill_ids
if sid in accessible_skill_ids and (s := SkillsModel.get_skill_by_id(sid)) and s.is_active
]
if available_skills:
manifest = "<available_skills>\n"
for skill in available_skills:
manifest += f"<skill>\n<name>{skill.name}</name>\n<description>{skill.description or ''}</description>\n</skill>\n"
manifest += "</available_skills>"
form_data["messages"] = add_or_update_system_message(
manifest, form_data["messages"], append=True
)
prompt = get_last_user_message(form_data["messages"])
# TODO: re-enable URL extraction from prompt
# urls = []
+5
View File
@@ -77,6 +77,7 @@ from open_webui.tools.builtin import (
search_knowledge_files,
query_knowledge_files,
view_knowledge_file,
view_skill,
)
import copy
@@ -506,6 +507,10 @@ def get_builtin_tools(
]
)
# Skills tools - view_skill allows model to load full skill instructions on demand
if is_builtin_tool_enabled("skills"):
builtin_functions.append(view_skill)
for func in builtin_functions:
callable = get_async_tool_function_and_apply_extra_params(
func,