Hook¶
Hook 是一系列的扩展点,用于在特定执行阶段监控和修改智能体行为。
Hook 概述¶
AgentScope Java 使用统一事件模型,所有 Hook 都需要实现 onEvent(HookEvent) 方法:
基于事件:所有智能体活动生成事件
类型安全:对事件类型进行模式匹配
优先级排序:钩子按优先级执行(值越小优先级越高)
可修改:某些事件允许修改执行上下文
支持的事件¶
事件类型 |
时机 |
可修改 |
描述 |
|---|---|---|---|
PreCallEvent |
智能体调用前 |
❌ |
智能体开始处理之前(仅通知) |
PostCallEvent |
智能体调用后 |
✅ |
智能体完成响应之后(可修改最终消息) |
PreReasoningEvent |
推理前 |
✅ |
LLM 推理之前(可修改输入消息) |
PostReasoningEvent |
推理后 |
✅ |
LLM 推理完成之后(可修改推理结果) |
ReasoningChunkEvent |
推理流式期间 |
❌ |
流式推理的每个块(仅通知) |
PreActingEvent |
工具执行前 |
✅ |
工具执行之前(可修改工具参数) |
PostActingEvent |
工具执行后 |
✅ |
工具执行之后(可修改工具结果) |
ActingChunkEvent |
工具流式期间 |
❌ |
工具执行进度块(仅通知) |
ErrorEvent |
发生错误时 |
❌ |
发生错误时(仅通知) |
创建 Hook¶
基础 Hook¶
import io.agentscope.core.hook.Hook;
import io.agentscope.core.hook.HookEvent;
import io.agentscope.core.hook.PreCallEvent;
import io.agentscope.core.hook.PostCallEvent;
import reactor.core.publisher.Mono;
public class LoggingHook implements Hook {
@Override
public <T extends HookEvent> Mono<T> onEvent(T event) {
if (event instanceof PreCallEvent) {
System.out.println("智能体启动: " + event.getAgent().getName());
return Mono.just(event);
}
if (event instanceof PostCallEvent) {
System.out.println("智能体完成: " + event.getAgent().getName());
return Mono.just(event);
}
return Mono.just(event);
}
}
带优先级的 Hook¶
public class HighPriorityHook implements Hook {
@Override
public int priority() {
return 10; // 数字越小优先级越高(默认为 100)
}
@Override
public <T extends HookEvent> Mono<T> onEvent(T event) {
// 此钩子在优先级 > 10 的钩子之前执行
return Mono.just(event);
}
}
修改事件¶
某些事件允许修改:
import io.agentscope.core.hook.Hook;
import io.agentscope.core.hook.HookEvent;
import io.agentscope.core.hook.PreReasoningEvent;
import io.agentscope.core.message.Msg;
import io.agentscope.core.message.MsgRole;
import io.agentscope.core.message.TextBlock;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
import java.util.List;
public class PromptEnhancingHook implements Hook {
@Override
public <T extends HookEvent> Mono<T> onEvent(T event) {
if (event instanceof PreReasoningEvent e) {
List<Msg> messages = new ArrayList<>(e.getInputMessages());
messages.add(0, Msg.builder()
.role(MsgRole.SYSTEM)
.content(List.of(TextBlock.builder().text("逐步思考。").build()))
.build());
e.setInputMessages(messages);
return Mono.just(event);
}
return Mono.just(event);
}
}
在智能体中配置 Hook¶
在构建智能体时注册 Hook:
import io.agentscope.core.ReActAgent;
import java.util.List;
ReActAgent agent = ReActAgent.builder()
.name("Assistant")
.model(model)
.toolkit(toolkit)
.hooks(List.of(
new LoggingHook(),
new HighPriorityHook(),
new PromptEnhancingHook()
))
.build();
智能体构造后 Hook 不可变。
Hook 示例¶
监控工具执行¶
跟踪工具调用:
import io.agentscope.core.hook.Hook;
import io.agentscope.core.hook.HookEvent;
import io.agentscope.core.hook.PostActingEvent;
import io.agentscope.core.hook.PreActingEvent;
import io.agentscope.core.message.TextBlock;
import reactor.core.publisher.Mono;
public class ToolMonitorHook implements Hook {
@Override
public <T extends HookEvent> Mono<T> onEvent(T event) {
if (event instanceof PreActingEvent e) {
System.out.println("调用工具: " + e.getToolUse().getName());
System.out.println("参数: " + e.getToolUse().getInput());
return Mono.just(event);
}
if (event instanceof PostActingEvent e) {
String resultText = e.getToolResult().getOutput().stream()
.filter(block -> block instanceof TextBlock)
.map(block -> ((TextBlock) block).getText())
.findFirst()
.orElse("");
System.out.println("工具结果: " + resultText);
return Mono.just(event);
}
return Mono.just(event);
}
}
监控错误¶
监控和处理错误:
import io.agentscope.core.hook.ErrorEvent;
import io.agentscope.core.hook.Hook;
import io.agentscope.core.hook.HookEvent;
import reactor.core.publisher.Mono;
public class ErrorHandlingHook implements Hook {
@Override
public <T extends HookEvent> Mono<T> onEvent(T event) {
if (event instanceof ErrorEvent e) {
System.err.println("智能体错误: " + e.getAgent().getName());
System.err.println("错误消息: " + e.getError().getMessage());
return Mono.just(event);
}
return Mono.just(event);
}
}
完整示例¶
查看完整的 Hook 示例:
examples/src/main/java/io/agentscope/examples/HookExample.java
运行示例:
cd examples
mvn exec:java -Dexec.mainClass="io.agentscope.examples.HookExample"