diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py
index 3354889e7..287943326 100644
--- a/backend/open_webui/utils/middleware.py
+++ b/backend/open_webui/utils/middleware.py
@@ -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 = "\n"
- for skill in available_skills:
- manifest += f"\n{skill.name}\n{skill.description or ''}\n\n"
- manifest += ""
+ 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"\n{skill.content}\n",
+ form_data["messages"],
+ append=True,
+ )
+ else:
+ # Model-attached: name+description only
+ skill_descriptions += f"\n{skill.name}\n{skill.description or ''}\n\n"
+
+ if skill_descriptions:
form_data["messages"] = add_or_update_system_message(
- manifest, form_data["messages"], append=True
+ f"\n{skill_descriptions}",
+ 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,