feat(role_agent): role_agent_run import role skills

This commit is contained in:
ymq 2026-08-20 12:02:49 +08:00
parent 77f5aa45dc
commit 917eb3eda9

View File

@ -383,6 +383,8 @@ __QNA__
工作空间__WORKSPACE__
产出要求__ROLE_SPECIFIC__
__ROLE_SKILLS__
## 工具
你可以使用以下工具完成工作
__TOOLS__
@ -1086,6 +1088,44 @@ async def _build_fallback_deliverable(workspace_dir, written_files, repos_dir, r
}
async def _build_role_skills_block(sor, project_id, role, org_id=""):
"""为角色 agent 构建技能注入块。
角色专属技能scope=role pipelines/{pid}/roles/{role}/全量注入正文
角色 agent load_skill 工具且角色技能数量少是角色必须遵守的领域规范
其余 scope项目/产线/机构/通用注入目录层名字+描述按优先级降序排列
优先级同名覆盖项目 > 角色 > 产线 > 机构 > 通用SCOPE_PRIORITY 已定义
返回注入 system prompt 的文本无技能或失败时返回空串
"""
try:
pid = await _resolve_pipeline_id(project_id)
from pipeline_core.skill_loader import get_skill_loader, SCOPE_PRIORITY
from pipeline_core.skill_pack import ensure_org_skills
from .workspace import get_workspace_base
ws_base = await get_workspace_base(sor)
skills_dir = ensure_org_skills(ws_base, org_id or '0')
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 not merged:
return ""
blocks = []
role_skills = [s for s in merged.values() if getattr(s, 'scope', '') == 'role']
for s in role_skills:
blocks.append(s.to_prompt_block())
others = sorted([s for s in merged.values() if getattr(s, 'scope', '') != 'role'],
key=lambda s: -SCOPE_PRIORITY.get(getattr(s, 'scope', ''), 0))
if others:
lines = ["## 可用技能(目录,优先级 项目>机构>通用)"]
for s in others[:30]:
lines.append(f"- [{getattr(s, 'scope', '')}] {s.name}: {(s.description or '')[:100]}")
blocks.append("\n".join(lines))
return "\n\n".join(blocks)
except Exception as e:
logger.warning(f"role skills load failed: {e}")
return ""
async def role_agent_run(project_id, role, agent_id=None, model_name=None):
role, _role_specific, _ = await _resolve_role(project_id, role)
if role == 'pm':
@ -1123,12 +1163,16 @@ async def role_agent_run(project_id, role, agent_id=None, model_name=None):
qna_section = await _build_qna_section(sor, task_id, role, agent_id)
tools_text = json.dumps(AGENT_TOOLS, ensure_ascii=False)
# 注入角色技能(角色专属技能全量 + 其余 scope 目录层,优先级 项目>机构>通用)
role_skills = await _build_role_skills_block(sor, project_id, role, org_id)
system = (AGENT_SYSTEM_PROMPT
.replace('__ROLE__', role)
.replace('__TITLE__', title)
.replace('__QNA__', qna_section)
.replace('__WORKSPACE__', workspace_dir)
.replace('__ROLE_SPECIFIC__', role_specific)
.replace('__ROLE_SKILLS__', role_skills)
.replace('__TOOLS__', tools_text))
msgs = [{"role": "system", "content": system}]