45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
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
|