refac: manual skill invocation

This commit is contained in:
Timothy Jaeryang Baek
2026-02-14 19:22:17 -06:00
parent 7e224e4a53
commit 393c0071dc
+22 -11
View File
@@ -2136,11 +2136,11 @@ 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("skillIds", [])
# Skills
user_skill_ids = set(form_data.pop("skill_ids", None) or [])
model_skill_ids = set(model.get("info", {}).get("meta", {}).get("skillIds", []))
all_skill_ids = list(set(user_skill_ids + model_skill_ids))
all_skill_ids = user_skill_ids | model_skill_ids
available_skills = []
if all_skill_ids:
from open_webui.models.skills import Skills as SkillsModel
@@ -2156,13 +2156,24 @@ async def process_chat_payload(request, form_data, user, metadata, model):
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>"
skill_descriptions = ""
for skill in available_skills:
if skill.id in user_skill_ids:
# User-selected: inject full content
form_data["messages"] = add_or_update_system_message(
f"<skill name=\"{skill.name}\">\n{skill.content}\n</skill>",
form_data["messages"],
append=True,
)
else:
# Model-attached: name+description only
skill_descriptions += f"<skill>\n<name>{skill.name}</name>\n<description>{skill.description or ''}</description>\n</skill>\n"
if skill_descriptions:
form_data["messages"] = add_or_update_system_message(
manifest, form_data["messages"], append=True
f"<available_skills>\n{skill_descriptions}</available_skills>",
form_data["messages"],
append=True,
)
prompt = get_last_user_message(form_data["messages"])
@@ -2399,7 +2410,7 @@ async def process_chat_payload(request, form_data, user, metadata, model):
{
**extra_params,
"__event_emitter__": event_emitter,
"__skill_ids__": [s.id for s in available_skills],
"__skill_ids__": [s.id for s in available_skills if s.id not in user_skill_ids],
},
features,
model,