models.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. """
  2. Skill 数据模型
  3. """
  4. from dataclasses import dataclass, field
  5. from datetime import datetime
  6. from typing import Dict, Any, List, Optional
  7. import uuid
  8. @dataclass
  9. class Skill:
  10. """
  11. 技能 - 从 Markdown 文件加载的领域知识
  12. 技能可以形成层次结构(通过 parent_id)
  13. """
  14. skill_id: str
  15. scope: str # "agent:{type}" 或 "user:{uid}"
  16. name: str
  17. description: str
  18. category: str # 分类,如 "search", "reasoning", "writing"
  19. # 层次结构
  20. parent_id: Optional[str] = None
  21. # 内容
  22. content: Optional[str] = None # 完整的 skill 内容(Markdown)
  23. guidelines: List[str] = field(default_factory=list)
  24. derived_from: List[str] = field(default_factory=list)
  25. # 版本
  26. version: int = 1
  27. # 时间
  28. created_at: datetime = field(default_factory=datetime.now)
  29. updated_at: datetime = field(default_factory=datetime.now)
  30. @classmethod
  31. def create(
  32. cls,
  33. scope: str,
  34. name: str,
  35. description: str,
  36. category: str = "general",
  37. content: Optional[str] = None,
  38. guidelines: List[str] = None,
  39. derived_from: List[str] = None,
  40. parent_id: Optional[str] = None,
  41. ) -> "Skill":
  42. """创建新的 Skill"""
  43. now = datetime.now()
  44. return cls(
  45. skill_id=str(uuid.uuid4()),
  46. scope=scope,
  47. name=name,
  48. description=description,
  49. category=category,
  50. parent_id=parent_id,
  51. content=content,
  52. guidelines=guidelines or [],
  53. derived_from=derived_from or [],
  54. created_at=now,
  55. updated_at=now,
  56. )
  57. def to_dict(self) -> Dict[str, Any]:
  58. """转换为字典"""
  59. return {
  60. "skill_id": self.skill_id,
  61. "scope": self.scope,
  62. "name": self.name,
  63. "description": self.description,
  64. "category": self.category,
  65. "parent_id": self.parent_id,
  66. "content": self.content,
  67. "guidelines": self.guidelines,
  68. "derived_from": self.derived_from,
  69. "version": self.version,
  70. "created_at": self.created_at.isoformat() if self.created_at else None,
  71. "updated_at": self.updated_at.isoformat() if self.updated_at else None,
  72. }
  73. def to_prompt_text(self) -> str:
  74. """
  75. 转换为可注入 Prompt 的文本
  76. 优先使用完整的 content(如果有),否则使用 description + guidelines
  77. """
  78. if self.content:
  79. return self.content.strip()
  80. lines = [f"### {self.name}", self.description]
  81. if self.guidelines:
  82. lines.append("指导原则:")
  83. for g in self.guidelines:
  84. lines.append(f"- {g}")
  85. return "\n".join(lines)