Event 系统:理解 Agent 的事件流

Agent 运行过程中会产生各种 Event——用户输入、模型输出、Tool 调用、错误等。理解 Event 系统,才能在正确的地方插入自己的逻辑。

Event 类型

ADK Go 中的 Event 主要有几种类型:

Event 类型触发时机用途
EventUserMessage用户发送消息记录日志、处理用户输入
EventAgentMessageAgent 返回消息流式输出、记录日志
EventToolCallAgent 调用 Tool监控 Tool 调用、修改 Tool 参数
EventToolResultTool 返回结果处理 Tool 返回、修改结果
EventSessionStartSession 创建初始化、权限检查
EventSessionEndSession 结束资源清理、统计
EventError发生错误错误告警、自动恢复

注册 Event Handler

agent, _ := llmagent.New(llmagent.Config{
    Name:        "my-agent",
    Model:       model,
    Instruction: "你是助手",
    EventHandlers: []agent.EventHandler{
        {
            EventType: agent.EventToolCall,
            Handler: func(ctx context.Context, e *agent.Event) error {
                log.Printf("Tool 被调用: %s", e.ToolName)
                return nil
            },
        },
        {
            EventType: agent.EventError,
            Handler: func(ctx context.Context, e *agent.Event) error {
                log.Printf("Agent 错误: %v", e.Error)
                return nil  // 返回 nil 则继续运行,返回 error 则中断
            },
        },
    },
})

Event Handler 的实际用法

用法 1:日志记录

{
    EventType: agent.EventUserMessage,
    Handler: func(ctx context.Context, e *agent.Event) error {
        log.Printf("用户输入: %s", e.Message)
        return nil
    },
},

用法 2:修改 Tool 参数

{
    EventType: agent.EventToolCall,
    Handler: func(ctx context.Context, e *agent.Event) error {
        // 给 Tool 调用自动加上当前用户信息
        e.ToolArgs["user_id"] = ctx.Value("user_id")
        return nil
    },
},

用法 3:错误自动恢复

{
    EventType: agent.EventError,
    Handler: func(ctx context.Context, e *agent.Event) error {
        if strings.Contains(e.Error.Error(), "network") {
            // 网络错误,等 1 秒重试
            time.Sleep(time.Second)
            return nil  // 继续运行
        }
        return e.Error  // 其他错误,中断
    },
},

常见问题

Q:Event Handler 里返回 error 会怎样 A:Agent 会中断执行,error 会向上传播。根据错误类型决定是否中断。

Q:可以注册多个 Handler 吗 A:可以。相同 EventType 的 Handler 会按注册顺序依次执行。

Q:Event 异步还是同步 A:同步执行。Handler 执行完才继续后续流程。


下一步

Event 系统理解了,接下来看 Context Caching——如何缓存上下文,减少 token 消耗。

State Read/Write | Context Caching →


想跟着学更多 Go ADK 实战?关注「全栈之巅-梦兽编程」公众号,每周更新 Go / AI 编程实战干货。