from __future__ import annotations import logging from .base import BaseSkill, SkillResult, WorkflowContext logger = logging.getLogger("review_agent.file_summary.skills") class SkillRegistry: def __init__(self): self._skills: dict[str, BaseSkill] = {} def register(self, skill: BaseSkill) -> None: if not skill.name: raise ValueError("Skill 必须声明 name。") self._skills[skill.name] = skill logger.info("Skill registered: %s", skill.name, extra={"skill_name": skill.name}) def get(self, name: str) -> BaseSkill: try: return self._skills[name] except KeyError as exc: raise KeyError(f"Skill 未注册:{name}") from exc def execute(self, name: str, context: WorkflowContext) -> SkillResult: logger.info("Skill started: %s", name, extra={"skill_name": name, "batch_id": context.batch.pk}) try: result = self.get(name).run(context) except Exception: logger.exception("Skill crashed: %s", name, extra={"skill_name": name, "batch_id": context.batch.pk}) raise logger.info( "Skill finished: %s", name, extra={ "skill_name": name, "batch_id": context.batch.pk, "success": result.success, "result_message": result.message, }, ) return result