Eino 项目组 2025-11-04 17:02 北京

🧰 **Eino ADK 框架概览**:Eino ADK 是一个为 Go 语言量身打造的智能体开发框架,它提供了一套完整的体系,包括统一的 Agent 抽象接口、灵活的组合模式以及强大的协作机制。该框架通过解决 LLM 与业务系统集成、状态管理等痛点,让开发者能够以“乐高积木”的方式构建复杂的智能体系统,提升开发效率和可控性。
🧠 **核心组件与模式**:框架的核心组件包括 `ChatModelAgent`,它封装了与大语言模型的交互,并支持 ReAct(Reason-Act-Observe)模式,实现“思考-行动-观察”的闭环。此外,还有 `WorkflowAgents`(Sequential、Parallel、Loop Agent)用于协调子 Agent 执行流程,以及预构建的 `Supervisor` 模式(集中式协调)和 `Plan-Execute` 模式(结构化问题解决),覆盖了多种复杂的 AI 应用场景。
⚡ **异步事件驱动与中断恢复**:Eino ADK 采用异步事件流设计,通过 `AsyncIterator[*AgentEvent]` 实现非阻塞的事件处理,使得 Agent 的思考过程和中间结果能够实时响应。同时,框架支持运行时中断与恢复机制,允许 Agent 主动中断并保存状态,未来可从断点处恢复执行,这对于需要长时间等待或外部输入(Human in the loop)的场景尤为重要。
🤝 **灵活的协作机制**:ADK 支持 Agent 之间的多种协作方式,包括共享 Session(用于状态管理和数据共享)、移交运行(父子 Agent 间的任务传递)以及显式调用(将 Agent 视为工具)。这些机制提供了高度的灵活性,使得 Agent 能够有效地协同工作,共同完成复杂的任务。
🚀 **项目开发经理智能体示例**:文章通过一个项目开发经理智能体的示例,展示了如何利用 Eino ADK 构建一个集调研、编码、评审于一体的复杂多智能体系统。该示例体现了 ADK 在 Agent 抽象、输入输出定义、事件驱动运行、中断恢复以及多 Agent 模式应用等方面的优势,与传统开发模式形成鲜明对比,突显了其高效性和便捷性。
Eino 项目组 2025-11-04 17:02 北京
🎭 WorkflowAgents:精密的流水线Eino ADK 提供了专用于协调子 Agent 执行流程的 WorkflowAgents 模式,用于通过预定义逻辑管理 Agent 的运行方式,产生确定的执行过程,协助实现可预测可控制的多 Agent 协作方式。您可以按需对下列模式进行排列组合,结合 ChatModelAgent 构造出符合自身需求的完整工作流水线:Sequential Agent:将配置中注册的 Agents 按顺序依次执行一次后结束,运行遵循以下原则:线性执行:严格按照 SubAgents 数组的顺序执行。运行结果传递:配置中的每个 Agent 都能够获取 Sequential Agent 的完整输入以及前序 Agent 的输出。支持提前退出:如果任何一个子 Agent 产生退出/中断动作,整个 Sequential 流程会立即终止。➤ 可能的实践场景有:数据 ETL:ExtractAgent(从 MySQL 抽取订单数据)→ TransformAgent(清洗空值、格式化日期)→ LoadAgent(加载到数据仓库)CI / CD 流水线:CodeCloneAgent(从代码仓库拉取代码)→UnitTestAgent(运行单元测试,用例失败时返回错误与分析报告)→CompileAgent(编译代码)→DeployAgent(部署到目标环境)import github.com/cloudwego/eino/adk// 创建一个包含多个工具的 ReAct ChatModelAgentchatAgent := adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{Name: "intelligent_assistant",Description: "An intelligent assistant capable of using multiple tools to solve complex problems",Instruction: "You are a professional assistant who can use the provided tools to help users solve problems",Model: openaiModel,ToolsConfig: adk.ToolsConfig{Tools: []tool.BaseTool{searchTool,calculatorTool,weatherTool,},}})
Parallel Agent:将配置中注册的 Agents 并发执行,所有 Agent 执行完毕后结束,运行遵循以下原则:并发执行:所有子 Agent 同时启动,在独立的 goroutine 中并行执行。共享输入:所有子 Agent 接收调用 Pararllel Agent 时相同的初始输入。等待与结果聚合:内部使用 sync.WaitGroup 等待所有子 Agent 执行完成,收集所有子 Agent 的执行结果并按接收顺序输出到 AsyncIterator 中。import github.com/cloudwego/eino/adk// 依次执行 制定研究计划 -> 搜索资料 -> 撰写报告sequential := adk.NewSequentialAgent(ctx, &adk.SequentialAgentConfig{Name: "research_pipeline",SubAgents: []adk.Agent{planAgent, // 制定研究计划searchAgent, // 搜索资料writeAgent, // 撰写报告},})
Loop Agent:将配置中注册的 Agents 按顺序依次执行并循环多次,运行遵循以下原则:循环执行:重复执行 SubAgents 序列,每次循环都是一个完整的 Sequential 执行过程。运行结果累积:每次迭代的结果都会累积,后续迭代的输入可以访问所有历史信息。条件退出:支持通过输出包含 ExitAction 的事件或达到最大迭代次数来终止循环,配置 MaxIterations=0 时表示无限循环。➤ 可能的实践场景有:数据同步:CheckUpdateAgent(检查源库增量)→ IncrementalSyncAgent(同步增量数据)→ VerifySyncAgent(验证一致性)压力测试:StartClientAgent(启动测试客户端)→ SendRequestsAgent(发送请求)→ CollectMetricsAgent(收集性能指标)import github.com/cloudwego/eino/adk// 并发执行 情感分析 + 关键词提取 + 内容摘要parallel := adk.NewParallelAgent(ctx, &adk.ParallelAgentConfig{Name: "multi_analysis",SubAgents: []adk.Agent{sentimentAgent, // 情感分析keywordAgent, // 关键词提取summaryAgent, // 内容摘要},})
🛠️ 预构建的 Multi-Agent 范式import github.com/cloudwego/eino/adk// 循环执行 5 次,每次顺序为:分析当前状态 -> 提出改进方案 -> 验证改进效果loop := adk.NewLoopAgent(ctx, &adk.LoopAgentConfig{Name: "iterative_optimization",SubAgents: []adk.Agent{analyzeAgent, // 分析当前状态improveAgent, // 提出改进方案validateAgent, // 验证改进效果},MaxIterations: 5,})
import github.com/cloudwego/eino/adk/prebuilt/supervisor// 科研项目管理:创建一个监督者模式的 multi-agent// 包含 research(调研),experimentation(实验),report(报告)三个子 Agentsupervisor, err := supervisor.New(ctx, &supervisor.Config{SupervisorAgent: supervisorAgent,SubAgents: []adk.Agent{researchAgent,experimentationAgent,reportAgent,},})
基础设计🎯 统一的 Agent 抽象ADK 的核心是一个简洁而强大的 Agent 接口:import github.com/cloudwego/eino/adk/prebuilt/planexecute// Plan-Execute 模式的科研助手researchAssistant := planexecute.New(ctx, &planexecute.Config{Planner: adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{Name: "research_planner",Instruction: "制定详细的研究计划,包括文献调研、数据收集、分析方法等",Model: gpt4Model,}),Executor: adk.NewChatModelAgent(ctx, &adk.ChatModelAgentConfig{Name: "research_executor",ToolsConfig: adk.ToolsConfig{Tools: []tool.BaseTool{scholarSearchTool,dataAnalysisTool,citationTool,},},}),Replanner: replannerAgent,})
type Agent interface {Name(ctx context.Context) stringDescription(ctx context.Context) stringRun(ctx context.Context, input *AgentInput, options ...AgentRunOption) *AsyncIterator[*AgentEvent]}
// 获取全部 SessionValuesfuncGetSessionValues(ctx context.Context)map[string]any// 指定 key 获取 SessionValues 中的一个值,key 不存在时第二个返回值为 false,否则为 truefuncGetSessionValue(ctx context.Context, key string)(any, bool)// 添加 SessionValuesfuncAddSessionValue(ctx context.Context, key string, value any)// 批量添加 SessionValuesfuncAddSessionValues(ctx context.Context, kvs map[string]any)
移交运行(Transfer):携带本 Agent 输出结果上下文,将任务移交至子 Agent 继续处理。适用于智能体功能可以清晰的划分边界与层级的场景,常结合 ChatModelAgent 使用,通过 LLM 的生成结果进行动态路由。结构上,以此方式进行协作的两个 Agent 称为父子 Agent:
显式调用(ToolCall):将 Agent 视为工具进行调用。适用于 Agent 运行仅需要明确清晰的参数而非完整运行上下文的场景,常结合 ChatModelAgent,作为工具运行后将结果返回给 ChatModel 继续处理。除此之外,ToolCall 同样支持调用符合工具接口构造的、不含 Agent 的普通工具。// 设置父子 Agent 关系funcSetSubAgents(ctx context.Context, agent Agent, subAgents []Agent)(Agent, error)// 指定目标 Agent 名称,构造 Transfer EventfuncNewTransferToAgentAction(destAgentName string) *AgentAction
🔄 中断与恢复机制Eino ADK 提供运行时中断与恢复的功能,允许正在运行中的 Agent 主动中断并保存其当前状态,并在未来从中断点恢复执行。该功能为长时间等待、可暂停或需要外部输入(Human in the loop)等场景下的开发提供协助。Agent 内部运行过程中,通过抛出含 Interrupt Action 的 Event 主动通知 Runner 中断运行,并允许携带额外信息供调用方阅读与使用。Runner 通过初始化时注册的 CheckPointStore 记录当前运行状态重新准备好运行后,通过 Resume 方法携带恢复运行所需要的新信息,从断点处重新启动该 Agent 运行// 将 Agent 转换为 ToolfuncNewAgentTool(_ context.Context, agent Agent, options ...AgentToolOption)tool.BaseTool
快速开始安装// 1. 创建支持断点恢复的 Runnerrunner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: complexAgent,CheckPointStore: memoryStore, // 内存状态存储})// 2. 开始执行iter := runner.Query(ctx, "recommend a book to me", adk.WithCheckPointID("1"))for {event, ok := iter.Next()if !ok {break}if event.Err != nil {log.Fatal(event.Err)}if event.Action != nil {// 3. 由 Agent 内部抛出 Interrupt 事件if event.Action.Interrupted != nil {ii, _ := json.MarshalIndent(event.Action.Interrupted.Data, "", "\t")fmt.Printf("action: interrupted\n")fmt.Printf("interrupt snapshot: %v", string(ii))}}}// 4. 从 stdin 接收用户输入scanner := bufio.NewScanner(os.Stdin)fmt.Print("\nyour input here: ")scanner.Scan()fmt.Println()nInput := scanner.Text()// 5. 携带用户输入信息,从断点恢复执行iter, err := runner.Resume(ctx, "1", adk.WithToolOptions([]tool.Option{subagents.WithNewInput(nInput)}))
go get github.com/cloudwego/eino项目开发经理智能体下面的示例使用 Eino ADK 构建了一个项目开发经理智能体,面向多方面管理协同的场景:Project Manager Agent:项目经理智能体,整体使用 Supervisor 模式,各 Agent 的功能如下:ResearchAgent:调研 Agent,负责调研并生成可行方案,支持中断后从用户处接收额外的上下文信息来提高调研方案生成的准确性。CodeAgent:编码 Agent,使用知识库工具,召回相关知识作为参考,生成高质量的代码。ReviewAgent:评论 Agent,使用顺序工作流编排问题分析、评价生成、评价验证三个步骤,对调研结果 / 编码结果进行评审,给出合理的评价,供项目经理进行决策。ProjectManagerAgent:项目经理 Agent,根据动态的用户输入,路由并协调多个负责不同维度工作的子智能体开展工作。该 Agent 可能的工作场景为:从零开始实现项目:项目经理从需求入手,经由调研、编码、评论三个 Agent 工作,最终完成项目交付。对已有项目的完善:项目经理从评论 Agent 获得项目仍旧需要完善的功能点,交由编码 Agent 进行实现,再交由评论 Agent 对修改后的代码进行评审。开展技术调研:项目经理要求调研 Agent 生成技术调研报告,然后由评论 Agent 给出评审意见。调用方结合返回的技术调研报告和评审意见,决定后续动作。该示例的设计涵盖了文中介绍的大部分概念,您可以基于示例回顾之前的提到的种种设计理念。另外,请试想普通开发模式下如何完成该示例的编写,ADK 的优势便立刻凸显了出来:结尾Eino ADK 不仅仅是一个开发框架,更是一个完整的智能体开发生态。它通过统一的抽象、灵活的组合和强大的协作机制,让 Go 开发者能够轻松构建从简单对话机器人到复杂多智能体系统的各种 AI 应用。立即开始你的智能体开发之旅📚 查看更多文档:Eino ADK 文档:https://www.cloudwego.io/zh/docs/eino/core_modules/eino_adk/🛠️ 浏览 ADK 源码:Eino ADK 源码:https://github.com/cloudwego/eino/tree/main/adk💡 探索全部示例:Eino ADK Exampleshttps://github.com/cloudwego/eino-examples/tree/main/adk🤝 加入开发者社区:与其他开发者交流经验和最佳实践Eino ADK,让智能体开发变得简单而强大!func main(){ctx := context.Background()// Init chat model for agentstcm, err := openai.NewChatModel(ctx, &openai.ChatModelConfig{APIKey: os.Getenv("OPENAI_API_KEY"),Model: os.Getenv("OPENAI_MODEL"),BaseURL: os.Getenv("OPENAI_BASE_URL"),ByAzure: func() bool {return os.Getenv("OPENAI_BY_AZURE") == "true"}(),})if err != nil {log.Fatal(err)}// Init research agentresearchAgent, err := agents.NewResearchAgent(ctx, tcm)if err != nil {log.Fatal(err)}// Init code agentcodeAgent, err := agents.NewCodeAgent(ctx, tcm)if err != nil {log.Fatal(err)}// Init technical agentreviewAgent, err := agents.NewReviewAgent(ctx, tcm)if err != nil {log.Fatal(err)}// Init project manager agents, err := agents.NewProjectManagerAgent(ctx, tcm)if err != nil {log.Fatal(err)}// Combine agents into ADK supervisor pattern// Supervisor: project manager// Sub-agents: researcher / coder / reviewersupervisorAgent, err := supervisor.New(ctx, &supervisor.Config{Supervisor: s,SubAgents: []adk.Agent{researchAgent, codeAgent, reviewAgent},})if err != nil {log.Fatal(err)}// Init Agent runnerrunner := adk.NewRunner(ctx, adk.RunnerConfig{Agent: supervisorAgent,EnableStreaming: true, // enable stream outputCheckPointStore: newInMemoryStore(), // enable checkpoint for interrupt & resume})// Replace it with your own queryquery := "please generate a simple ai chat project with python."checkpointID := "1"// Start runner with a new checkpoint iditer := runner.Query(ctx, query, adk.WithCheckPointID(checkpointID))interrupted := falsefor {event, ok := iter.Next()if !ok {break}if event.Err != nil {log.Fatal(event.Err)}if event.Action != nil && event.Action.Interrupted != nil {interrupted = true}prints.Event(event)}if !interrupted {return}// interrupt and ask for additional user contextscanner := bufio.NewScanner(os.Stdin)fmt.Print("\ninput additional context for web search: ")scanner.Scan()fmt.Println()nInput := scanner.Text()// Resume by checkpoint id, with additional user context injectioniter, err = runner.Resume(ctx, checkpointID, adk.WithToolOptions([]tool.Option{agents.WithNewInput(nInput)}))if err != nil {log.Fatal(err)}for {event, ok := iter.Next()if !ok {break}if event.Err != nil {log.Fatal(event.Err)}prints.Event(event)}}
AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。
鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