222 lines
7.7 KiB
Python
222 lines
7.7 KiB
Python
"""ExpertConfig 和 ExpertTemplate 单元测试"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
import pytest
|
|
|
|
from agentkit.core.config_driven import AgentConfig
|
|
from agentkit.experts.config import ExpertConfig, ExpertTemplate
|
|
|
|
|
|
# ── 辅助函数 ──────────────────────────────────────────────
|
|
|
|
|
|
def _make_expert_config(
|
|
name: str = "test_expert",
|
|
agent_type: str = "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,
|
|
**kwargs: Any,
|
|
) -> ExpertConfig:
|
|
"""创建测试用 ExpertConfig 实例"""
|
|
return ExpertConfig(
|
|
name=name,
|
|
agent_type=agent_type,
|
|
persona=persona,
|
|
thinking_style=thinking_style,
|
|
collaboration_strategy=collaboration_strategy,
|
|
bound_skills=bound_skills,
|
|
avatar=avatar,
|
|
color=color,
|
|
is_lead=is_lead,
|
|
**kwargs,
|
|
)
|
|
|
|
|
|
# ── ExpertConfig 测试 ─────────────────────────────────────
|
|
|
|
|
|
class TestExpertConfig:
|
|
"""ExpertConfig 配置测试"""
|
|
|
|
def test_creation_with_all_fields(self):
|
|
"""创建 ExpertConfig 并设置所有字段"""
|
|
config = ExpertConfig(
|
|
name="analyst",
|
|
agent_type="analyst",
|
|
persona="善于数据分析的专家",
|
|
thinking_style="逻辑推理",
|
|
collaboration_strategy="cooperative",
|
|
bound_skills=["data_query", "chart_gen"],
|
|
avatar="C",
|
|
color="#52c41a",
|
|
is_lead=True,
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "数据分析师"},
|
|
)
|
|
assert config.name == "analyst"
|
|
assert config.agent_type == "analyst"
|
|
assert config.persona == "善于数据分析的专家"
|
|
assert config.thinking_style == "逻辑推理"
|
|
assert config.collaboration_strategy == "cooperative"
|
|
assert config.bound_skills == ["data_query", "chart_gen"]
|
|
assert config.avatar == "C"
|
|
assert config.color == "#52c41a"
|
|
assert config.is_lead is True
|
|
|
|
def test_inherits_agent_config_fields(self):
|
|
"""ExpertConfig 继承 AgentConfig 基础字段"""
|
|
config = ExpertConfig(
|
|
name="test",
|
|
agent_type="test",
|
|
version="2.0.0",
|
|
description="测试专家",
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "测试"},
|
|
llm={"model": "gpt-4"},
|
|
tools=["search"],
|
|
)
|
|
assert isinstance(config, AgentConfig)
|
|
assert config.version == "2.0.0"
|
|
assert config.description == "测试专家"
|
|
assert config.prompt == {"identity": "测试"}
|
|
assert config.llm == {"model": "gpt-4"}
|
|
assert config.tools == ["search"]
|
|
|
|
def test_to_dict_from_dict_roundtrip(self):
|
|
"""to_dict / from_dict 往返序列化"""
|
|
config = ExpertConfig(
|
|
name="roundtrip",
|
|
agent_type="expert",
|
|
persona="测试角色",
|
|
thinking_style="创造性思维",
|
|
collaboration_strategy="lead",
|
|
bound_skills=["skill_a", "skill_b"],
|
|
avatar="B",
|
|
color="#ff4d4f",
|
|
is_lead=True,
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "往返测试"},
|
|
)
|
|
d = config.to_dict()
|
|
restored = ExpertConfig.from_dict(d)
|
|
|
|
assert restored.name == config.name
|
|
assert restored.agent_type == config.agent_type
|
|
assert restored.persona == config.persona
|
|
assert restored.thinking_style == config.thinking_style
|
|
assert restored.collaboration_strategy == config.collaboration_strategy
|
|
assert restored.bound_skills == config.bound_skills
|
|
assert restored.avatar == config.avatar
|
|
assert restored.color == config.color
|
|
assert restored.is_lead == config.is_lead
|
|
assert restored.prompt == config.prompt
|
|
|
|
def test_bound_skills_defaults_to_empty_list(self):
|
|
"""bound_skills 未设置时默认为空列表"""
|
|
config = ExpertConfig(
|
|
name="no_skills",
|
|
agent_type="expert",
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "无技能"},
|
|
)
|
|
assert config.bound_skills == []
|
|
|
|
def test_default_values(self):
|
|
"""ExpertConfig 默认值测试"""
|
|
config = ExpertConfig(
|
|
name="defaults",
|
|
agent_type="expert",
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "默认"},
|
|
)
|
|
assert config.persona == ""
|
|
assert config.thinking_style == ""
|
|
assert config.collaboration_strategy == "cooperative"
|
|
assert config.bound_skills == []
|
|
assert config.avatar == ""
|
|
assert config.color == "#1890ff"
|
|
assert config.is_lead is False
|
|
|
|
|
|
# ── ExpertTemplate 测试 ───────────────────────────────────
|
|
|
|
|
|
class TestExpertTemplate:
|
|
"""ExpertTemplate 模板测试"""
|
|
|
|
def test_creation(self):
|
|
"""创建 ExpertTemplate"""
|
|
config = ExpertConfig(
|
|
name="analyst",
|
|
agent_type="analyst",
|
|
persona="数据分析师",
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "分析师"},
|
|
)
|
|
template = ExpertTemplate(
|
|
name="analyst_template",
|
|
config=config,
|
|
is_builtin=True,
|
|
description="内置数据分析师模板",
|
|
)
|
|
assert template.name == "analyst_template"
|
|
assert template.config is config
|
|
assert template.is_builtin is True
|
|
assert template.description == "内置数据分析师模板"
|
|
|
|
def test_creation_defaults(self):
|
|
"""ExpertTemplate 默认值"""
|
|
config = ExpertConfig(
|
|
name="default_expert",
|
|
agent_type="expert",
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "默认"},
|
|
)
|
|
template = ExpertTemplate(name="default_template", config=config)
|
|
assert template.is_builtin is False
|
|
assert template.description == ""
|
|
|
|
def test_to_dict_from_dict_roundtrip(self):
|
|
"""ExpertTemplate to_dict / from_dict 往返序列化"""
|
|
config = ExpertConfig(
|
|
name="roundtrip_expert",
|
|
agent_type="expert",
|
|
persona="往返测试",
|
|
thinking_style="分析型",
|
|
collaboration_strategy="cooperative",
|
|
bound_skills=["skill_x"],
|
|
avatar="M",
|
|
color="#722ed1",
|
|
is_lead=False,
|
|
task_mode="llm_generate",
|
|
prompt={"identity": "往返"},
|
|
)
|
|
template = ExpertTemplate(
|
|
name="roundtrip_template",
|
|
config=config,
|
|
is_builtin=False,
|
|
description="往返测试模板",
|
|
)
|
|
d = template.to_dict()
|
|
restored = ExpertTemplate.from_dict(d)
|
|
|
|
assert restored.name == template.name
|
|
assert restored.is_builtin == template.is_builtin
|
|
assert restored.description == template.description
|
|
assert restored.config.name == config.name
|
|
assert restored.config.persona == config.persona
|
|
assert restored.config.thinking_style == config.thinking_style
|
|
assert restored.config.collaboration_strategy == config.collaboration_strategy
|
|
assert restored.config.bound_skills == config.bound_skills
|
|
assert restored.config.avatar == config.avatar
|
|
assert restored.config.color == config.color
|
|
assert restored.config.is_lead == config.is_lead
|