base.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. """Agent 抽象基类 —— 领域核心
  2. 定义 Agent 的契约:每个 Agent 拥有一组 Tool、一份 Memory、一个 run() 方法。
  3. 业务方继承 Agent 实现具体智能体逻辑,框架层通过 AgentOrchestrator 调度执行。
  4. """
  5. from __future__ import annotations
  6. from abc import ABC, abstractmethod
  7. from dataclasses import dataclass, field
  8. from enum import Enum
  9. from typing import Any, Dict, List, Optional
  10. from supply.core.agent.tool import Tool
  11. from supply.core.agent.memory import Memory
  12. # ==================== Agent 状态 ====================
  13. class AgentStatus(str, Enum):
  14. IDLE = "idle"
  15. RUNNING = "running"
  16. SUCCESS = "success"
  17. FAILED = "failed"
  18. CANCELLED = "cancelled"
  19. # ==================== Agent 上下文 ====================
  20. @dataclass
  21. class AgentContext:
  22. """Agent 执行上下文 —— 携带本次调用的会话状态
  23. 每次 run() 传入一个新的 AgentContext,包含:
  24. - session_id: 会话标识,用于 Memory 存取和日志追踪
  25. - working_memory: 临时工作区,Agent 可在执行过程中读写
  26. - metadata: 业务方注入的额外参数(topic, user_id 等)
  27. 与 trace_id 的关系:
  28. trace_id 是分布式追踪 ID(跨 Agent 调用),session_id 是单次 Agent 会话 ID。
  29. trace_id 可作为 session_id 使用,也可独立设置。
  30. """
  31. session_id: str = ""
  32. trace_id: str = ""
  33. working_memory: Dict[str, Any] = field(default_factory=dict)
  34. metadata: Dict[str, Any] = field(default_factory=dict)
  35. # ==================== Agent 执行结果 ====================
  36. @dataclass
  37. class AgentResult:
  38. """Agent 执行结果"""
  39. status: AgentStatus = AgentStatus.IDLE
  40. data: Any = None
  41. error: Optional[str] = None
  42. # 执行过程中产生的日志事件(由 orchestator 统一推送 SLS)
  43. events: List[Dict[str, Any]] = field(default_factory=list)
  44. # 工具调用记录(用于审计和调试)
  45. tool_calls: List[Dict[str, Any]] = field(default_factory=list)
  46. @property
  47. def success(self) -> bool:
  48. return self.status == AgentStatus.SUCCESS
  49. @classmethod
  50. def ok(cls, data: Any = None, **kwargs) -> "AgentResult":
  51. return cls(status=AgentStatus.SUCCESS, data=data, **kwargs)
  52. @classmethod
  53. def fail(cls, error: str, **kwargs) -> "AgentResult":
  54. return cls(status=AgentStatus.FAILED, error=error, **kwargs)
  55. # ==================== Agent 抽象基类 ====================
  56. class Agent(ABC):
  57. """Agent 抽象基类
  58. 每个 Agent 是独立的智能体单元,拥有:
  59. - name / description: 标识与描述
  60. - tools: 可调用的工具集合
  61. - memory: 记忆系统(会话记忆 / 向量记忆)
  62. 使用方式:
  63. class ContentWriter(Agent):
  64. name = "content_writer"
  65. description = "长文写作智能体"
  66. def __init__(self):
  67. self._tools = [WebSearchTool(), FactCheckTool()]
  68. self._memory = ConversationMemory(max_turns=10)
  69. @property
  70. def tools(self) -> list[Tool]:
  71. return self._tools
  72. @property
  73. def memory(self) -> Memory:
  74. return self._memory
  75. async def run(self, ctx: AgentContext) -> AgentResult:
  76. # 1. 从 memory 获取历史
  77. # 2. 调用 LLM 规划
  78. # 3. 执行 tool 调用
  79. # 4. 更新 memory
  80. ...
  81. """
  82. @property
  83. @abstractmethod
  84. def name(self) -> str:
  85. """Agent 唯一标识"""
  86. ...
  87. @property
  88. @abstractmethod
  89. def description(self) -> str:
  90. """Agent 功能描述"""
  91. ...
  92. @property
  93. @abstractmethod
  94. def tools(self) -> List[Tool]:
  95. """Agent 可调用的工具列表"""
  96. ...
  97. @property
  98. @abstractmethod
  99. def memory(self) -> Memory:
  100. """Agent 的记忆系统"""
  101. ...
  102. @abstractmethod
  103. async def run(self, ctx: AgentContext) -> AgentResult:
  104. """执行 Agent 主逻辑
  105. Args:
  106. ctx: 执行上下文(session、trace、metadata)
  107. Returns:
  108. AgentResult: 执行结果(success/fail + data)
  109. """
  110. ...
  111. def __repr__(self) -> str:
  112. return f"<Agent name={self.name}>"