fix(skills): load_skill走resolve_skill容错匹配+未命中提示裸名规范(根治'技能[产线]bid-workflow不存在')

This commit is contained in:
ymq 2026-08-31 16:24:05 +08:00
parent 65db2dddc3
commit 38d9897a78
2 changed files with 15 additions and 9 deletions

View File

@ -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()

View File

@ -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: