hooks

package
v0.5.11 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 12, 2026 License: Apache-2.0 Imports: 2 Imported by: 0

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

View Source
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

func ContextWithManager

func ContextWithManager(ctx context.Context, m *Manager) context.Context

ContextWithManager 将钩子管理器添加到 context

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 Hook

type Hook interface {
	// Name 返回钩子名称
	Name() string

	// Enabled 是否启用
	Enabled() bool
}

Hook 钩子接口

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

func ManagerFromContext(ctx context.Context) *Manager

ManagerFromContext 从 context 获取钩子管理器

func NewManager

func NewManager() *Manager

NewManager 创建钩子管理器

func (*Manager) RegisterLLMHook

func (m *Manager) RegisterLLMHook(hook LLMHook)

RegisterLLMHook 注册 LLM 钩子

func (*Manager) RegisterRetrieverHook

func (m *Manager) RegisterRetrieverHook(hook RetrieverHook)

RegisterRetrieverHook 注册检索钩子

func (*Manager) RegisterRunHook

func (m *Manager) RegisterRunHook(hook RunHook)

RegisterRunHook 注册运行钩子

func (*Manager) RegisterToolHook

func (m *Manager) RegisterToolHook(hook ToolHook)

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 Timing

type Timing uint32

Timing 时机类型(位掩码,可组合多个时机)

func (Timing) Has

func (t Timing) Has(timing Timing) bool

Has 检查是否包含指定时机

func (Timing) String

func (t Timing) String() string

String 返回时机的字符串表示

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 工具调用完成事件

type ToolHook

type ToolHook interface {
	Hook
	// OnToolStart 工具调用开始
	OnToolStart(ctx context.Context, event *ToolStartEvent) error
	// OnToolEnd 工具调用完成
	OnToolEnd(ctx context.Context, event *ToolEndEvent) error
}

ToolHook 工具调用钩子

type ToolStartEvent

type ToolStartEvent struct {
	RunID    string         `json:"run_id"`
	ToolName string         `json:"tool_name"`
	ToolID   string         `json:"tool_id"`
	Input    map[string]any `json:"input"`
	Metadata map[string]any `json:"metadata,omitempty"`
}

ToolStartEvent 工具调用开始事件

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL