ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Genkit Dart 多智能体编排:使用 agents() 中间件实现 Orchestrator 与 Sub-Agent 任务委派

Genkit Dart 多智能体编排:使用 agents() 中间件实现 Orchestrator 与 Sub-Agent 任务委派 Genkit Dart 多智能体编排使用 agents() 中间件实现 Orchestrator 与 Sub-Agent 任务委派【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills本指南基于 Genkit DartAI SDK for Dart的 Agent 体系中一个非常实用的模式编排器Orchestrator智能体将任务委派给多个专业子智能体Sub-Agent如researcher与coder。通过package:genkit_middleware提供的agents()中间件只需一行配置即可获得按需委派 结果回收的完整能力。读完本文你将掌握如何定义可被编排器发现的子智能体、如何用agents()挂载委派工具、delegate_to_name工具与系统提示词的自动注入机制、maxDelegations/historyLength/toolPrefix等关键选项以及如何跨智能体共享 Artifact 并规避失控循环。认识 Orchestrator 与 Sub-Agent 模式在复杂业务场景中单个智能体往往难以同时胜任检索资料与编写代码等多类差异巨大的任务。Genkit Dart 推荐的做法是编排器Orchestrator一个主智能体负责理解用户请求、判断该交给谁、串联多个子任务的执行顺序并最终综合所有子结果给出答复子智能体Sub-Agent若干职责单一、可被编排器调用的专业智能体例如负责资料检索的researcher与负责编码的coder。子智能体委派Sub-agent delegation的底层实现来自package:genkit_middleware/agents.dart中的agents()中间件。其工作原理以当前仓库的 agents-multi-agent.md 为骨架可以概括为三步注入委派工具中间件为每个子智能体自动生成一个委派工具命名为delegate_to_name默认前缀delegate_to扩充系统提示词在编排器的系统提示词末尾追加一个sub-agents块把各子智能体的名称与描述呈现给模型让模型知道什么情况该调谁执行委派并回收结果当模型调用某个委派工具时中间件实际运行对应的子智能体并把子智能体的响应作为该工具调用的结果返回给编排器编排器据此继续综合生成最终答案。在深入代码之前建议先阅读 agents.md 掌握defineAgent、chat()、会话Session等基础概念本指南默认你已经具备这些前置知识。注册中间件插件要让agents()中间件在运行时可用必须在Genkit实例的plugins列表中注册AgentsPlugin()。按照 agents.md 与 genkit_middleware.md 的约定retry与RetryPlugin随核心包package:genkit/genkit.dart提供而agents、filesystem、skills、toolApproval等智能体中间件来自package:genkit_middlewareimport package:genkit/genkit.dart; import package:genkit_middleware/agents.dart; final ai Genkit(plugins: [googleAI(), AgentsPlugin(), RetryPlugin()]);通常你还会把AgentsPlugin与FilesystemPlugin()、SkillsPlugin()、ToolApprovalPlugin()、RetryPlugin()等一并注册到共享的Genkit实例上让use: [...]中引用的所有中间件都能被解析详见 genkit_middleware.md。第一步定义子智能体子智能体与普通智能体没有本质区别仍用ai.defineAgent定义。关键点在于必须为每个子智能体提供description。该描述会从注册表元数据registry metadata中被自动发现并展示给编排器模型正是依靠它来判断什么时候应该把任务委派给谁。import genkit.dart; final researcher ai.defineAgent( name: researcher, description: A thorough research assistant that provides well-sourced answers., system: You are a thorough research assistant. When asked a question, provide a clear, well-structured, and well-sourced answer., maxTurns: 10, ); final coder ai.defineAgent( name: coder, description: Writes, debugs, and explains code. Use for any programming tasks., system: You are an expert programmer. Provide clean, well-commented code with explanations. Use Dart by default unless asked otherwise., maxTurns: 10, );这里的几个要点值得展开name是委派工具名的组成部分默认情况下researcher会得到delegate_to_researcher工具coder会得到delegate_to_coder工具description决定委派质量描述越精确例如注明Use for any programming tasks模型越不容易把编码类请求误派给研究型子智能体maxTurns: 10限制子智能体内部工具调用循环的轮数上限避免单个子任务陷入无限循环。这与 agents.md 中defineAgent的maxTurns选项含义一致该文件示例中使用maxTurns: 30子智能体同样可以拥有自己的tools、store、use中间件配置——它们本身就是完整的智能体只是额外承担了被委派的职责。第二步挂载编排器并配置 agents() 中间件编排器通过use: [...]数组挂载agents()中间件。这里传入的是子智能体的名称列表agents: [researcher, coder]它们的描述会自动从注册表发现无需重复填写。import package:genkit/genkit.dart; import package:genkit_middleware/agents.dart; import genkit.dart; final orchestratorAgent ai.defineAgent( name: orchestratorAgent, system: You are a helpful project assistant. Analyze the users request and delegate to the appropriate sub-agent. If the request requires both research AND code, call them sequentially. After receiving sub-agent responses, synthesize a final answer for the user., use: [ agents( agents: [researcher, coder], maxDelegations: 5, // guard rail against runaway delegation loops historyLength: 4, // forward the last N user/model messages as context ), ], store: InMemorySessionStore(), );这一段包含多个值得细说的设计决策系统提示词中的编排指令system明确告诉模型先分析再委派需要研究与编码时按顺序调用收到子结果后综合成最终答复这与中间件自动注入的sub-agents块含子智能体描述协同工作共同塑造编排行为store: InMemorySessionStore()为编排器提供服务端会话持久化。根据 agents-sessions.md一旦智能体配置了store服务端便持有会话历史每轮产生不可变的快照snapshot快照链承载多轮对话状态。虽然多智能体编排不是必须使用 store但在需要跨轮保持编排上下文、后续支持分支branching或后台执行background时它是必要的基础设施委派限制与上下文窗口maxDelegations: 5与historyLength: 4分别用于防失控循环和控制上下文量详见下文选项说明。运行编排器编排器的运行方式与其他任何智能体完全一致——使用chat()开启会话并发送流式消息final chat orchestratorAgent.chat(); final turn chat.sendStream( text: Research the best sorting algorithms, then write a Dart quicksort., ); await for (final chunk in turn.stream) { stdout.write(chunk.text); } final res await turn.response;上述请求同时涉及研究与编码正是验证编排器能力的理想用例编排器应首先委派给researcher获取排序算法资料再委派给coder编写 Dart 快速排序最后综合两份子结果输出最终答复。agents() 选项详解原文档对agents()中间件的选项给出了精炼说明下面结合源码语义逐项展开选项类型必填默认值作用说明agentsListString是—子智能体名称列表。每个名称对应的description会从注册表元数据自动发现并展示给编排器供其决策委派对象toolPrefixString否delegate_to生成工具名的前缀最终工具名为toolPrefix_agent即默认的delegate_to_namemaxDelegationsint否—每次generate调用中允许的最大委派次数防止委派死循环runaway delegation loops。示例中设为5作为安全护栏historyLengthint否0/省略转发给子智能体的最近 N 条用户/模型消息数量作为其上下文。0或省略时只发送任务描述本身不携带历史artifactStrategyinline \| session否inline控制子智能体产生的 Artifact 如何回传给编排器详见下文跨智能体共享 Artifact两个容易混淆的维度需要澄清maxDelegations与maxTurns前者限制的是一次generate内的委派次数防止 A 委派 B、B 又委派 C 的连锁失控后者限制的是单个智能体含子智能体内部工具调用循环的轮数。二者分别从委派链路与单点循环两个方向约束智能体行为建议同时配置historyLength与上下文成本值越大子智能体获得的上下文越丰富但每次委派消耗的 token 也越多。如果你的子任务彼此独立例如多次查询天气0仅任务描述通常已足够而需要子智能体理解完整对话脉络时才适当调大如示例中的4。跨智能体共享 Artifact子智能体可以产出 Artifacts——命名的、带内容的交付物文件、报告、代码等它们存于会话中按名称去重并随响应返回。agents()的artifactStrategy选项决定这些 Artifact 如何到达编排器inline默认Artifact 内容直接包含在委派工具的结果中模型可以直接看到内容同时 Artifact 也会合并进父级会话。适合编排器需要读内容再综合的场景例如把coder生成的代码片段直接展示给模型用于最终整理sessionArtifact 只合并进父级会话工具结果中只列出 Artifact 名称而非内容。合并后的 Artifact 以调用标识invocation id命名空间隔离形如invocationId/name避免多个子智能体产出同名 Artifact 时互相覆盖。适合先产出、后按需读取的场景。需要说明的是Dart 当前版本尚未提供独立的artifacts()中间件这是 Genkit Dart 与部分其他语言实现的一个差异点。根据 agents-artifacts.md你需要直接在会话 Artifact API 之上自定义write_artifact/read_artifact工具内部通过ai.currentSession().addArtifacts()/getArtifacts()操作。此外如果目标是让智能体操作磁盘上的真实文件沙箱工作区则应使用filesystem()中间件filesystem(rootDirectory: ...)由FilesystemPlugin()支撑它提供list_files/read_file/write_file/search_and_replace四个工具。会话 Artifact 与磁盘文件是互补的两种方案前者用于对话范围的交付物流转后者用于持久化的磁盘工作。其他可搭配的中间件package:genkit_middleware还导出了filesystem、skills、toolApproval等中间件retry则随核心包package:genkit提供。它们的挂载方式一致——通过智能体的use: [...]或ai.generate的use——详见 genkit_middleware.md。各中间件能力一览中间件来源包提供的工具/能力filesystem(...)genkit_middlewarelist_files/read_file/write_file/search_and_replace限制在rootDirectory内skills(...)genkit_middlewareuse_skill按名称加载指定目录下SKILL.md中的专门指令到系统提示词toolApproval(...)genkit_middleware拦截指定工具的执行并要求显式审批返回FinishReason.interruptedretry()genkit核心对瞬时模型错误自动重试在编排场景中retry()通常与委派搭配使用子智能体执行可能偶发模型瞬时错误自动重试能显著提升整体成功率。而toolApproval的中断interrupt机制与多智能体委派有一个重要交互注意点见下节。注意事项子智能体中的中断不会被传播原文档特别强调了一个易踩的坑如果子智能体触发了一个中断interrupt该中断会作为普通的工具响应tool response报告回编排器而不会作为可恢复的中断resumable interrupt向上传播。这意味着如果子智能体内部依赖人工审批类中断如 agents-human-in-the-loop.md 中基于ctx.interrupt(...)的userApproval工具或toolApproval中间件拦截的工具编排器并不会暂停等待人工输入而是把请求审批当作一次普通的结果收下。因此实践中应委派自包含self-contained的任务——把需要人工介入的环节放在编排器层自己处理避免在子智能体深处埋入中断逻辑。顺带说明Dart 中没有独立的defineInterrupt中断是通过普通工具在其函数体内调用ctx.interrupt(...)来实现的详见 agents-human-in-the-loop.md。在多智能体场景下请牢记子智能体的中断不外传这一边界。从源码视角理解委派链路结合 agents.md 与 SKILL.md可以从体系层面进一步确认这套机制在 Genkit Dart 中的定位Agent 是提示词 工具 会话的持久化原语ai.defineAgent把提示词配置、工具列表、可选的会话存储合并注册为单个 action。agents()中间件正是以给编排器附加工具的形式实现委派——每一个delegate_to_name在模型视角里就是一个普通工具中间件与 Agent 天生配套use: [...]数组就是为这类横切能力设计的挂载点子智能体委派、文件系统访问、技能加载、工具审批、自动重试——每个都只要一行agents.md。多智能体编排不必手写循环调用子智能体并拼接结果的胶水代码中间件替你完成了注入工具 → 执行子智能体 → 回收结果的完整闭环会话快照是编排状态的基础编排器自身是普通 Agent其多轮状态、子智能体合并的 Artifact 都体现在会话快照链中agents-sessions.md这也是后续支持分支、后台执行、HTTP 服务化的前提。生产化从本地验证到 HTTP 服务多智能体编排器与普通 Agent 一样可以投入生产仓库文档提供了完整的落地路径CLI 验证genkit flow:run只运行 flow 而不运行 agent。要快速、非交互式地验证编排器可以像 agents.md 建议的那样把一轮对话包进一次性 flow 再通过genkit flow:run触发genkit flow:run tryOrchestrator ...? -- dart run main.dart完整开发期调试则应使用genkit start -- dart run main.dart捕获 trace通过genkit trace:list/genkit trace:get traceId检查模型 I/O 与工具调用详见 SKILL.md;HTTP 服务化使用genkit_shelf的shelfHandler暴露orchestratorAgent.action主轮次端点并按需暴露getSnapshotDataAction快照查询/恢复与abortAgentAction后台中止等配套 action见 agents.md 的Serve an agent over HTTP一节客户端消费浏览器 / Dart / Flutter 客户端从package:genkit/client.dart使用remoteAgent(url: ...)其底层 HTTP 协议与语言无关——即使编排器或子智能体用 JS/TypeScript 或 Go 实现客户端同样可以调用。多轮对话、中断、Artifact 流在客户端与服务端行为一致。小结Genkit Dart 的多智能体编排提供了一条极低成本的编排器 子智能体落地路径定义子智能体时写好description在编排器use中挂载agents(agents: [...])中间件便自动完成委派工具注入、系统提示词扩充与结果回收。实际使用时请重点把握四个决策点子智能体描述质量决定委派准确率maxDelegationsmaxTurns双重护栏防止失控循环artifactStrategy按编排器是否需要直接读内容在inline与session间选择子任务保持自包含避免在子智能体内依赖不传播的人工中断。更多进阶话题可继续阅读仓库中的 agents-custom.mddefineCustomAgent完全接管单轮执行、agents-branching.md从快照分叉对话与 agents-deployment.md多智能体 HTTP 部署与 CORS。【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表