ADK-Python核心回调配置:事件处理与钩子函数

ADK-Python核心回调配置:事件处理与钩子函数

【免费下载链接】adk-python 一款开源、代码优先的Python工具包,用于构建、评估和部署灵活可控的复杂 AI agents 【免费下载链接】adk-python 项目地址: https://gitcode.com/GitHub_Trending/ad/adk-python

在构建复杂的AI Agent系统时,事件处理和钩子函数是至关重要的组件。ADK-Python(Agent Development Kit)提供了强大而灵活的回调配置机制,让开发者能够在Agent执行的关键节点注入自定义逻辑。本文将深入探讨ADK-Python的核心回调配置体系,帮助您掌握事件处理的最佳实践。

🔧 回调配置概览

ADK-Python的回调系统覆盖了Agent生命周期的各个关键阶段,包括:

回调类型触发时机主要用途
Agent回调Agent执行前后日志记录、状态监控、权限验证
Model回调LLM调用前后请求/响应处理、内容过滤、成本控制
Tool回调工具执行前后参数验证、结果处理、错误恢复
插件回调各种事件节点扩展功能、集成第三方服务

🎯 核心回调类型详解

1. Agent级别回调

Agent回调在Agent执行的关键节点触发,主要用于全局状态管理和监控。

# 示例:Agent前后回调函数
async def before_agent_callback(callback_context):
    """Agent执行前的回调"""
    print(f'Agent {callback_context.agent.name} 开始执行')
    # 可以在这里添加权限验证、日志记录等逻辑
    return None

async def after_agent_callback(callback_context):
    """Agent执行后的回调"""
    print(f'Agent {callback_context.agent.name} 执行完成')
    # 可以在这里添加状态清理、性能统计等逻辑
    return None

2. Model级别回调

Model回调在LLM模型调用前后触发,用于处理模型请求和响应。

# 示例:Model前后回调函数
async def before_model_callback(callback_context, llm_request):
    """模型调用前的回调"""
    print('准备调用LLM模型')
    # 可以在这里修改请求参数、添加提示词等
    return None

async def after_model_callback(callback_context, llm_response):
    """模型调用后的回调"""
    print('LLM模型调用完成')
    # 可以在这里处理响应内容、记录使用情况等
    return None

3. Tool级别回调

Tool回调在工具函数执行前后触发,用于参数验证和结果处理。

# 示例:Tool前后回调函数
def before_tool_callback(tool, args, tool_context):
    """工具执行前的回调"""
    print(f'准备执行工具: {tool.name}')
    # 可以在这里验证参数、检查权限等
    return None

def after_tool_callback(tool, args, tool_context, tool_response):
    """工具执行后的回调"""
    print(f'工具 {tool.name} 执行完成')
    # 可以在这里处理工具结果、记录执行日志等
    return {'processed_response': tool_response}

📋 回调配置YAML示例

ADK-Python支持通过YAML配置文件定义回调链,实现声明式的回调管理。

name: advanced_agent_with_callbacks
model: gemini-2.0-flash
description: 带有完整回调链的高级Agent

instruction: |
  你是一个智能助手,能够处理各种任务并使用工具。

tools:
  - name: my_tools.roll_die
  - name: my_tools.check_prime

# Agent级别回调配置
before_agent_callbacks:
  - name: my_callbacks.before_agent_callback1
  - name: my_callbacks.before_agent_callback2

after_agent_callbacks:
  - name: my_callbacks.after_agent_callback1
  - name: my_callbacks.after_agent_callback2

# Model级别回调配置
before_model_callbacks:
  - name: my_callbacks.before_model_callback

after_model_callbacks:
  - name: my_callbacks.after_model_callback

# Tool级别回调配置
before_tool_callbacks:
  - name: my_callbacks.before_tool_callback1
  - name: my_callbacks.before_tool_callback2

after_tool_callbacks:
  - name: my_callbacks.after_tool_callback1
  - name: my_callbacks.after_tool_callback2

