From 9ea2b498d69acbf498fd6ee3eeb1c8bb617c45bd Mon Sep 17 00:00:00 2001 From: ymq Date: Mon, 10 Aug 2026 17:07:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20skill=20loader=20=E4=B8=89=E7=BA=A7?= =?UTF-8?q?=E9=9A=94=E7=A6=BB=20+=20org=5Fid=20auto-load?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/agent_loop_v2.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/pipeline_service/agent_loop_v2.py b/pipeline_service/agent_loop_v2.py index bda5b23..dc0cfc0 100644 --- a/pipeline_service/agent_loop_v2.py +++ b/pipeline_service/agent_loop_v2.py @@ -61,6 +61,7 @@ class AgentExecutor: self.config = config self.project_id = project_id self.user_id = user_id + self.org_id = "" # loaded from project context self.workspace_dir = workspace_dir or "/tmp/pipeline_ws" self.model_name = model_name or config.model_name @@ -203,27 +204,39 @@ class AgentExecutor: # Tool Registry try: from pipeline_core.tool_registry import get_tool_registry - self._tool_registry = get_tool_registry() except ImportError: self._tool_registry = None - # Skill Loader + # Skill Loader — 三级隔离 try: from pipeline_core.skill_loader import get_skill_loader - - self._skill_loader = get_skill_loader() + base_dir = self.config.skills.base_dir + self._skill_loader = get_skill_loader(base_dir) except ImportError: self._skill_loader = None # Memory Store try: from pipeline_core.memory_store import get_memory_store - self._memory_store = get_memory_store() except ImportError: self._memory_store = None + # 加载 org_id(从项目上下文) + if self.project_id: + try: + from sqlor.dbpools import DBPools + db = DBPools() + async with db.sqlorContext("pipeline") as sor: + recs = await sor.sqlExe( + "SELECT org_id FROM sd_projects WHERE id=${pid}$", + {"pid": self.project_id}) + if recs: + self.org_id = getattr(recs[0], 'org_id', '') or '' + except Exception: + pass + async def _build_system_prompt(self, user_input: str) -> str: """组装完整 system prompt = 基础 prompt + 记忆 + 技能 + 工具列表""" prompt = self.config.system_prompt @@ -237,10 +250,12 @@ class AgentExecutor: if mem_block: prompt += f"\n\n## 持久记忆\n{mem_block}" - # 注入技能 + # 注入技能(三级隔离:user > org > global) if self.config.skills.enabled and self._skill_loader: skill_block = self._skill_loader.build_prompt_block( user_input=user_input, + org_id=self.org_id if self.config.skills.enable_org else "", + user_id=self.user_id if self.config.skills.enable_user else "", max_skills=self.config.skills.max_skills_per_turn, ) if skill_block: