 中間件實現 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),僅供參考