1. 概述
ADK (Agent Development Kit) 是 Eino 框架的智能体开发套件,专门用于构建和管理智能体系统。ADK 提供了完整的智能体抽象、事件驱动的执行模型、多智能体协作机制以及丰富的预构建智能体模式。
ADK 模块的核心设计理念包括:
- 事件驱动: 基于
AgentEvent
的异步事件流模型 - 可组合性: 支持智能体的嵌套和组合
- 可恢复性: 支持智能体执行状态的保存和恢复
- 流式优先: 原生支持流式消息处理
- 模式化: 提供 ReAct、Plan-Execute、Supervisor 等预构建模式
2. 核心架构设计
2.1 整体架构图
graph TB
subgraph "智能体接口层 (Agent Interface Layer)"
Agent[Agent Interface]
ResumableAgent[ResumableAgent Interface]
OnSubAgents[OnSubAgents Interface]
end
subgraph "事件系统层 (Event System Layer)"
AgentEvent[AgentEvent]
AgentInput[AgentInput]
AgentOutput[AgentOutput]
AgentAction[AgentAction]
MessageVariant[MessageVariant]
end
subgraph "执行引擎层 (Execution Engine Layer)"
Runner[Agent Runner]
AsyncIterator[AsyncIterator]
ReactGraph[ReAct Graph]
WorkflowAgent[Workflow Agent]
end
subgraph "预构建模式层 (Prebuilt Patterns Layer)"
ChatModelAgent[ChatModel Agent]
PlanExecute[Plan-Execute Agent]
Supervisor[Supervisor Agent]
FlowAgent[Flow Agent]
end
subgraph "工具集成层 (Tool Integration Layer)"
ToolsConfig[Tools Configuration]
AgentTool[Agent Tool]
ExitTool[Exit Tool]
TransferTool[Transfer Tool]
end
Agent --> AgentEvent
Agent --> AgentInput
Agent --> AgentOutput
Agent --> AgentAction
AgentEvent --> MessageVariant
AgentOutput --> MessageVariant
Runner --> AsyncIterator
Runner --> ReactGraph
Runner --> WorkflowAgent
ChatModelAgent --> ReactGraph
PlanExecute --> WorkflowAgent
Supervisor --> WorkflowAgent
FlowAgent --> WorkflowAgent
ReactGraph --> ToolsConfig
ChatModelAgent --> AgentTool
ChatModelAgent --> ExitTool
style Agent fill:#e8f5e8
style AgentEvent fill:#fff3e0
style Runner fill:#f3e5f5
style ChatModelAgent fill:#e3f2fd
图 2-1: ADK 模块整体架构图
图介绍: 该架构图展示了 ADK 模块的五层架构:
- 智能体接口层: 定义了智能体的核心接口,包括基础
Agent
接口、可恢复的ResumableAgent
接口和子智能体管理的OnSubAgents
接口 - 事件系统层: 定义了智能体交互的核心数据结构,包括事件、输入、输出、动作和消息变体
- 执行引擎层: 提供智能体的执行机制,包括运行器、异步迭代器和各种执行图
- 预构建模式层: 提供常用的智能体模式实现,如聊天模型智能体、计划执行智能体等
- 工具集成层: 提供工具调用和智能体间协作的支持
2.2 核心数据结构
// adk/interface.go
// Message 和 MessageStream 类型别名
type Message = *schema.Message
type MessageStream = *schema.StreamReader[Message]
// MessageVariant 消息变体,支持流式和非流式消息
type MessageVariant struct {
IsStreaming bool // 是否为流式消息
Message Message // 非流式消息
MessageStream MessageStream // 流式消息
Role schema.RoleType // 消息角色:Assistant 或 Tool
ToolName string // 工具名称(仅当 Role 为 Tool 时使用)
}
// AgentInput 智能体输入
type AgentInput struct {
Messages []Message // 输入消息列表
EnableStreaming bool // 是否启用流式输出
}
// AgentOutput 智能体输出
type AgentOutput struct {
MessageOutput *MessageVariant // 消息输出
CustomizedOutput any // 自定义输出
}
// AgentAction 智能体动作
type AgentAction struct {
Exit bool // 是否退出
Interrupted *InterruptInfo // 中断信息
TransferToAgent *TransferToAgentAction // 转移到其他智能体
CustomizedAction any // 自定义动作
}
// AgentEvent 智能体事件
type AgentEvent struct {
AgentName string // 智能体名称
RunPath []RunStep // 运行路径
Output *AgentOutput // 输出
Action *AgentAction // 动作
Err error // 错误信息
}
3. 核心接口详解
3.1 Agent 接口
// adk/interface.go
// Agent 智能体核心接口
type Agent interface {
// Name 返回智能体名称
Name(ctx context.Context) string
// Description 返回智能体描述
// 帮助其他智能体确定是否将任务转移给此智能体
Description(ctx context.Context) string
// Run 运行智能体
// AsyncIterator 中返回的 AgentEvent 必须是安全可修改的
// 如果 AgentEvent 包含 MessageStream,MessageStream 必须是独占且安全可直接接收的
// 注意:建议在 AsyncIterator 发出的 AgentEvent 的 MessageStream 上使用 SetAutomaticClose(),
// 这样即使事件未被处理,MessageStream 仍然可以被关闭
Run(ctx context.Context, input *AgentInput, options ...AgentRunOption) *AsyncIterator[*AgentEvent]
}
接口设计说明:
- 异步执行:
Run
方法返回AsyncIterator
,支持异步事件流处理 - 事件驱动: 通过
AgentEvent
传递执行状态、输出和动作 - 流式支持: 原生支持流式消息处理
- 上下文感知: 所有方法都接受
context.Context
参数
3.2 扩展接口
// OnSubAgents 子智能体管理接口
type OnSubAgents interface {
// OnSetSubAgents 设置子智能体
OnSetSubAgents(ctx context.Context, subAgents []Agent) error
// OnSetAsSubAgent 设置为子智能体
OnSetAsSubAgent(ctx context.Context, parent Agent) error
// OnDisallowTransferToParent 禁止转移到父智能体
OnDisallowTransferToParent(ctx context.Context) error
}
// ResumableAgent 可恢复智能体接口
type ResumableAgent interface {
Agent
// Resume 从保存的状态恢复执行
Resume(ctx context.Context, data []byte, input *AgentInput, options ...AgentRunOption) *AsyncIterator[*AgentEvent]
}
3.3 事件处理机制
sequenceDiagram
participant Client
participant Agent
participant AsyncIterator
participant EventGenerator
Client->>Agent: Run(ctx, input, options)
Agent->>AsyncIterator: 创建异步迭代器
Agent->>EventGenerator: 启动事件生成器
Agent-->>Client: 返回 AsyncIterator
loop 事件生成
EventGenerator->>EventGenerator: 执行智能体逻辑
EventGenerator->>AsyncIterator: Send(AgentEvent)
alt 有输出
AsyncIterator->>Client: Next() -> AgentEvent with Output
else 有动作
AsyncIterator->>Client: Next() -> AgentEvent with Action
else 有错误
AsyncIterator->>Client: Next() -> AgentEvent with Error
end
alt 退出动作
EventGenerator->>AsyncIterator: Send(ExitEvent)
EventGenerator->>AsyncIterator: Close()
break
end
end
Client->>AsyncIterator: Close()
图 3-1: 智能体事件处理序列图
4. ChatModel Agent 详解
4.1 设计理念
ChatModelAgent
是基于聊天模型的智能体实现,采用 ReAct (Reasoning and Acting) 模式:
- 推理与行动: 模型可以进行推理并调用工具执行行动
- 迭代执行: 支持多轮对话和工具调用的迭代循环
- 工具集成: 原生支持工具调用和结果处理
- 状态管理: 维护对话历史和执行状态
4.2 核心结构
// adk/chatmodel.go
// ChatModelAgentConfig 聊天模型智能体配置
type ChatModelAgentConfig struct {
// Name 智能体名称,最好在所有智能体中唯一
Name string
// Description 智能体能力描述
// 帮助其他智能体确定是否将任务转移给此智能体
Description string
// Instruction 用作此智能体系统提示的指令
// 可选。如果为空,将不使用系统提示
// 支持默认 GenModelInput 中会话值的 f-string 占位符,例如:
// "You are a helpful assistant. The current time is {Time}. The current user is {User}."
// 这些占位符将被 "Time" 和 "User" 的会话值替换
Instruction string
// Model 聊天模型
Model model.ToolCallingChatModel
// ToolsConfig 工具配置
ToolsConfig ToolsConfig
// GenModelInput 将指令和输入消息转换为模型输入格式
// 可选。默认为 defaultGenModelInput,它组合指令和消息
GenModelInput GenModelInput
// Exit 定义用于终止智能体进程的工具
// 可选。如果为 nil,将不生成退出动作
// 可以直接使用提供的 'ExitTool' 实现
Exit tool.BaseTool
// OutputKey 在会话中存储智能体响应
// 可选。设置时,通过 AddSessionValue(ctx, outputKey, msg.Content) 存储输出
OutputKey string
// MaxIterations 定义 ChatModel 生成循环的上限
// 如果超过此限制,智能体将以错误终止
// 可选。默认为 20
MaxIterations int
}
// ChatModelAgent 聊天模型智能体实现
type ChatModelAgent struct {
name string
description string
instruction string
model model.ToolCallingChatModel
toolsConfig ToolsConfig
genModelInput GenModelInput
outputKey string
maxIterations int
subAgents []Agent
parentAgent Agent
disallowTransferToParent bool
exit tool.BaseTool
// 运行器
once sync.Once
run runFunc
frozen uint32
}
4.3 ReAct 执行图
// adk/react.go
// State ReAct 执行状态
type State struct {
Messages []Message // 消息历史
ReturnDirectlyToolCallID string // 直接返回的工具调用 ID
ToolGenActions map[string]*AgentAction // 工具生成的动作
AgentName string // 智能体名称
AgentToolInterruptData map[string]*agentToolInterruptInfo // 智能体工具中断数据
RemainingIterations int // 剩余迭代次数
}
// ReAct 图构建
func newReact(ctx context.Context, config *reactConfig) (reactGraph, error) {
// 生成状态函数
genState := func(ctx context.Context) *State {
return &State{
ToolGenActions: map[string]*AgentAction{},
AgentName: config.agentName,
AgentToolInterruptData: make(map[string]*agentToolInterruptInfo),
RemainingIterations: func() int {
if config.maxIterations <= 0 {
return 20
}
return config.maxIterations
}(),
}
}
// 创建图
g := compose.NewGraph[[]Message, Message](compose.WithGenLocalState(genState))
// 获取工具信息
toolsInfo, err := genToolInfos(ctx, config.toolsConfig)
if err != nil {
return nil, err
}
// 创建带工具的聊天模型
chatModel, err := config.model.WithTools(toolsInfo)
if err != nil {
return nil, err
}
// 创建工具节点
toolsNode, err := compose.NewToolNode(ctx, config.toolsConfig)
if err != nil {
return nil, err
}
// 添加聊天模型节点
modelPreHandle := func(ctx context.Context, input []Message, st *State) ([]Message, error) {
if st.RemainingIterations <= 0 {
return nil, ErrExceedMaxIterations
}
st.RemainingIterations--
st.Messages = append(st.Messages, input...)
return st.Messages, nil
}
_ = g.AddChatModelNode("ChatModel", chatModel,
compose.WithStatePreHandler(modelPreHandle),
compose.WithNodeName("ChatModel"))
// 添加工具节点
toolPreHandle := func(ctx context.Context, input Message, st *State) (Message, error) {
if input != nil {
st.Messages = append(st.Messages, input)
}
input = st.Messages[len(st.Messages)-1]
// 处理直接返回的工具
if len(config.toolsReturnDirectly) > 0 {
for i := range input.ToolCalls {
toolName := input.ToolCalls[i].Function.Name
if config.toolsReturnDirectly[toolName] {
st.ReturnDirectlyToolCallID = input.ToolCalls[i].ID
}
}
}
return input, nil
}
_ = g.AddToolsNode("ToolNode", toolsNode,
compose.WithStatePreHandler(toolPreHandle),
compose.WithNodeName("ToolNode"))
// 添加边和分支逻辑
_ = g.AddEdge(compose.START, "ChatModel")
// 工具调用检查分支
toolCallCheck := func(ctx context.Context, sMsg MessageStream) (string, error) {
// 检查是否有工具调用
// 如果有,转到工具节点;否则结束
}
// 添加条件分支
// ...
return g, nil
}
4.4 ChatModel Agent 使用示例
package main
import (
"context"
"fmt"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/components/model"
"github.com/cloudwego/eino/components/tool"
"github.com/cloudwego/eino/schema"
)
func chatModelAgentExample() {
ctx := context.Background()
// 创建聊天模型(这里使用模拟实现)
chatModel := &MockChatModel{}
// 定义工具
weatherTool := &WeatherTool{}
calculatorTool := &CalculatorTool{}
// 创建智能体配置
config := &adk.ChatModelAgentConfig{
Name: "AssistantAgent",
Description: "A helpful assistant that can check weather and do calculations",
Instruction: "You are a helpful assistant. Use the available tools to help users with their requests.",
Model: chatModel,
ToolsConfig: adk.ToolsConfig{
Tools: []tool.BaseTool{weatherTool, calculatorTool},
},
MaxIterations: 10,
}
// 创建智能体
agent, err := adk.NewChatModelAgent(ctx, config)
if err != nil {
panic(err)
}
// 准备输入
input := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage("What's the weather like in Beijing? Also, what's 15 * 23?"),
},
EnableStreaming: false,
}
// 运行智能体
iterator := agent.Run(ctx, input)
defer iterator.Close()
// 处理事件
for {
event, ok := iterator.Next()
if !ok {
break
}
if event.Err != nil {
fmt.Printf("错误: %v\n", event.Err)
break
}
if event.Output != nil && event.Output.MessageOutput != nil {
message, err := event.Output.MessageOutput.GetMessage()
if err != nil {
fmt.Printf("获取消息失败: %v\n", err)
continue
}
fmt.Printf("智能体输出: %s\n", message.Content)
}
if event.Action != nil {
if event.Action.Exit {
fmt.Println("智能体退出")
break
}
if event.Action.TransferToAgent != nil {
fmt.Printf("转移到智能体: %s\n", event.Action.TransferToAgent.DestAgentName)
}
}
}
}
// 模拟天气工具
type WeatherTool struct{}
func (w *WeatherTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "get_weather",
Desc: "Get current weather information for a city",
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"city": {
Type: schema.String,
Desc: "City name",
Required: true,
},
}),
}, nil
}
func (w *WeatherTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 解析参数并返回天气信息
return `{"city": "Beijing", "temperature": "22°C", "condition": "Sunny"}`, nil
}
// 模拟计算器工具
type CalculatorTool struct{}
func (c *CalculatorTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "calculator",
Desc: "Perform basic mathematical calculations",
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"expression": {
Type: schema.String,
Desc: "Mathematical expression to evaluate",
Required: true,
},
}),
}, nil
}
func (c *CalculatorTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 解析表达式并返回计算结果
return "345", nil
}
5. 多智能体协作
5.1 Agent Runner
// adk/runner.go
// Runner 智能体运行器,支持多智能体协作
type Runner struct {
agents map[string]Agent // 智能体映射
enableStreaming bool // 是否启用流式输出
maxIterations int // 最大迭代次数
// 会话管理
sessionValues map[string]any
}
// RunnerConfig 运行器配置
type RunnerConfig struct {
// Agents 智能体列表
Agents []Agent
// EnableStreaming 是否启用流式输出
EnableStreaming bool
// MaxIterations 最大迭代次数
MaxIterations int
// InitialSessionValues 初始会话值
InitialSessionValues map[string]any
}
// NewRunner 创建新的智能体运行器
func NewRunner(ctx context.Context, config *RunnerConfig) (*Runner, error) {
runner := &Runner{
agents: make(map[string]Agent),
enableStreaming: config.EnableStreaming,
maxIterations: config.MaxIterations,
sessionValues: make(map[string]any),
}
// 复制初始会话值
for k, v := range config.InitialSessionValues {
runner.sessionValues[k] = v
}
// 注册智能体
for _, agent := range config.Agents {
name := agent.Name(ctx)
if _, exists := runner.agents[name]; exists {
return nil, fmt.Errorf("duplicate agent name: %s", name)
}
runner.agents[name] = agent
}
// 设置智能体关系
for _, agent := range config.Agents {
if subAgentManager, ok := agent.(OnSubAgents); ok {
var subAgents []Agent
for _, subAgent := range config.Agents {
if subAgent != agent {
subAgents = append(subAgents, subAgent)
}
}
err := subAgentManager.OnSetSubAgents(ctx, subAgents)
if err != nil {
return nil, fmt.Errorf("failed to set sub agents for %s: %w", agent.Name(ctx), err)
}
}
}
return runner, nil
}
// Run 运行智能体
func (r *Runner) Run(ctx context.Context, startAgentName string, input *AgentInput) *AsyncIterator[*AgentEvent] {
iterator, generator := NewAsyncIteratorPair[*AgentEvent]()
go func() {
defer generator.Close()
currentAgentName := startAgentName
currentInput := input
iterations := 0
for iterations < r.maxIterations {
iterations++
// 获取当前智能体
agent, exists := r.agents[currentAgentName]
if !exists {
generator.Send(&AgentEvent{
AgentName: currentAgentName,
Err: fmt.Errorf("agent not found: %s", currentAgentName),
})
return
}
// 运行智能体
agentIterator := agent.Run(ctx, currentInput)
var lastEvent *AgentEvent
for {
event, ok := agentIterator.Next()
if !ok {
break
}
// 设置智能体名称和运行路径
event.AgentName = currentAgentName
event.RunPath = append(event.RunPath, RunStep{agentName: currentAgentName})
generator.Send(event)
lastEvent = event
// 检查是否有错误
if event.Err != nil {
agentIterator.Close()
return
}
}
agentIterator.Close()
// 检查最后事件的动作
if lastEvent == nil {
return
}
if lastEvent.Action == nil {
return
}
if lastEvent.Action.Exit {
return
}
if lastEvent.Action.TransferToAgent != nil {
// 转移到其他智能体
currentAgentName = lastEvent.Action.TransferToAgent.DestAgentName
// 准备新的输入
if lastEvent.Output != nil && lastEvent.Output.MessageOutput != nil {
message, err := lastEvent.Output.MessageOutput.GetMessage()
if err != nil {
generator.Send(&AgentEvent{
AgentName: currentAgentName,
Err: fmt.Errorf("failed to get message for transfer: %w", err),
})
return
}
currentInput = &AgentInput{
Messages: append(currentInput.Messages, message),
EnableStreaming: r.enableStreaming,
}
}
continue
}
// 没有更多动作,结束
return
}
// 超过最大迭代次数
generator.Send(&AgentEvent{
AgentName: currentAgentName,
Err: fmt.Errorf("exceeded maximum iterations: %d", r.maxIterations),
})
}()
return iterator
}
5.2 多智能体协作示例
package main
import (
"context"
"fmt"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/schema"
)
func multiAgentExample() {
ctx := context.Background()
// 创建专门的智能体
// 1. 路由智能体 - 决定任务分配
routerAgent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "Router",
Description: "Routes tasks to appropriate specialist agents",
Instruction: `You are a router agent. Based on the user's request, decide which specialist agent should handle it:
- For weather questions, transfer to WeatherAgent
- For math calculations, transfer to MathAgent
- For general questions, handle yourself
Use the transfer_to_agent tool to route tasks.`,
Model: &MockChatModel{},
ToolsConfig: adk.ToolsConfig{
Tools: []tool.BaseTool{
&TransferTool{},
},
},
})
if err != nil {
panic(err)
}
// 2. 天气智能体
weatherAgent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "WeatherAgent",
Description: "Provides weather information for any location",
Instruction: "You are a weather specialist. Use the weather tool to provide accurate weather information.",
Model: &MockChatModel{},
ToolsConfig: adk.ToolsConfig{
Tools: []tool.BaseTool{
&WeatherTool{},
&ExitTool{},
},
},
})
if err != nil {
panic(err)
}
// 3. 数学智能体
mathAgent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "MathAgent",
Description: "Performs mathematical calculations and solves math problems",
Instruction: "You are a math specialist. Use the calculator tool to solve mathematical problems accurately.",
Model: &MockChatModel{},
ToolsConfig: adk.ToolsConfig{
Tools: []tool.BaseTool{
&CalculatorTool{},
&ExitTool{},
},
},
})
if err != nil {
panic(err)
}
// 创建运行器
runner, err := adk.NewRunner(ctx, &adk.RunnerConfig{
Agents: []adk.Agent{routerAgent, weatherAgent, mathAgent},
EnableStreaming: false,
MaxIterations: 20,
InitialSessionValues: map[string]any{
"user_id": "user123",
"session_id": "session456",
},
})
if err != nil {
panic(err)
}
// 测试多智能体协作
testCases := []string{
"What's the weather like in Tokyo?",
"Calculate 156 * 789 + 234",
"What's the capital of France?",
}
for i, query := range testCases {
fmt.Printf("\n=== 测试案例 %d: %s ===\n", i+1, query)
input := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage(query),
},
EnableStreaming: false,
}
// 从路由智能体开始
iterator := runner.Run(ctx, "Router", input)
defer iterator.Close()
// 处理事件流
for {
event, ok := iterator.Next()
if !ok {
break
}
if event.Err != nil {
fmt.Printf("错误 [%s]: %v\n", event.AgentName, event.Err)
break
}
if event.Output != nil && event.Output.MessageOutput != nil {
message, err := event.Output.MessageOutput.GetMessage()
if err != nil {
fmt.Printf("获取消息失败 [%s]: %v\n", event.AgentName, err)
continue
}
fmt.Printf("输出 [%s]: %s\n", event.AgentName, message.Content)
}
if event.Action != nil {
if event.Action.Exit {
fmt.Printf("智能体 [%s] 退出\n", event.AgentName)
break
}
if event.Action.TransferToAgent != nil {
fmt.Printf("转移: [%s] -> [%s]\n",
event.AgentName,
event.Action.TransferToAgent.DestAgentName)
}
}
}
}
}
// 转移工具
type TransferTool struct{}
func (t *TransferTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "transfer_to_agent",
Desc: "Transfer the task to a specialist agent",
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"agent_name": {
Type: schema.String,
Desc: "Name of the agent to transfer to (WeatherAgent, MathAgent)",
Required: true,
},
"reason": {
Type: schema.String,
Desc: "Reason for the transfer",
Required: false,
},
}),
}, nil
}
func (t *TransferTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 解析参数
var params struct {
AgentName string `json:"agent_name"`
Reason string `json:"reason"`
}
err := json.Unmarshal([]byte(argumentsInJSON), ¶ms)
if err != nil {
return "", err
}
// 生成转移动作
action := adk.NewTransferToAgentAction(params.AgentName)
// 通过上下文发送动作(这里简化处理)
return fmt.Sprintf("Transferring to %s: %s", params.AgentName, params.Reason), nil
}
// 退出工具
type ExitTool struct{}
func (e *ExitTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "exit",
Desc: "Exit the agent execution",
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"message": {
Type: schema.String,
Desc: "Final message before exit",
Required: false,
},
}),
}, nil
}
func (e *ExitTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 生成退出动作
action := adk.NewExitAction()
// 通过上下文发送动作(这里简化处理)
return "Task completed successfully", nil
}
6. 预构建智能体模式
6.1 Plan-Execute 模式
Plan-Execute 模式将复杂任务分解为计划、执行、重新计划的循环:
// adk/prebuilt/planexecute/plan_execute.go
// Config Plan-Execute 智能体配置
type Config struct {
// Planner 生成计划的智能体
Planner adk.Agent
// Executor 执行计划的智能体
Executor adk.Agent
// Replanner 重新规划的智能体
Replanner adk.Agent
// MaxIterations 执行-重新规划的最大循环次数
MaxIterations int
}
// New 创建新的 Plan-Execute 智能体
// Plan-Execute 模式分为三个阶段:
// 1. 规划:生成具有明确可操作步骤的结构化计划
// 2. 执行:执行计划的第一步
// 3. 重新规划:评估进度,完成任务或修订计划
// 这种方法通过迭代改进实现复杂问题解决
func New(ctx context.Context, cfg *Config) (adk.Agent, error) {
if cfg.Planner == nil {
return nil, errors.New("planner is required")
}
if cfg.Executor == nil {
return nil, errors.New("executor is required")
}
if cfg.Replanner == nil {
return nil, errors.New("replanner is required")
}
maxIterations := cfg.MaxIterations
if maxIterations <= 0 {
maxIterations = 10
}
return &planExecuteAgent{
planner: cfg.Planner,
executor: cfg.Executor,
replanner: cfg.Replanner,
maxIterations: maxIterations,
}, nil
}
type planExecuteAgent struct {
planner adk.Agent
executor adk.Agent
replanner adk.Agent
maxIterations int
}
func (a *planExecuteAgent) Name(ctx context.Context) string {
return "PlanExecuteAgent"
}
func (a *planExecuteAgent) Description(ctx context.Context) string {
return "An agent that breaks down complex tasks into planning, execution, and replanning phases"
}
func (a *planExecuteAgent) Run(ctx context.Context, input *adk.AgentInput, options ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
iterator, generator := adk.NewAsyncIteratorPair[*adk.AgentEvent]()
go func() {
defer generator.Close()
// 阶段 1: 规划
planIterator := a.planner.Run(ctx, input, options...)
plan, err := a.collectAgentOutput(planIterator)
if err != nil {
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Err: fmt.Errorf("planning failed: %w", err),
})
return
}
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage(fmt.Sprintf("Plan created: %s", plan)),
},
},
})
// 阶段 2 & 3: 执行和重新规划循环
currentPlan := plan
for i := 0; i < a.maxIterations; i++ {
// 执行当前计划
executeInput := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage(fmt.Sprintf("Execute this plan: %s", currentPlan)),
},
EnableStreaming: input.EnableStreaming,
}
executeIterator := a.executor.Run(ctx, executeInput, options...)
executeResult, err := a.collectAgentOutput(executeIterator)
if err != nil {
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Err: fmt.Errorf("execution failed: %w", err),
})
return
}
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage(fmt.Sprintf("Execution result: %s", executeResult)),
},
},
})
// 重新规划
replanInput := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage(fmt.Sprintf("Original plan: %s\nExecution result: %s\nShould we continue or are we done?", currentPlan, executeResult)),
},
EnableStreaming: input.EnableStreaming,
}
replanIterator := a.replanner.Run(ctx, replanInput, options...)
replanResult, err := a.collectAgentOutput(replanIterator)
if err != nil {
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Err: fmt.Errorf("replanning failed: %w", err),
})
return
}
// 检查是否完成
if strings.Contains(strings.ToLower(replanResult), "done") ||
strings.Contains(strings.ToLower(replanResult), "complete") {
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage("Task completed successfully"),
},
},
Action: adk.NewExitAction(),
})
return
}
// 更新计划
currentPlan = replanResult
}
// 超过最大迭代次数
generator.Send(&adk.AgentEvent{
AgentName: a.Name(ctx),
Err: fmt.Errorf("exceeded maximum iterations: %d", a.maxIterations),
})
}()
return iterator
}
func (a *planExecuteAgent) collectAgentOutput(iterator *adk.AsyncIterator[*adk.AgentEvent]) (string, error) {
defer iterator.Close()
var outputs []string
for {
event, ok := iterator.Next()
if !ok {
break
}
if event.Err != nil {
return "", event.Err
}
if event.Output != nil && event.Output.MessageOutput != nil {
message, err := event.Output.MessageOutput.GetMessage()
if err != nil {
return "", err
}
outputs = append(outputs, message.Content)
}
if event.Action != nil && event.Action.Exit {
break
}
}
return strings.Join(outputs, "\n"), nil
}
6.2 Supervisor 模式
Supervisor 模式实现智能体的监督和协调:
// adk/prebuilt/supervisor/supervisor.go
// SupervisorConfig 监督者配置
type SupervisorConfig struct {
// Name 监督者名称
Name string
// Description 监督者描述
Description string
// Model 用于决策的聊天模型
Model model.ToolCallingChatModel
// Workers 工作智能体列表
Workers []adk.Agent
// SystemPrompt 系统提示
SystemPrompt string
// MaxIterations 最大迭代次数
MaxIterations int
}
// NewSupervisor 创建新的监督者智能体
func NewSupervisor(ctx context.Context, config *SupervisorConfig) (adk.Agent, error) {
if len(config.Workers) == 0 {
return nil, errors.New("at least one worker is required")
}
// 创建工作智能体选择工具
workerTools := make([]tool.BaseTool, 0, len(config.Workers))
for _, worker := range config.Workers {
workerTool := &WorkerTool{
workerName: worker.Name(ctx),
description: worker.Description(ctx),
}
workerTools = append(workerTools, workerTool)
}
// 添加完成工具
finishTool := &FinishTool{}
workerTools = append(workerTools, finishTool)
// 创建监督者智能体
supervisorAgent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: config.Name,
Description: config.Description,
Instruction: config.SystemPrompt,
Model: config.Model,
ToolsConfig: adk.ToolsConfig{
Tools: workerTools,
},
MaxIterations: config.MaxIterations,
})
if err != nil {
return nil, err
}
return &supervisor{
agent: supervisorAgent,
workers: make(map[string]adk.Agent),
}, nil
}
type supervisor struct {
agent adk.Agent
workers map[string]adk.Agent
}
func (s *supervisor) Name(ctx context.Context) string {
return s.agent.Name(ctx)
}
func (s *supervisor) Description(ctx context.Context) string {
return s.agent.Description(ctx)
}
func (s *supervisor) Run(ctx context.Context, input *adk.AgentInput, options ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
// 委托给内部智能体,但拦截工具调用来协调工作智能体
return s.agent.Run(ctx, input, options...)
}
// WorkerTool 工作智能体选择工具
type WorkerTool struct {
workerName string
description string
}
func (w *WorkerTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: fmt.Sprintf("delegate_to_%s", w.workerName),
Desc: fmt.Sprintf("Delegate task to %s: %s", w.workerName, w.description),
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"task": {
Type: schema.String,
Desc: "Task description to delegate",
Required: true,
},
}),
}, nil
}
func (w *WorkerTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 这里会触发对相应工作智能体的调用
return fmt.Sprintf("Delegated task to %s", w.workerName), nil
}
// FinishTool 完成工具
type FinishTool struct{}
func (f *FinishTool) Info(ctx context.Context) (*schema.ToolInfo, error) {
return &schema.ToolInfo{
Name: "finish",
Desc: "Finish the task with final response",
ParamsOneOf: schema.NewParamsOneOfByParams(map[string]*schema.ParameterInfo{
"response": {
Type: schema.String,
Desc: "Final response to the user",
Required: true,
},
}),
}, nil
}
func (f *FinishTool) InvokableRun(ctx context.Context, argumentsInJSON string, opts ...tool.Option) (string, error) {
// 这里会触发退出动作
return "Task completed", nil
}
7. 工作流智能体
7.1 工作流模式
// adk/workflow.go
// 工作流智能体模式
type workflowAgentMode int
const (
workflowAgentModeUnknown workflowAgentMode = iota
workflowAgentModeSequential // 顺序执行
workflowAgentModeLoop // 循环执行
workflowAgentModeParallel // 并行执行
)
// workflowAgent 工作流智能体
type workflowAgent struct {
name string
description string
subAgents []*flowAgent
mode workflowAgentMode
maxIterations int
}
func (a *workflowAgent) Name(_ context.Context) string {
return a.name
}
func (a *workflowAgent) Description(_ context.Context) string {
return a.description
}
func (a *workflowAgent) Run(ctx context.Context, input *adk.AgentInput, options ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
iterator, generator := adk.NewAsyncIteratorPair[*adk.AgentEvent]()
go func() {
defer generator.Close()
switch a.mode {
case workflowAgentModeSequential:
a.runSequential(ctx, input, generator, options...)
case workflowAgentModeLoop:
a.runLoop(ctx, input, generator, options...)
case workflowAgentModeParallel:
a.runParallel(ctx, input, generator, options...)
default:
generator.Send(&adk.AgentEvent{
AgentName: a.name,
Err: fmt.Errorf("unknown workflow mode: %v", a.mode),
})
}
}()
return iterator
}
// 顺序执行模式
func (a *workflowAgent) runSequential(ctx context.Context, input *adk.AgentInput, generator *adk.AsyncGenerator[*adk.AgentEvent], options ...adk.AgentRunOption) {
currentInput := input
for _, flowAgent := range a.subAgents {
// 运行当前智能体
agentIterator := flowAgent.agent.Run(ctx, currentInput, options...)
var lastOutput *adk.AgentOutput
for {
event, ok := agentIterator.Next()
if !ok {
break
}
// 转发事件
event.AgentName = a.name
generator.Send(event)
if event.Err != nil {
agentIterator.Close()
return
}
if event.Output != nil {
lastOutput = event.Output
}
if event.Action != nil && event.Action.Exit {
agentIterator.Close()
return
}
}
agentIterator.Close()
// 准备下一个智能体的输入
if lastOutput != nil && lastOutput.MessageOutput != nil {
message, err := lastOutput.MessageOutput.GetMessage()
if err != nil {
generator.Send(&adk.AgentEvent{
AgentName: a.name,
Err: fmt.Errorf("failed to get message for next agent: %w", err),
})
return
}
currentInput = &adk.AgentInput{
Messages: append(currentInput.Messages, message),
EnableStreaming: input.EnableStreaming,
}
}
}
// 发送完成事件
generator.Send(&adk.AgentEvent{
AgentName: a.name,
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage("Workflow completed successfully"),
},
},
Action: adk.NewExitAction(),
})
}
// 并行执行模式
func (a *workflowAgent) runParallel(ctx context.Context, input *adk.AgentInput, generator *adk.AsyncGenerator[*adk.AgentEvent], options ...adk.AgentRunOption) {
var wg sync.WaitGroup
resultCh := make(chan *adk.AgentEvent, len(a.subAgents))
// 启动所有子智能体
for _, flowAgent := range a.subAgents {
wg.Add(1)
go func(agent *flowAgent) {
defer wg.Done()
agentIterator := agent.agent.Run(ctx, input, options...)
defer agentIterator.Close()
for {
event, ok := agentIterator.Next()
if !ok {
break
}
// 转发事件
event.AgentName = a.name
resultCh <- event
if event.Action != nil && event.Action.Exit {
break
}
}
}(flowAgent)
}
// 等待所有智能体完成
go func() {
wg.Wait()
close(resultCh)
}()
// 收集结果
var outputs []string
for event := range resultCh {
generator.Send(event)
if event.Err != nil {
return
}
if event.Output != nil && event.Output.MessageOutput != nil {
message, err := event.Output.MessageOutput.GetMessage()
if err == nil {
outputs = append(outputs, message.Content)
}
}
}
// 发送合并结果
generator.Send(&adk.AgentEvent{
AgentName: a.name,
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage(fmt.Sprintf("Parallel execution completed. Results: %s", strings.Join(outputs, "; "))),
},
},
Action: adk.NewExitAction(),
})
}
8. 异步迭代器
8.1 AsyncIterator 设计
// adk/utils.go
// AsyncIterator 异步迭代器,用于处理智能体事件流
type AsyncIterator[T any] struct {
ch chan T
closed bool
mu sync.RWMutex
}
// AsyncGenerator 异步生成器,用于发送事件
type AsyncGenerator[T any] struct {
ch chan T
closed bool
mu sync.RWMutex
}
// NewAsyncIteratorPair 创建异步迭代器对
func NewAsyncIteratorPair[T any]() (*AsyncIterator[T], *AsyncGenerator[T]) {
ch := make(chan T, 100) // 缓冲通道
iterator := &AsyncIterator[T]{
ch: ch,
}
generator := &AsyncGenerator[T]{
ch: ch,
}
return iterator, generator
}
// Next 获取下一个事件
func (ai *AsyncIterator[T]) Next() (T, bool) {
ai.mu.RLock()
defer ai.mu.RUnlock()
if ai.closed {
var zero T
return zero, false
}
select {
case item, ok := <-ai.ch:
return item, ok
}
}
// Close 关闭迭代器
func (ai *AsyncIterator[T]) Close() {
ai.mu.Lock()
defer ai.mu.Unlock()
if !ai.closed {
ai.closed = true
// 注意:不关闭通道,因为生成器可能还在使用
}
}
// Send 发送事件
func (ag *AsyncGenerator[T]) Send(item T) {
ag.mu.RLock()
defer ag.mu.RUnlock()
if ag.closed {
return
}
select {
case ag.ch <- item:
default:
// 通道已满,丢弃事件(或者可以选择阻塞)
}
}
// Close 关闭生成器
func (ag *AsyncGenerator[T]) Close() {
ag.mu.Lock()
defer ag.mu.Unlock()
if !ag.closed {
ag.closed = true
close(ag.ch)
}
}
8.2 事件流处理示例
package main
import (
"context"
"fmt"
"time"
"github.com/cloudwego/eino/adk"
"github.com/cloudwego/eino/schema"
)
func eventStreamExample() {
ctx := context.Background()
// 创建模拟智能体
agent := &MockStreamingAgent{
name: "StreamingAgent",
events: []*adk.AgentEvent{
{
AgentName: "StreamingAgent",
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage("开始处理任务..."),
},
},
},
{
AgentName: "StreamingAgent",
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage("正在分析输入..."),
},
},
},
{
AgentName: "StreamingAgent",
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage("生成响应..."),
},
},
},
{
AgentName: "StreamingAgent",
Output: &adk.AgentOutput{
MessageOutput: &adk.MessageVariant{
Message: schema.AssistantMessage("任务完成!"),
},
},
Action: adk.NewExitAction(),
},
},
}
// 运行智能体
input := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage("请处理这个复杂任务"),
},
EnableStreaming: true,
}
iterator := agent.Run(ctx, input)
defer iterator.Close()
fmt.Println("=== 智能体事件流 ===")
// 处理事件流
eventCount := 0
for {
event, ok := iterator.Next()
if !ok {
break
}
eventCount++
fmt.Printf("事件 %d:\n", eventCount)
if event.Err != nil {
fmt.Printf(" 错误: %v\n", event.Err)
break
}
if event.Output != nil && event.Output.MessageOutput != nil {
message, err := event.Output.MessageOutput.GetMessage()
if err != nil {
fmt.Printf(" 获取消息失败: %v\n", err)
continue
}
fmt.Printf(" 输出: %s\n", message.Content)
}
if event.Action != nil {
if event.Action.Exit {
fmt.Printf(" 动作: 退出\n")
break
}
if event.Action.TransferToAgent != nil {
fmt.Printf(" 动作: 转移到 %s\n", event.Action.TransferToAgent.DestAgentName)
}
}
fmt.Println()
}
fmt.Printf("总共处理了 %d 个事件\n", eventCount)
}
// 模拟流式智能体
type MockStreamingAgent struct {
name string
events []*adk.AgentEvent
}
func (m *MockStreamingAgent) Name(ctx context.Context) string {
return m.name
}
func (m *MockStreamingAgent) Description(ctx context.Context) string {
return "A mock streaming agent for demonstration"
}
func (m *MockStreamingAgent) Run(ctx context.Context, input *adk.AgentInput, options ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
iterator, generator := adk.NewAsyncIteratorPair[*adk.AgentEvent]()
go func() {
defer generator.Close()
for i, event := range m.events {
// 模拟处理延迟
time.Sleep(500 * time.Millisecond)
// 复制事件以确保安全
eventCopy := *event
eventCopy.RunPath = []adk.RunStep{{agentName: m.name}}
generator.Send(&eventCopy)
// 如果是退出事件,停止发送
if event.Action != nil && event.Action.Exit {
break
}
}
}()
return iterator
}
9. 状态管理与恢复
9.1 可恢复智能体
// 可恢复智能体示例
type ResumableChatAgent struct {
*adk.ChatModelAgent
// 状态序列化
stateSerializer StateSerializer
}
type StateSerializer interface {
Serialize(state any) ([]byte, error)
Deserialize(data []byte, state any) error
}
// 实现 ResumableAgent 接口
func (r *ResumableChatAgent) Resume(ctx context.Context, data []byte, input *adk.AgentInput, options ...adk.AgentRunOption) *adk.AsyncIterator[*adk.AgentEvent] {
iterator, generator := adk.NewAsyncIteratorPair[*adk.AgentEvent]()
go func() {
defer generator.Close()
// 反序列化状态
var state adk.State
err := r.stateSerializer.Deserialize(data, &state)
if err != nil {
generator.Send(&adk.AgentEvent{
AgentName: r.Name(ctx),
Err: fmt.Errorf("failed to deserialize state: %w", err),
})
return
}
// 使用恢复的状态继续执行
// 这里需要根据具体实现来恢复执行上下文
// 继续正常执行流程
normalIterator := r.ChatModelAgent.Run(ctx, input, options...)
defer normalIterator.Close()
for {
event, ok := normalIterator.Next()
if !ok {
break
}
generator.Send(event)
if event.Action != nil && event.Action.Exit {
break
}
}
}()
return iterator
}
// 状态保存示例
func saveAgentState(ctx context.Context, agent adk.Agent, state any) ([]byte, error) {
if resumableAgent, ok := agent.(*ResumableChatAgent); ok {
return resumableAgent.stateSerializer.Serialize(state)
}
return nil, fmt.Errorf("agent does not support state serialization")
}
// 状态恢复示例
func resumeAgentFromState(ctx context.Context, agent adk.Agent, data []byte, input *adk.AgentInput) *adk.AsyncIterator[*adk.AgentEvent] {
if resumableAgent, ok := agent.(adk.ResumableAgent); ok {
return resumableAgent.Resume(ctx, data, input)
}
// 如果不支持恢复,正常运行
return agent.Run(ctx, input)
}
10. 最佳实践与使用建议
10.1 智能体设计原则
- 单一职责: 每个智能体应该专注于特定的任务领域
- 清晰接口: 提供明确的名称和描述,便于其他智能体理解
- 错误处理: 妥善处理各种异常情况,提供有意义的错误信息
- 资源管理: 正确关闭流和迭代器,避免资源泄露
- 状态隔离: 避免智能体间的状态耦合,保持独立性
10.2 性能优化建议
- 异步处理: 充分利用异步迭代器的并发能力
- 流式输出: 对于长时间运行的任务,使用流式输出提供实时反馈
- 缓存机制: 对重复的计算结果进行缓存
- 资源池化: 对于频繁创建的对象使用对象池
- 监控指标: 添加适当的监控和日志记录
10.3 调试与测试
// 智能体测试示例
func TestChatModelAgent(t *testing.T) {
ctx := context.Background()
// 创建模拟模型
mockModel := &MockChatModel{
responses: []*schema.Message{
schema.AssistantMessage("Hello! How can I help you?"),
},
}
// 创建智能体
agent, err := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{
Name: "TestAgent",
Description: "A test agent",
Model: mockModel,
ToolsConfig: adk.ToolsConfig{},
})
assert.NoError(t, err)
// 测试运行
input := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage("Hello"),
},
}
iterator := agent.Run(ctx, input)
defer iterator.Close()
// 验证输出
event, ok := iterator.Next()
assert.True(t, ok)
assert.NoError(t, event.Err)
assert.NotNil(t, event.Output)
message, err := event.Output.MessageOutput.GetMessage()
assert.NoError(t, err)
assert.Equal(t, "Hello! How can I help you?", message.Content)
}
// 多智能体集成测试
func TestMultiAgentCollaboration(t *testing.T) {
ctx := context.Background()
// 创建多个智能体
agents := []adk.Agent{
createMockAgent("Agent1", "Handles type A tasks"),
createMockAgent("Agent2", "Handles type B tasks"),
createMockAgent("Router", "Routes tasks to appropriate agents"),
}
// 创建运行器
runner, err := adk.NewRunner(ctx, &adk.RunnerConfig{
Agents: agents,
MaxIterations: 10,
})
assert.NoError(t, err)
// 测试协作
input := &adk.AgentInput{
Messages: []adk.Message{
schema.UserMessage("Process this complex task"),
},
}
iterator := runner.Run(ctx, "Router", input)
defer iterator.Close()
// 验证事件流
eventCount := 0
for {
event, ok := iterator.Next()
if !ok {
break
}
eventCount++
assert.NoError(t, event.Err)
if event.Action != nil && event.Action.Exit {
break
}
}
assert.Greater(t, eventCount, 0)
}
11. 总结
ADK (Agent Development Kit) 模块是 Eino 框架的智能体开发核心,提供了完整的智能体构建和管理能力。其主要特点包括:
11.1 设计优势
- 事件驱动架构: 基于
AgentEvent
的异步事件流模型,支持复杂的智能体交互 - 可组合性: 支持智能体的嵌套、组合和协作,构建复杂的多智能体系统
- 流式优先: 原生支持流式消息处理,适应实时交互需求
- 模式化设计: 提供 ReAct、Plan-Execute、Supervisor 等预构建模式
- 可恢复性: 支持智能体执行状态的保存和恢复
11.2 核心组件
- Agent 接口: 定义智能体的基本能力和交互协议
- 事件系统: 通过
AgentEvent
、AgentInput
、AgentOutput
、AgentAction
实现丰富的交互 - AsyncIterator: 异步迭代器支持事件流的高效处理
- ChatModelAgent: 基于聊天模型的 ReAct 模式智能体
- 多智能体协作: 通过 Runner 和转移机制实现智能体间的协作
11.3 应用场景
- 对话系统: 构建具有工具调用能力的智能对话助手
- 任务自动化: 通过多智能体协作完成复杂的自动化任务
- 决策支持: 使用 Plan-Execute 模式进行复杂问题的分解和解决
- 工作流编排: 通过工作流智能体实现业务流程的自动化
- 监督系统: 使用 Supervisor 模式协调和管理多个专业智能体
通过 ADK 模块,开发者可以构建从简单的单智能体应用到复杂的多智能体协作系统,充分发挥 Eino 框架在智能体开发方面的强大能力。
上一篇: Compose模块详解 | 下一篇: Callbacks模块详解
更新时间: 2024-12-19 | 文档版本: v1.0