Documentation
¶
Overview ¶
Package hooks 提供 Hexagon AI Agent 框架的钩子/回调系统
钩子系统允许在 Agent 执行的各个阶段插入自定义逻辑,借鉴 LangChain 的回调系统设计。
支持的钩子点:
- OnStart: Agent 开始执行前
- OnEnd: Agent 执行完成后
- OnError: 发生错误时
- OnToolStart: 工具调用开始前
- OnToolEnd: 工具调用完成后
- OnLLMStart: LLM 调用开始前
- OnLLMEnd: LLM 调用完成后
- OnRetrieverStart: 检索开始前
- OnRetrieverEnd: 检索完成后
主要类型:
- RunHook: Agent 运行钩子
- ToolHook: 工具调用钩子
- LLMHook: LLM 调用钩子
- RetrieverHook: 检索钩子
- Manager: 钩子管理器,统一管理和触发钩子
使用示例:
manager := NewManager()
manager.RegisterRunHook(myRunHook)
manager.TriggerRunStart(ctx, &RunStartEvent{...})
Index ¶
- Constants
- func ContextWithManager(ctx context.Context, m *Manager) context.Context
- type ErrorEvent
- type Hook
- type LLMEndEvent
- type LLMHook
- type LLMStartEvent
- type LLMStreamEvent
- type Manager
- func (m *Manager) RegisterLLMHook(hook LLMHook)
- func (m *Manager) RegisterRetrieverHook(hook RetrieverHook)
- func (m *Manager) RegisterRunHook(hook RunHook)
- func (m *Manager) RegisterToolHook(hook ToolHook)
- func (m *Manager) TriggerError(ctx context.Context, event *ErrorEvent) error
- func (m *Manager) TriggerLLMEnd(ctx context.Context, event *LLMEndEvent) error
- func (m *Manager) TriggerLLMStart(ctx context.Context, event *LLMStartEvent) error
- func (m *Manager) TriggerLLMStream(ctx context.Context, event *LLMStreamEvent) error
- func (m *Manager) TriggerRetrieverEnd(ctx context.Context, event *RetrieverEndEvent) error
- func (m *Manager) TriggerRetrieverStart(ctx context.Context, event *RetrieverStartEvent) error
- func (m *Manager) TriggerRunEnd(ctx context.Context, event *RunEndEvent) error
- func (m *Manager) TriggerRunStart(ctx context.Context, event *RunStartEvent) error
- func (m *Manager) TriggerStreamEnd(ctx context.Context, event *RunStreamEndEvent) error
- func (m *Manager) TriggerStreamStart(ctx context.Context, event *RunStreamStartEvent) error
- func (m *Manager) TriggerToolEnd(ctx context.Context, event *ToolEndEvent) error
- func (m *Manager) TriggerToolStart(ctx context.Context, event *ToolStartEvent) error
- type RetrieverEndEvent
- type RetrieverHook
- type RetrieverStartEvent
- type RunEndEvent
- type RunHook
- type RunStartEvent
- type RunStreamEndEvent
- type RunStreamStartEvent
- type StreamHook
- type Timing
- type TimingChecker
- type ToolEndEvent
- type ToolHook
- type ToolStartEvent
Constants ¶
const ( // TimingNone 无时机(不关心任何事件) TimingNone Timing = 0 // Run 相关时机 TimingRunStart Timing = 1 << iota // Agent 开始执行 TimingRunEnd // Agent 执行完成 TimingRunError // 发生错误 // Tool 相关时机 TimingToolStart // 工具调用开始 TimingToolEnd // 工具调用完成 // LLM 相关时机 TimingLLMStart // LLM 调用开始 TimingLLMEnd // LLM 调用完成 TimingLLMStream // LLM 流式输出 // Retriever 相关时机 TimingRetrieverStart // 检索开始 TimingRetrieverEnd // 检索完成 // Run 流式相关时机 TimingRunStreamStart // 流式执行开始 TimingRunStreamEnd // 流式执行结束 // 便捷组合 TimingRunAll = TimingRunStart | TimingRunEnd | TimingRunError TimingRunStreamAll = TimingRunStreamStart | TimingRunStreamEnd TimingToolAll = TimingToolStart | TimingToolEnd TimingLLMAll = TimingLLMStart | TimingLLMEnd | TimingLLMStream TimingRetrieverAll = TimingRetrieverStart | TimingRetrieverEnd TimingAll = TimingRunAll | TimingRunStreamAll | TimingToolAll | TimingLLMAll | TimingRetrieverAll )
Variables ¶
This section is empty.
Functions ¶
Types ¶
type ErrorEvent ¶
type ErrorEvent struct {
RunID string `json:"run_id"`
AgentID string `json:"agent_id"`
Error error `json:"error"`
Phase string `json:"phase"`
Metadata map[string]any `json:"metadata,omitempty"`
}
ErrorEvent 错误事件
type LLMEndEvent ¶
type LLMEndEvent struct {
RunID string `json:"run_id"`
RequestID string `json:"request_id"`
Model string `json:"model"`
Response any `json:"response"`
PromptTokens int `json:"prompt_tokens"`
CompletionTokens int `json:"completion_tokens"`
Duration int64 `json:"duration_ms"`
Error error `json:"error,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
}
LLMEndEvent LLM 调用完成事件
type LLMHook ¶
type LLMHook interface {
Hook
// OnLLMStart LLM 调用开始
OnLLMStart(ctx context.Context, event *LLMStartEvent) error
// OnLLMEnd LLM 调用完成
OnLLMEnd(ctx context.Context, event *LLMEndEvent) error
// OnLLMStream LLM 流式输出
OnLLMStream(ctx context.Context, event *LLMStreamEvent) error
}
LLMHook LLM 调用钩子
type LLMStartEvent ¶
type LLMStartEvent struct {
RunID string `json:"run_id"`
RequestID string `json:"request_id"`
Model string `json:"model"`
Provider string `json:"provider"`
Messages []any `json:"messages"`
Temperature float64 `json:"temperature,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
}
LLMStartEvent LLM 调用开始事件
type LLMStreamEvent ¶
type LLMStreamEvent struct {
RunID string `json:"run_id"`
RequestID string `json:"request_id"`
Model string `json:"model"`
Content string `json:"content"`
ChunkIndex int `json:"chunk_index"`
}
LLMStreamEvent LLM 流式输出事件
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
Manager 钩子管理器
func ManagerFromContext ¶
ManagerFromContext 从 context 获取钩子管理器
func (*Manager) RegisterLLMHook ¶
RegisterLLMHook 注册 LLM 钩子
func (*Manager) RegisterRetrieverHook ¶
func (m *Manager) RegisterRetrieverHook(hook RetrieverHook)
RegisterRetrieverHook 注册检索钩子
func (*Manager) RegisterRunHook ¶
RegisterRunHook 注册运行钩子
func (*Manager) RegisterToolHook ¶
RegisterToolHook 注册工具钩子
func (*Manager) TriggerError ¶
func (m *Manager) TriggerError(ctx context.Context, event *ErrorEvent) error
TriggerError 触发错误事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRunError 时机的 Hook。
func (*Manager) TriggerLLMEnd ¶
func (m *Manager) TriggerLLMEnd(ctx context.Context, event *LLMEndEvent) error
TriggerLLMEnd 触发 LLM 结束事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingLLMEnd 时机的 Hook。
func (*Manager) TriggerLLMStart ¶
func (m *Manager) TriggerLLMStart(ctx context.Context, event *LLMStartEvent) error
TriggerLLMStart 触发 LLM 开始事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingLLMStart 时机的 Hook。
func (*Manager) TriggerLLMStream ¶
func (m *Manager) TriggerLLMStream(ctx context.Context, event *LLMStreamEvent) error
TriggerLLMStream 触发 LLM 流式事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingLLMStream 时机的 Hook。
func (*Manager) TriggerRetrieverEnd ¶
func (m *Manager) TriggerRetrieverEnd(ctx context.Context, event *RetrieverEndEvent) error
TriggerRetrieverEnd 触发检索结束事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRetrieverEnd 时机的 Hook。
func (*Manager) TriggerRetrieverStart ¶
func (m *Manager) TriggerRetrieverStart(ctx context.Context, event *RetrieverStartEvent) error
TriggerRetrieverStart 触发检索开始事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRetrieverStart 时机的 Hook。
func (*Manager) TriggerRunEnd ¶
func (m *Manager) TriggerRunEnd(ctx context.Context, event *RunEndEvent) error
TriggerRunEnd 触发运行结束事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRunEnd 时机的 Hook。
func (*Manager) TriggerRunStart ¶
func (m *Manager) TriggerRunStart(ctx context.Context, event *RunStartEvent) error
TriggerRunStart 触发运行开始事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRunStart 时机的 Hook。
func (*Manager) TriggerStreamEnd ¶
func (m *Manager) TriggerStreamEnd(ctx context.Context, event *RunStreamEndEvent) error
TriggerStreamEnd 触发流式执行结束事件
遍历已注册的 runHooks,检查是否实现了 StreamHook 接口。 如果实现则调用 OnStreamEnd 方法。不需要单独注册流钩子。
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRunStreamEnd 时机的 Hook。
func (*Manager) TriggerStreamStart ¶
func (m *Manager) TriggerStreamStart(ctx context.Context, event *RunStreamStartEvent) error
TriggerStreamStart 触发流式执行开始事件
遍历已注册的 runHooks,检查是否实现了 StreamHook 接口。 如果实现则调用 OnStreamStart 方法。不需要单独注册流钩子。
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingRunStreamStart 时机的 Hook。
func (*Manager) TriggerToolEnd ¶
func (m *Manager) TriggerToolEnd(ctx context.Context, event *ToolEndEvent) error
TriggerToolEnd 触发工具结束事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingToolEnd 时机的 Hook。
func (*Manager) TriggerToolStart ¶
func (m *Manager) TriggerToolStart(ctx context.Context, event *ToolStartEvent) error
TriggerToolStart 触发工具开始事件
线程安全:在迭代前创建钩子列表的副本,避免并发修改问题。 TimingChecker:只调用关心 TimingToolStart 时机的 Hook。
type RetrieverEndEvent ¶
type RetrieverEndEvent struct {
RunID string `json:"run_id"`
QueryID string `json:"query_id"`
Query string `json:"query"`
Documents []any `json:"documents"`
DocCount int `json:"doc_count"`
Duration int64 `json:"duration_ms"`
Error error `json:"error,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
}
RetrieverEndEvent 检索完成事件
type RetrieverHook ¶
type RetrieverHook interface {
Hook
// OnRetrieverStart 检索开始
OnRetrieverStart(ctx context.Context, event *RetrieverStartEvent) error
// OnRetrieverEnd 检索完成
OnRetrieverEnd(ctx context.Context, event *RetrieverEndEvent) error
}
RetrieverHook 检索钩子
type RetrieverStartEvent ¶
type RetrieverStartEvent struct {
RunID string `json:"run_id"`
QueryID string `json:"query_id"`
Query string `json:"query"`
TopK int `json:"top_k"`
Metadata map[string]any `json:"metadata,omitempty"`
}
RetrieverStartEvent 检索开始事件
type RunEndEvent ¶
type RunEndEvent struct {
RunID string `json:"run_id"`
AgentID string `json:"agent_id"`
Output any `json:"output"`
Duration int64 `json:"duration_ms"`
Metadata map[string]any `json:"metadata,omitempty"`
}
RunEndEvent Agent 执行完成事件
type RunHook ¶
type RunHook interface {
Hook
// OnStart Agent 开始执行
OnStart(ctx context.Context, event *RunStartEvent) error
// OnEnd Agent 执行完成
OnEnd(ctx context.Context, event *RunEndEvent) error
// OnError 发生错误
OnError(ctx context.Context, event *ErrorEvent) error
}
RunHook Agent 运行钩子
type RunStartEvent ¶
type RunStartEvent struct {
RunID string `json:"run_id"`
AgentID string `json:"agent_id"`
Input any `json:"input"`
Metadata map[string]any `json:"metadata,omitempty"`
}
RunStartEvent Agent 开始执行事件
type RunStreamEndEvent ¶
type RunStreamEndEvent struct {
// RunID 运行 ID
RunID string `json:"run_id"`
// AgentID Agent ID
AgentID string `json:"agent_id"`
// ChunkCount 流式输出的 chunk 数量
ChunkCount int `json:"chunk_count"`
// Duration 执行耗时(毫秒)
Duration int64 `json:"duration_ms"`
// Error 错误(如果有)
Error error `json:"error,omitempty"`
// Metadata 元数据
Metadata map[string]any `json:"metadata,omitempty"`
}
RunStreamEndEvent 流式执行结束事件
type RunStreamStartEvent ¶
type RunStreamStartEvent struct {
// RunID 运行 ID
RunID string `json:"run_id"`
// AgentID Agent ID
AgentID string `json:"agent_id"`
// Input 输入数据
Input any `json:"input"`
// IsStream 标记是否为流式模式
IsStream bool `json:"is_stream"`
// Metadata 元数据
Metadata map[string]any `json:"metadata,omitempty"`
}
RunStreamStartEvent 流式执行开始事件
type StreamHook ¶
type StreamHook interface {
// OnStreamStart 流式执行开始
OnStreamStart(ctx context.Context, event *RunStreamStartEvent) error
// OnStreamEnd 流式执行结束
OnStreamEnd(ctx context.Context, event *RunStreamEndEvent) error
}
StreamHook 流感知钩子(可选接口)
RunHook 可以额外实现此接口来接收流式执行事件。 Manager 在触发流事件时会检查已注册的 RunHook 是否实现了 StreamHook, 如果实现则调用相应方法。不需要单独注册,复用 runHooks 列表。
使用示例:
type myHook struct { ... }
func (h *myHook) Name() string { return "my-hook" }
func (h *myHook) Enabled() bool { return true }
func (h *myHook) OnStart(...) { ... }
func (h *myHook) OnEnd(...) { ... }
func (h *myHook) OnError(...) { ... }
// 额外实现 StreamHook
func (h *myHook) OnStreamStart(ctx context.Context, event *RunStreamStartEvent) error { ... }
func (h *myHook) OnStreamEnd(ctx context.Context, event *RunStreamEndEvent) error { ... }
type TimingChecker ¶
type TimingChecker interface {
// Timings 返回关心的时机(位掩码)
// 返回 TimingAll 表示关心所有时机
// 返回 TimingNone 表示不关心任何时机(禁用)
Timings() Timing
}
TimingChecker 时机检查器接口 Hook 可选实现此接口来声明关心的时机 如果未实现,默认关心所有时机
type ToolEndEvent ¶
type ToolEndEvent struct {
RunID string `json:"run_id"`
ToolName string `json:"tool_name"`
ToolID string `json:"tool_id"`
Output any `json:"output"`
Duration int64 `json:"duration_ms"`
Error error `json:"error,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
}
ToolEndEvent 工具调用完成事件