feat(beaver): 完成Task Team功能v1实现,重构后端架构支持统一内核
新增内部Task系统,包括验证、反馈门控机制,实现自动质量验证 (通过率>=0.75)和用户反馈闭环(satisfied/revise/abandon)。 实现Agent Team v1协调器,支持sequence/parallel/dag执行策略, sub-agent复用主AgentLoop,每个run使用独立memory snapshot。 建立Skill学习pipeline,包含draft/审核/发布/回滚完整生命周期, 通过Task验证通过且用户满意才生成学习候选。 重构目录结构,移除third_party依赖,建立统一engine内核, 所有agent共享运行时基础组件。 更新ContextBuilder清理provider消息字段,增强SkillContext版本管理, 集成TaskExecutionPlanner和TaskSkillResolver实现技能解析机制。
This commit is contained in:
@ -0,0 +1,91 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from beaver.coordinator.models import AgentDescriptor, ExecutionGraph, ExecutionNode
|
||||
from beaver.coordinator.registry import AgentRegistry, RegisteredAgent, TargetResolver
|
||||
from beaver.tasks import TaskRecord
|
||||
|
||||
|
||||
def _task() -> TaskRecord:
|
||||
return TaskRecord(
|
||||
task_id="task-1",
|
||||
session_id="session-1",
|
||||
description="implement tests",
|
||||
goal="implement tests",
|
||||
constraints=[],
|
||||
priority=0,
|
||||
status="open",
|
||||
creator="test",
|
||||
created_at="now",
|
||||
updated_at="now",
|
||||
)
|
||||
|
||||
|
||||
def test_registry_seeds_builtin_agents_and_filters_disabled(tmp_path) -> None:
|
||||
registry = AgentRegistry(tmp_path)
|
||||
|
||||
assert {agent.agent_id for agent in registry.list_active_agents()} >= {
|
||||
"researcher",
|
||||
"implementer",
|
||||
"reviewer",
|
||||
"tester",
|
||||
"documenter",
|
||||
}
|
||||
|
||||
registry.disable_agent("tester")
|
||||
|
||||
assert "tester" not in {agent.agent_id for agent in registry.list_active_agents()}
|
||||
|
||||
|
||||
def test_resolver_selects_registered_agent_by_role_and_capabilities(tmp_path) -> None:
|
||||
registry = AgentRegistry(tmp_path)
|
||||
registry.upsert_agent(
|
||||
RegisteredAgent(
|
||||
agent_id="security-reviewer",
|
||||
name="security-reviewer",
|
||||
display_name="Security Reviewer",
|
||||
role="security review",
|
||||
description="Reviews auth, permissions, and data exposure risk.",
|
||||
system_prompt="review security",
|
||||
capabilities=["security", "review", "auth"],
|
||||
priority=90,
|
||||
)
|
||||
)
|
||||
resolver = TargetResolver(registry)
|
||||
graph = ExecutionGraph(
|
||||
strategy="sequence",
|
||||
nodes=[
|
||||
ExecutionNode(
|
||||
node_id="review",
|
||||
task="review auth handling",
|
||||
agent=AgentDescriptor(
|
||||
name="reviewer",
|
||||
role="security review",
|
||||
metadata={"requested_capabilities": ["security"]},
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
|
||||
resolved, reports = resolver.resolve_graph(graph, task=_task(), user_message="review auth", attempt_index=1)
|
||||
|
||||
assert resolved.nodes[0].agent.metadata["agent_id"] == "security-reviewer"
|
||||
assert reports[0].fallback_used is False
|
||||
assert reports[0].selected_agent_id == "security-reviewer"
|
||||
|
||||
|
||||
def test_resolver_falls_back_to_ephemeral_agent_when_no_match(tmp_path) -> None:
|
||||
registry = AgentRegistry(tmp_path)
|
||||
for agent in registry.list_agents():
|
||||
registry.disable_agent(agent.agent_id)
|
||||
resolver = TargetResolver(registry)
|
||||
graph = ExecutionGraph(
|
||||
strategy="sequence",
|
||||
nodes=[ExecutionNode("rare", "rare work", AgentDescriptor(name="rare", role="rare"))],
|
||||
)
|
||||
|
||||
resolved, reports = resolver.resolve_graph(graph, task=_task(), user_message="rare work", attempt_index=1)
|
||||
|
||||
assert resolved.nodes[0].agent.name == "rare"
|
||||
assert resolved.nodes[0].agent.metadata["resolution"] == "fallback_ephemeral"
|
||||
assert reports[0].fallback_used is True
|
||||
|
||||
Reference in New Issue
Block a user