feat: update skill specification

This commit is contained in:
莘权 马 2023-09-15 21:56:39 +08:00
parent dda1745c79
commit 89be81524c
2 changed files with 189 additions and 85 deletions

View file

@ -7,10 +7,10 @@
@Desc : Skill YAML Configuration Loader.
"""
from pathlib import Path
from typing import Dict, List, Optional
from typing import Dict, List, Optional, Union
import yaml
from pydantic import BaseModel, Field
from pydantic import BaseModel
from metagpt.config import CONFIG
@ -25,29 +25,43 @@ class Returns(BaseModel):
format: Optional[str] = None
class Prerequisite(BaseModel):
name: str
type: Optional[str] = None
description: Optional[str] = None
default: Optional[str] = None
class Parameter(BaseModel):
type: str
description: str = None
class Skill(BaseModel):
name: str
description: str
id: str
x_prerequisite: Optional[List[Prerequisite]] = Field(default=None, alias="x-prerequisite")
arguments: Dict
description: str = None
id: str = None
required: Optional[Union[List, Dict]] = None
parameters: Dict[str, Parameter] = None
examples: List[Example]
returns: Returns
@property
def arguments(self) -> Dict:
if not self.parameters:
return {}
ret = {}
for k, v in self.parameters.items():
ret[k] = v.description if v.description else ""
return ret
class EntitySkills(BaseModel):
class Entity(BaseModel):
name: str = None
skills: List[Skill]
class Components(BaseModel):
pass
class SkillsDeclaration(BaseModel):
entities: Dict[str, EntitySkills]
skillapi: str
entities: Dict[str, Entity]
components: Components = None
class SkillLoader:
@ -60,8 +74,8 @@ class SkillLoader:
def get_skill_list(self, entity_name: str = "Assistant") -> Dict:
"""Return the skill name based on the skill description."""
entity_skills = self.get_entity(entity_name)
if not entity_skills:
entity = self.get_entity(entity_name)
if not entity:
return {}
agent_skills = CONFIG.agent_skills
@ -73,7 +87,7 @@ class SkillLoader:
names = [AgentSkill(**i).name for i in agent_skills]
description_to_name_mappings = {}
for s in entity_skills.skills:
for s in entity.skills:
if s.name not in names:
continue
description_to_name_mappings[s.description] = s.name
@ -89,8 +103,21 @@ class SkillLoader:
if sk.name == name:
return sk
def get_entity(self, name) -> EntitySkills:
def get_entity(self, name) -> Entity:
"""Return a list of skills for the entity."""
if not self._skills:
return None
return self._skills.entities.get(name)
if __name__ == "__main__":
CONFIG.agent_skills = [
{"id": 1, "name": "text_to_speech", "type": "builtin", "config": {}, "enabled": True},
{"id": 2, "name": "text_to_image", "type": "builtin", "config": {}, "enabled": True},
{"id": 3, "name": "ai_call", "type": "builtin", "config": {}, "enabled": True},
{"id": 3, "name": "data_analysis", "type": "builtin", "config": {}, "enabled": True},
{"id": 5, "name": "crawler", "type": "builtin", "config": {"engine": "ddg"}, "enabled": True},
{"id": 6, "name": "knowledge", "type": "builtin", "config": {}, "enabled": True},
]
loader = SkillLoader()
print(loader.get_skill_list())