🔄 回调执行流程

ADK-Python的回调系统遵循严格的执行顺序,确保逻辑的连贯性和可预测性。

mermaid

💡 高级回调模式

1. 回调链处理

多个回调函数可以形成处理链,每个回调都可以修改上下文或返回值。

def callback_chain_example(callback_context):
    """回调链示例"""
    # 第一个回调:记录开始时间
    if not hasattr(callback_context.state, 'start_time'):
        callback_context.state.start_time = time.time()
    
    # 第二个回调:验证权限
    if not validate_permission(callback_context):
        raise PermissionError("权限验证失败")
    
    # 第三个回调:准备执行环境
    prepare_execution_environment(callback_context)
    
    return None

2. 状态管理回调

利用回调上下文进行状态管理和数据传递。

def state_management_callback(callback_context):
    """状态管理回调示例"""
    # 初始化状态
    if not hasattr(callback_context.state, 'execution_count'):
        callback_context.state.execution_count = 0
    
    # 更新状态
    callback_context.state.execution_count += 1
    
    # 记录详细执行信息
    execution_info = {
        'timestamp': time.time(),
        'agent_name': callback_context.agent.name,
        'execution_id': str(uuid.uuid4())
    }
    
    if not hasattr(callback_context.state, 'execution_history'):
        callback_context.state.execution_history = []
    
    callback_context.state.execution_history.append(execution_info)
    
    return None

3. 错误处理回调

专门处理执行过程中的异常情况。

async def error_handling_callback(callback_context, exception):
    """错误处理回调示例"""
    print(f"发生错误: {str(exception)}")
    
    # 记录错误日志
    error_log = {
        'timestamp': time.time(),
        'error_type': type(exception).__name__,
        'error_message': str(exception),
        'stack_trace': traceback.format_exc()
    }
    
    # 可以在这里集成错误报告系统
    report_error_to_monitoring_system(error_log)
    
    # 决定是否继续执行或终止
    if is_critical_error(exception):
        return None  # 终止执行
    else:
        return {'recovered': True}  # 继续执行

🛠️ 实战案例:完整的回调配置

下面是一个完整的回调配置实战案例,展示了如何在实际项目中应用回调机制。

# callbacks.py - 完整的回调实现
import time
import logging
from typing import Dict, Any
from google.genai import types

# 配置日志
logger = logging.getLogger(__name__)

class AdvancedCallbacks:
    """高级回调集合"""
    
    @staticmethod
    async def before_agent_execution(callback_context):
        """Agent执行前回调"""
        logger.info(f"Agent {callback_context.agent.name} 开始执行")
        
        # 初始化执行上下文
        callback_context.state.start_time = time.time()
        callback_context.state.execution_phase = "agent_start"
        
        return None
    
    @staticmethod
    async def after_agent_execution(callback_context):
        """Agent执行后回调"""
        execution_time = time.time() - callback_context.state.start_time
        logger.info(f"Agent执行完成,耗时: {execution_time:.2f}秒")
        
        # 记录性能指标
        record_performance_metrics({
            'agent_name': callback_context.agent.name,
            'execution_time': execution_time,
            'completion_status': 'success'
        })
        
        return None
    
    @staticmethod
    async def before_model_invocation(callback_context, llm_request):
        """模型调用前回调"""
        logger.info("准备调用LLM模型")
        
        # 可以在这里修改提示词或添加系统指令
        if hasattr(llm_request, 'contents'):
            enhanced_content = enhance_prompt(llm_request.contents)
            llm_request.contents = enhanced_content
        
        return None
    
    @staticmethod
    async def after_model_invocation(callback_context, llm_response):
        """模型调用后回调"""
        logger.info("LLM模型调用完成")
        
        # 处理模型响应
        processed_response = process_model_response(llm_response)
        
        return processed_response
    
    @staticmethod
    def before_tool_execution(tool, args, tool_context):
        """工具执行前回调"""
        logger.info(f"准备执行工具: {tool.name}")
        
        # 参数验证
        if not validate_tool_arguments(tool.name, args):
            raise ValueError("工具参数验证失败")
        
        # 权限检查
        if not check_tool_permission(tool.name, tool_context):
            raise PermissionError("没有执行该工具的权限")
        
        return None
    
    @staticmethod
    def after_tool_execution(tool, args, tool_context, tool_response):
        """工具执行后回调"""
        logger.info(f"工具 {tool.name} 执行完成")
        
        # 结果处理
        processed_result = {
            'original_response': tool_response,
            'processed_at': time.time(),
            'tool_name': tool.name,
            'execution_context': tool_context.state
        }
        
        return processed_result

