class SkillPriority(Enum):
"""技能加载优先级"""
SYSTEM = 1 # 固定系统技能
SESSION = 2 # 会话上下文技能
USER = 3 # 用户自定义
DOMAIN = 4 # 领域专业技能
BUILTIN = 5 # 通用工具
DISCOVERY = 6 # 动态发现
class SkillLoader:
"""6 级优先级技能加载器"""
def __init__(self, storage):
self.storage = storage
self.loaded_skills = {}
async def load_skills_for_session(self, session_id: str):
"""为会话加载所有技能"""
skills = []
# 1. 系统技能
skills.extend(await self._load_system_skills())
# 2. 会话上下文技能
skills.extend(await self._load_session_skills(session_id))
# 3. 用户自定义技能
skills.extend(await self._load_user_skills(session_id))
# 4. 领域技能
domain = await self._detect_domain(session_id)
skills.extend(await self._load_domain_skills(domain))
# 5. 内置工具
skills.extend(await self._load_builtin_tools())
# 6. 动态发现技能
skills.extend(await self._discover_skills_dynamically(session_id))
return skills
async def _load_system_skills(self):
"""加载系统技能(始终可用)"""
return await self.storage.get_system_skills()
async def _load_session_skills(self, session_id: str):
"""加载会话特定的技能"""
return await self.storage.get_session_skills(session_id)
async def _load_user_skills(self, session_id: str):
"""加载用户定义的技能"""
user_id = await self.storage.get_user_for_session(session_id)
return await self.storage.get_user_skills(user_id)
async def _load_domain_skills(self, domain: str):
"""加载特定领域的技能"""
if not domain:
return []
return await self.storage.get_domain_skills(domain)
async def _load_builtin_tools(self):
"""加载内置工具"""
return [
BashTool(),
FileReadTool(),
FileWriteTool(),
# ... 其他内置工具
]
async def _discover_skills_dynamically(self, session_id: str):
"""动态发现技能"""
# 扫描技能目录或 MCP
discovered = await self.storage.discover_available_skills()
return discovered
async def _detect_domain(self, session_id: str) -> str:
"""根据会话内容检测领域"""
recent_messages = await self.storage.get_recent_messages(session_id, limit=5)
# 使用 NLP 检测领域
text = " ".join(m.get_text() for m in recent_messages)
return self._classify_domain(text)
def _classify_domain(self, text: str) -> str:
"""简单的领域分类"""
keywords = {
"data": ["sql", "database", "query", "table"],
"web": ["html", "css", "javascript", "react"],
"system": ["bash", "shell", "linux", "windows"],
"code": ["python", "java", "javascript"]
}
text_lower = text.lower()
for domain, kws in keywords.items():
if any(kw in text_lower for kw in kws):
return domain
return "general"