首页 > IT职业 > IT职场 > Flink Agents 源码解读
AgentPlan 是 Flink Agent 框架中的一个核心组件,它起到连接用户定义的 Agent 和实际执行环境之间的桥梁作用。AgentPlan 的核心职责如下:
AgentPlan 本质上是将用户友好的Agent定义转换为运行时可执行的结构化表示,使得执行引擎可以高效地处理Agent逻辑。
定义如下:
class AgentPlan(BaseModel): """
从用户自定义 Agent 编译得到的智能体执行计划
核心作用:封装 Agent 运行所需的动作、事件映射、资源、配置等核心信息
"""
# 动作名称到动作对象的映射
actions: Dict[str, Action] # 事件类型(字符串格式)到监听该事件的动作名称列表的映射
actions_by_event: Dict[str, List[str]] # 资源提供者映射:第一层是资源类型,第二层是资源名称,值为对应资源提供者
resource_providers: Dict[ResourceType, Dict[str, ResourceProvider]] | None = None
# Agent 的全局配置
config: AgentConfiguration | None = None
# 私有缓存:已创建的资源实例(避免重复初始化),键为 (资源类型, 资源名称)
__resources: Dict[ResourceType, Dict[str, Resource]] = {}
AgentPlan 在系统中的位置和作用如下:
用户定义的Agent ↓ ↓ (AgentPlan.from_agent) AgentPlan(编译后的执行计划) ↓ ↓(LocalRunner 使用) LocalRunner(实际执行)
AgentPlan 与 Flink 集群的关系如下:
并行度调整的影响如下:
AgentPlan 的流程如下:
@staticmethod
def from_agent(agent: Agent, config: AgentConfiguration) -> "AgentPlan": """
核心工厂方法:将用户自定义的 Agent 编译为 AgentPlan
:param agent: 用户定义的 Agent 实例
:param config: Agent 的全局配置
:return: 编译后的 AgentPlan 实例
"""
# 1. 收集 Agent 中的所有动作(自定义动作 + 内置动作)
actions = {}
actions_by_event =blog.jxvkj.com {} # 合并用户自定义动作和框架内置动作
for action in _get_actions(agent) + BUILT_IN_ACTIONS: # 校验动作名称唯一性,避免重复
assert action.name not in actions, f"Duplicate action name: {action.name}"
actions[action.name] navgation.fovkj.com= action # 构建事件类型到动作名称的映射
for event_type in action.listen_event_types: if event_type not in actions_by_event:
actions_by_event[event_type] = []
actions_by_event[event_type].append(action.name) # 2. 收集 Agent 中的所有资源提供者
resource_providers = {} for provider in _get_resource_providers(agent): type = provider.type
if type not in resource_providers:
resource_providers[type] = {}
name = provider.name # 校验资源名称在同类型下的唯一性
assert name not in resource_providers[type], f"Duplicate resource name: {name}"
resource_providers[type][name] = provider # 3. 创建并返回 AgentPlan 实例
return AgentPlan(
actions=actions,
actions_by_event=actions_by_event,
resource_providers=resource_providers,
config=config,
)
AgentPlan 维护了事件类型到动作的映射关系,用于驱动执行流程。
# 存储结构 actions_by_event: Dict[str, List[str]] # 事件类型 --> 动作名称列表 # 查询方法 def get_actions(self, event_type: str) -> List[Action]: """ 获取监听指定事件类型的所有动作 :param event_type: 事件类型(字符串格式) :return: 动作实例列表 """ return [self.actions[name] for name in self.actions_by_event[event_type]]
AgentPlan 管理所有资源的提供者,并在需要时实例化资源。具体代码如下:
def get_resource(self, name: str, type: ResourceType) -> Resource: """
获取指定类型+名称的资源实例(懒加载 + 缓存复用)
:param name: 资源名称
:param type: 资源类型
:return: 资源实例
"""
# 初始化该类型的资源缓存
if type not in self.__resources:
self.__resources[type] = gov.gov.mz.zuqb.info{} # 若资源未创建,则通过资源提供者创建并缓存
if name not in self.__resources[type]:
resource_provider = self.resource_providers[type][name] # 调用资源提供者的 provide 方法创建资源(支持递归获取依赖资源)
resource = resource_provider.provide(
get_resource=self.get_resource, config=self.config
)
self.__resources[type][name] = resource # 返回缓存的资源实例
return self.__resources[type][name]
AgentPlan 存储和提供动作的配置信息。
def get_action_config(self, action_name: str) -> Dict[str, Any]: """ 获取指定动作的配置 :param action_name: 动作名称 :return: 动作配置字典 """ return self.actions[action_name].config def get_action_config_value(self, action_name: str, key: str) -> Any: """ 获取指定动作配置中的某个键值 :param action_name: 动作名称 :param key: 配置键名 :return: gov.配置值(不存在则返回 None) """ return self.actions[action_name].config.get(key, None)
Flink 原生的 “Plan 体系”(StreamGraph → JobGraph → ExecutionGraph)是 AgentPlan 的底层支撑,其中 AgentPlan 最直接对应原生 Flink 的 JobGraph,而非笼统的 “Flink Plan”。
这是因为,Flink 中 “Plan” 不是单一组件,而是从 “逻辑定义” 到 “物理执行” 的三层编译产物,这是理解对应关系的基础。AgentPlan 是 Flink Agents 对 Agent 逻辑编译后的 “可执行计划”,其核心定位和原生 Flink 的 JobGraph 完全对齐,而非笼统的 “Plan”。
| 原生 Plan 层级 | 核心作用 | 关键特征 |
|---|---|---|
| StreamGraph | 逻辑拓扑(用户视角) | 由 DataStream API 代码生成,描述 “数据处理的逻辑步骤”,不涉及并行度、资源分配 |
| JobGraph | 可执行计划(集群视角) | StreamGraph 编译后的产物,补充并行度、算子链、中间结果传递规则,是 “系统能识别的执行计划” |
| ExecutionGraph | 物理执行图(运行时视角) | JobGraph 提交到集群后生成,绑定 TaskManager、Slot、物理资源,是 “正在运行的拓扑” |
我们来看看AgentPlan和JobGraph之间的关联。
角色一致:都是 “编译层产物”,连接 “高层业务定义” 和 “底层物理执行”:
内容一致:都包含 “执行规则” 而非 “纯逻辑”:
作用一致:都是 “中间层”,不直接运行,而是给底层执行组件(Operator/TaskManager)提供执行依据。
我们再来看看AgentPlan 不对应哪些。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3107309/ ,如需转载,请注明出处,否则将追究法律责任。