From 38d9897a780c203a5a79380c61940cb7d8301fc5 Mon Sep 17 00:00:00 2001 From: ymq Date: Mon, 31 Aug 2026 16:24:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(skills):=20load=5Fskill=E8=B5=B0resolve=5Fs?= =?UTF-8?q?kill=E5=AE=B9=E9=94=99=E5=8C=B9=E9=85=8D+=E6=9C=AA=E5=91=BD?= =?UTF-8?q?=E4=B8=AD=E6=8F=90=E7=A4=BA=E8=A3=B8=E5=90=8D=E8=A7=84=E8=8C=83?= =?UTF-8?q?(=E6=A0=B9=E6=B2=BB'=E6=8A=80=E8=83=BD[=E4=BA=A7=E7=BA=BF]bid-w?= =?UTF-8?q?orkflow=E4=B8=8D=E5=AD=98=E5=9C=A8')?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/agent_loop.py | 13 ++++++++----- pipeline_service/agent_loop_v2.py | 11 +++++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/pipeline_service/agent_loop.py b/pipeline_service/agent_loop.py index 5c1ff13..55fc089 100644 --- a/pipeline_service/agent_loop.py +++ b/pipeline_service/agent_loop.py @@ -2108,19 +2108,22 @@ async def _load_skill_by_name(sor, project_id, role, org_id, name, file_path=Non loader = get_skill_loader(skills_dir) merged = loader.get_merged(pipeline_id=pid, role=role, project_id=project_id, org_id=org_id or '0') - if name not in merged: + from pipeline_core.skill_loader import resolve_skill, normalize_skill_name, format_skill_names + skill = resolve_skill(merged, name) + if skill is None: # 项目模块技能(机构工作空间 modules/*/skill + apps/*/skill)不在 skill_loader 静态树里,运行时补查。 # 全文层对齐 skill_loader.to_prompt_block:剥离 frontmatter 只返回正文(body)。 + cleaned = normalize_skill_name(name) try: ws = await _get_space_dir(sor, project_id) for m in _collect_module_skills(ws): - if m['name'] == name or m['repo'] == name: + if m['name'] in (name, cleaned) or m['repo'] in (name, cleaned): return f"## [项目模块] {m['name']}\n{m['description']}\n\n{m['body']}" except Exception: pass - names = ", ".join(sorted(merged.keys())) or "(无可用技能)" - return f"FAIL: 技能 '{name}' 不存在。可用技能: {names}" - skill = merged[name] + names = format_skill_names(merged) + return (f"FAIL: 技能 '{name}' 不存在。注意:name 只传技能裸名" + f"(如 project-directory-spec),不要带 [产线] 前缀或描述文字。可用技能: {names}") if file_path: return skill.read_linked_file(file_path) body = skill.to_prompt_block() diff --git a/pipeline_service/agent_loop_v2.py b/pipeline_service/agent_loop_v2.py index 8c16617..0146cc4 100644 --- a/pipeline_service/agent_loop_v2.py +++ b/pipeline_service/agent_loop_v2.py @@ -982,10 +982,13 @@ class AgentExecutor: project_id=self.project_id or "", org_id=self.org_id or "", user_id=self.user_id or "") - if name not in merged: - names = ", ".join(sorted(merged.keys())) or "(无可用技能)" - return f"FAIL: 技能 '{name}' 不存在。可用技能: {names}" - return merged[name].to_prompt_block() + from pipeline_core.skill_loader import resolve_skill, format_skill_names + skill = resolve_skill(merged, name) + if skill is None: + names = format_skill_names(merged) + return (f"FAIL: 技能 '{name}' 不存在。注意:name 只传技能裸名" + f"(如 bid-workflow),不要带 [产线] 前缀或描述文字。可用技能: {names}") + return skill.to_prompt_block() async def _t_list_packs(self, sor, p, pid): try: