139 lines
4.6 KiB
Python
139 lines
4.6 KiB
Python
"""Expert 配置与模板 - ExpertConfig, ExpertTemplate"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from dataclasses import dataclass, field
|
||
from typing import Any
|
||
|
||
from agentkit.core.config_driven import AgentConfig
|
||
|
||
|
||
class ExpertConfig(AgentConfig):
|
||
"""扩展 AgentConfig,新增 Expert 专属字段
|
||
|
||
Expert 是比 Skill 更高层的角色抽象,一个 Expert 聚合多个 Skill,
|
||
并包含 persona、thinking_style、collaboration_strategy 等角色属性。
|
||
"""
|
||
|
||
def __init__(
|
||
self,
|
||
name: str,
|
||
agent_type: str,
|
||
version: str = "1.0.0",
|
||
description: str = "",
|
||
task_mode: str = "llm_generate",
|
||
supported_tasks: list[str] | None = None,
|
||
max_concurrency: int = 1,
|
||
input_schema: dict[str, Any] | None = None,
|
||
output_schema: dict[str, Any] | None = None,
|
||
prompt: dict[str, str] | None = None,
|
||
llm: dict[str, Any] | None = None,
|
||
tools: list[str] | None = None,
|
||
memory: dict[str, Any] | None = None,
|
||
custom_handler: str | None = None,
|
||
# Expert 专属字段
|
||
persona: str = "",
|
||
thinking_style: str = "",
|
||
collaboration_strategy: str = "cooperative",
|
||
bound_skills: list[str] | None = None,
|
||
avatar: str = "",
|
||
color: str = "#1890ff",
|
||
is_lead: bool = False,
|
||
):
|
||
super().__init__(
|
||
name=name,
|
||
agent_type=agent_type,
|
||
version=version,
|
||
description=description,
|
||
task_mode=task_mode,
|
||
supported_tasks=supported_tasks,
|
||
max_concurrency=max_concurrency,
|
||
input_schema=input_schema,
|
||
output_schema=output_schema,
|
||
prompt=prompt,
|
||
llm=llm,
|
||
tools=tools,
|
||
memory=memory,
|
||
custom_handler=custom_handler,
|
||
)
|
||
self.persona = persona
|
||
self.thinking_style = thinking_style
|
||
self.collaboration_strategy = collaboration_strategy
|
||
self.bound_skills = bound_skills or []
|
||
self.avatar = avatar
|
||
self.color = color
|
||
self.is_lead = is_lead
|
||
|
||
@classmethod
|
||
def from_dict(cls, data: dict[str, Any]) -> ExpertConfig:
|
||
"""从字典创建配置"""
|
||
return cls(
|
||
name=data["name"],
|
||
agent_type=data["agent_type"],
|
||
version=data.get("version", "1.0.0"),
|
||
description=data.get("description", ""),
|
||
task_mode=data.get("task_mode", "llm_generate"),
|
||
supported_tasks=data.get("supported_tasks"),
|
||
max_concurrency=data.get("max_concurrency", 1),
|
||
input_schema=data.get("input_schema"),
|
||
output_schema=data.get("output_schema"),
|
||
prompt=data.get("prompt"),
|
||
llm=data.get("llm"),
|
||
tools=data.get("tools"),
|
||
memory=data.get("memory"),
|
||
custom_handler=data.get("custom_handler"),
|
||
persona=data.get("persona", ""),
|
||
thinking_style=data.get("thinking_style", ""),
|
||
collaboration_strategy=data.get("collaboration_strategy", "cooperative"),
|
||
bound_skills=data.get("bound_skills"),
|
||
avatar=data.get("avatar", ""),
|
||
color=data.get("color", "#1890ff"),
|
||
is_lead=data.get("is_lead", False),
|
||
)
|
||
|
||
def to_dict(self) -> dict[str, Any]:
|
||
"""序列化为字典,包含 Expert 专属字段"""
|
||
d = super().to_dict()
|
||
d["persona"] = self.persona
|
||
d["thinking_style"] = self.thinking_style
|
||
d["collaboration_strategy"] = self.collaboration_strategy
|
||
d["bound_skills"] = self.bound_skills
|
||
d["avatar"] = self.avatar
|
||
d["color"] = self.color
|
||
d["is_lead"] = self.is_lead
|
||
return d
|
||
|
||
|
||
@dataclass
|
||
class ExpertTemplate:
|
||
"""Expert 模板 - 可复用的 Expert 配置模板
|
||
|
||
用于预定义 Expert 角色配置,支持内置模板和用户自定义模板。
|
||
"""
|
||
|
||
name: str
|
||
config: ExpertConfig
|
||
is_builtin: bool = False
|
||
description: str = ""
|
||
|
||
def to_dict(self) -> dict[str, Any]:
|
||
"""序列化为字典"""
|
||
return {
|
||
"name": self.name,
|
||
"config": self.config.to_dict(),
|
||
"is_builtin": self.is_builtin,
|
||
"description": self.description,
|
||
}
|
||
|
||
@classmethod
|
||
def from_dict(cls, data: dict[str, Any]) -> ExpertTemplate:
|
||
"""从字典创建模板"""
|
||
config_data = data["config"]
|
||
config = ExpertConfig.from_dict(config_data)
|
||
return cls(
|
||
name=data["name"],
|
||
config=config,
|
||
is_builtin=data.get("is_builtin", False),
|
||
description=data.get("description", ""),
|
||
)
|