# 辅助函数
def enhance_prompt(contents):
    """增强提示词"""
    # 实际实现中可以根据需要修改提示词
    return contents

def process_model_response(response):
    """处理模型响应"""
    # 可以在这里进行内容过滤、格式转换等操作
    return response

def validate_tool_arguments(tool_name, args):
    """验证工具参数"""
    # 根据不同的工具进行参数验证
    return True

def check_tool_permission(tool_name, context):
    """检查工具执行权限"""
    # 实现权限检查逻辑
    return True

def record_performance_metrics(metrics):
    """记录性能指标"""
    # 实现指标记录逻辑
    pass

📊 回调配置最佳实践

1. 性能考虑

实践说明推荐做法
异步回调提高并发性能尽量使用async/await
回调链优化减少不必要的回调按需配置,避免过度使用
状态管理高效的状态操作使用callback_context.state

2. 错误处理

def safe_callback_execution(callback_func, *args):
    """安全的回调执行包装器"""
    try:
        result = callback_func(*args)
        return result
    except Exception as e:
        logger.error(f"回调执行失败: {str(e)}")
        # 根据错误类型决定是否继续
        if is_recoverable_error(e):
            return {'error_handled': True}
        else:
            raise

3. 监控和日志

class MonitoredCallback:
    """带监控的回调装饰器"""
    
    def __init__(self, callback_name):
        self.callback_name = callback_name
    
    def __call__(self, func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            try:
                result = func(*args, **kwargs)
                execution_time = time.time() - start_time
                
                # 记录执行指标
                record_callback_metrics({
                    'name': self.callback_name,
                    'execution_time': execution_time,
                    'status': 'success'
                })
                
                return result
            except Exception as e:
                execution_time = time.time() - start_time
                record_callback_metrics({
                    'name': self.callback_name,
                    'execution_time': execution_time,
                    'status': 'error',
                    'error': str(e)
                })
                raise
        return wrapper

# 使用示例
@MonitoredCallback("before_agent_callback")
def monitored_before_agent_callback(callback_context):
    """带监控的Agent前回调"""
    # 回调逻辑
    return None

🚀 总结

ADK-Python的回调配置系统为开发者提供了强大的事件处理能力,通过合理的回调配置可以实现:

  1. 精细化的执行控制:在Agent生命周期的各个关键节点注入自定义逻辑
  2. 强大的扩展能力:通过回调机制集成第三方服务和处理复杂业务逻辑
  3. 完善的监控体系:利用回调进行性能监控、错误处理和状态管理
  4. 灵活的配置方式:支持代码配置和YAML声明式配置两种方式

掌握ADK-Python的回调配置,将帮助您构建更加健壮、可维护的AI Agent系统。无论是简单的日志记录还是复杂的业务逻辑处理,回调机制都能为您提供强大的支持。

在实际项目中,建议根据具体需求选择合适的回调类型和配置方式,平衡功能性和性能要求,打造高效的AI Agent解决方案。

【免费下载链接】adk-python 一款开源、代码优先的Python工具包,用于构建、评估和部署灵活可控的复杂 AI agents 【免费下载链接】adk-python 项目地址: https://gitcode.com/GitHub_Trending/ad/adk-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值