feat: skill loader 三级隔离 + org_id auto-load

This commit is contained in:
ymq 2026-08-10 17:07:22 +08:00
parent ea9b0f2ae4
commit 9ea2b498d6

View File

@ -61,6 +61,7 @@ class AgentExecutor:
self.config = config self.config = config
self.project_id = project_id self.project_id = project_id
self.user_id = user_id self.user_id = user_id
self.org_id = "" # loaded from project context
self.workspace_dir = workspace_dir or "/tmp/pipeline_ws" self.workspace_dir = workspace_dir or "/tmp/pipeline_ws"
self.model_name = model_name or config.model_name self.model_name = model_name or config.model_name
@ -203,27 +204,39 @@ class AgentExecutor:
# Tool Registry # Tool Registry
try: try:
from pipeline_core.tool_registry import get_tool_registry from pipeline_core.tool_registry import get_tool_registry
self._tool_registry = get_tool_registry() self._tool_registry = get_tool_registry()
except ImportError: except ImportError:
self._tool_registry = None self._tool_registry = None
# Skill Loader # Skill Loader — 三级隔离
try: try:
from pipeline_core.skill_loader import get_skill_loader from pipeline_core.skill_loader import get_skill_loader
base_dir = self.config.skills.base_dir
self._skill_loader = get_skill_loader() self._skill_loader = get_skill_loader(base_dir)
except ImportError: except ImportError:
self._skill_loader = None self._skill_loader = None
# Memory Store # Memory Store
try: try:
from pipeline_core.memory_store import get_memory_store from pipeline_core.memory_store import get_memory_store
self._memory_store = get_memory_store() self._memory_store = get_memory_store()
except ImportError: except ImportError:
self._memory_store = None 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: async def _build_system_prompt(self, user_input: str) -> str:
"""组装完整 system prompt = 基础 prompt + 记忆 + 技能 + 工具列表""" """组装完整 system prompt = 基础 prompt + 记忆 + 技能 + 工具列表"""
prompt = self.config.system_prompt prompt = self.config.system_prompt
@ -237,10 +250,12 @@ class AgentExecutor:
if mem_block: if mem_block:
prompt += f"\n\n## 持久记忆\n{mem_block}" prompt += f"\n\n## 持久记忆\n{mem_block}"
# 注入技能 # 注入技能(三级隔离:user > org > global)
if self.config.skills.enabled and self._skill_loader: if self.config.skills.enabled and self._skill_loader:
skill_block = self._skill_loader.build_prompt_block( skill_block = self._skill_loader.build_prompt_block(
user_input=user_input, 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, max_skills=self.config.skills.max_skills_per_turn,
) )
if skill_block: if skill_block: