Event 系统:理解 Agent 的事件流
详解 ADK Go 中 Event 的类型、EventHandler 的使用,以及如何监听和处理 Agent 运行过程中的各种事件。
Event 系统:理解 Agent 的事件流
Agent 运行过程中会产生各种 Event——用户输入、模型输出、Tool 调用、错误等。理解 Event 系统,才能在正确的地方插入自己的逻辑。
Event 类型
ADK Go 中的 Event 主要有几种类型:
| Event 类型 | 触发时机 | 用途 |
|---|---|---|
EventUserMessage | 用户发送消息 | 记录日志、处理用户输入 |
EventAgentMessage | Agent 返回消息 | 流式输出、记录日志 |
EventToolCall | Agent 调用 Tool | 监控 Tool 调用、修改 Tool 参数 |
EventToolResult | Tool 返回结果 | 处理 Tool 返回、修改结果 |
EventSessionStart | Session 创建 | 初始化、权限检查 |
EventSessionEnd | Session 结束 | 资源清理、统计 |
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 读写 | Context Caching →
想跟着学更多 Go ADK 实战?关注「全栈之巅-梦兽编程」公众号,每周更新 Go / AI 编程实战干货。
