{"meta":{"title":"机队模式","intro":"机群模式是 Copilot 的一种并行编排模式，适用于可拆分为由独立子代理分别处理的工作。 在运行时研究笔记中，机群模式被描述为“运行时内置的模式，通过 task 工具并行调度多个子智能体，并以 SQL 待办事项作为共享的协调状态”。 当一个父会话需要协调多个辅助角色、收集其结果，并使用合并后的上下文继续对话时，请使用此模式。","product":"GitHub Copilot","breadcrumbs":[{"href":"/zh/enterprise-cloud@latest/copilot","title":"GitHub Copilot"},{"href":"/zh/enterprise-cloud@latest/copilot/how-tos","title":"操作方法"},{"href":"/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk","title":"Copilot SDK"},{"href":"/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features","title":"功能"},{"href":"/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/fleet-mode","title":"机队模式"}],"documentType":"article"},"body":"# 机队模式\n\n机群模式是 Copilot 的一种并行编排模式，适用于可拆分为由独立子代理分别处理的工作。 在运行时研究笔记中，机群模式被描述为“运行时内置的模式，通过 task 工具并行调度多个子智能体，并以 SQL 待办事项作为共享的协调状态”。 当一个父会话需要协调多个辅助角色、收集其结果，并使用合并后的上下文继续对话时，请使用此模式。\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## 何时使用机群模式\n\n当可以在执行前分解工作，并且每个单元可以在不等待其他人的情况下运行时，机群模式非常有用。\n\n适合的场景包括：\n\n* 多文件重构：每个辅助角色负责一个文件、包或语言 SDK。\n* 批量审查：每个辅助角色检查独立的差异、模块或警报组。\n* 跨独立存储库、服务或功能区域的并行研究。\n* 文档更新中，每位工作人员各自负责一个页面或主题。\n* 迁移任务：每个辅助角色可验证自身负责的部分并反馈结果。\n\n以下情况避免使用车队模式：\n\n* 顺序任务：步骤 2 需要步骤 1 的具体输出。\n* 紧密耦合的编辑：辅助角色会争用同一文件。\n* 一个同步子代理或父代理可以快速完成的小任务。\n* 需要持续共享推理而不是明确所有权的任务。\n\n当父会话能够创建清晰的工作单元、为每个单元指定一名负责人，并明确每个工作方需要返回的内容时，机群模式的效果最佳。\n\n## 正在启动舰队模式\n\nSDK 通过会话 RPC 命名空间以多种语言公开机群模式。 该绑定在生成的 RPC 接口中处于实验阶段；若您的应用程序依赖此功能，请同时固定 SDK 和 Copilot CLI 运行时。\n\n### 在会话内部\n\n接线方式为 `session.fleet.start`。 可选的 `prompt` 与运行时的机群编排指令相结合。\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nconst result = await session.rpc.fleet.start({\n    prompt: \"Refactor each SDK package independently, then summarize the changes.\",\n});\n\nif (result.started) {\n    console.log(\"Fleet mode started\");\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot.rpc import FleetStartRequest\n\nresult = await session.rpc.fleet.start(\n    FleetStartRequest(\n        prompt=\"Review each service independently, then summarize the risks.\"\n    )\n)\n\nif result.started:\n    print(\"Fleet mode started\")\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\nprompt := \"Update each package independently, then report validation results.\"\nresult, err := session.RPC.Fleet.Start(ctx, &rpc.FleetStartRequest{\n    Prompt: &prompt,\n})\nif err != nil {\n    return err\n}\nif result.Started {\n    fmt.Println(\"Fleet mode started\")\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nvar result = await session.Rpc.Fleet.StartAsync(\n    \"Audit each project independently, then summarize the findings.\");\n\nif (result.Started)\n{\n    Console.WriteLine(\"Fleet mode started\");\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"rust\" data-label=\"Rust\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Rust</div>\n\n```rust\nuse github_copilot_sdk::rpc::FleetStartRequest;\n\nlet result = session\n    .rpc()\n    .fleet()\n    .start(FleetStartRequest {\n        prompt: Some(\"Research each crate independently, then summarize the plan.\".into()),\n    })\n    .await?;\n\nif result.started {\n    println!(\"Fleet mode started\");\n}\n```\n\n</div>\n\n</div>\n\n机群模式的原生类型绑定已在 Node.js/TypeScript、Python、Go、.NET 和 Rust 中得到验证。 此分支上的 `java/src/main/java` 中找不到Java绑定，因此在该图面可用之前，将省略Java示例。\n\n### 从计划模式\n\n计划模式界面可以通过返回 `autopilot_fleet` 退出操作来启动集群部署。 生成的会话事件类型将其描述为：\n\n```typescript\ntype ExitPlanModeAction =\n  | \"exit_only\"\n  | \"interactive\"\n  | \"autopilot\"\n  /** Exit plan mode and continue with parallel autonomous workers. */\n  | \"autopilot_fleet\";\n```\n\n当用户批准已包含独立工作项的计划时，请使用此功能。 对于单个自主工作单元，使用 `autopilot`；当需要用户参与其中时，使用 `interactive`。\n\n## 子代理如何协调\n\n机群模式依赖于显式协调状态，而不是隐式共享内存。 父智能体将工作分解为待办事项，每个子智能体负责一个待办事项，编排器会调度那些依赖关系已满足的辅助角色。\n\n规范架构为：\n\n```sql\nCREATE TABLE todos (\n    id TEXT PRIMARY KEY,\n    title TEXT NOT NULL,\n    description TEXT,\n    status TEXT DEFAULT 'pending'\n);\n\nCREATE TABLE todo_deps (\n    todo_id TEXT,\n    depends_on TEXT,\n    PRIMARY KEY (todo_id, depends_on)\n);\n```\n\n每个待办事项都会经历一个小型状态机：\n\n```text\npending -> in_progress -> done\n                       \\-> blocked\n```\n\n子代理应：\n\n1. 通过设置 `status = 'in_progress'` 来申领且仅一个已就绪的待办事项。\n2. 仅在该待办事项的范围内进行工作。\n3. 将其结果存储在对话或相关任务输出中。\n4. 完成后设置 `status = 'done'` 。\n5. 在无法继续时设置 `status = 'blocked'` ，并包括原因。\n\n调度器可通过如下查询查找依赖关系已满足的工作：\n\n```sql\nSELECT t.*\nFROM todos t\nWHERE t.status = 'pending'\n  AND NOT EXISTS (\n      SELECT 1\n      FROM todo_deps td\n      JOIN todos dep ON td.depends_on = dep.id\n      WHERE td.todo_id = t.id\n        AND dep.status != 'done'\n  );\n```\n\n这种模式为每个工作单元明确指定了负责人，并使父会话能够判断哪些处于就绪、运行中、已完成或被阻塞状态。\n\n## 生命周期挂钩\n\n机群模式通过运行时的任务机制调用子代理。 运行时会为子智能体工具调用触发钩子活动：运行时 1.0.52 的变更日志指出，`preToolUse`、`postToolUse`、`subagentStart` 和 `subagentStop` 在子智能体工具调用时能正确触发。\n\n在此分支的公开 SDK 接口中，未发现针对 `subagentStart` 或 `subagentStop` 的专用 SDK 钩子回调。 SDK 用户可以通过通用会话事件流观察子代理活动，其中包括诸如 `subagent.started`、`subagent.completed`、`subagent.failed`、`subagent.selected` 和 `subagent.deselected` 等事件。\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nsession.on((event) => {\n    if (event.type === \"subagent.started\") {\n        console.log(`Started ${event.data.agentDisplayName}`);\n    }\n\n    if (event.type === \"subagent.completed\") {\n        console.log(`Completed ${event.data.agentDisplayName}`);\n    }\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\ndef handle_event(event):\n    if event.type == \"subagent.started\":\n        print(f\"Started {event.data.agent_display_name}\")\n    elif event.type == \"subagent.completed\":\n        print(f\"Completed {event.data.agent_display_name}\")\n\nunsubscribe = session.on(handle_event)\n```\n\n</div>\n\n</div>\n\n有关已在 SDK 层公开的挂钩配置，请参阅 [使用挂钩](/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/hooks)。 有关子代理事件负载，请参阅 [自定义代理和子代理编排](/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/custom-agents)。\n\n## 插件子智能体\n\n运行时可以通过 `--plugin-dir` 加载插件。 通过此方式加载的插件可在提示模式下将其智能体注册为可用的 `task(agent_type=...)` 子智能体类型，这意味着机群模式可将任务分派给这些由插件提供的辅助角色类型。\n\n这目前是一种运行时层面的配置方式，而不是有文档说明的 SDK 层面的注册 API。 使用插件目录配置 Copilot CLI 运行时，然后将 SDK 客户端连接到该运行时。 将来可能会添加用于注册插件子代理类型的本机 SDK 帮助程序。\n\n从概念上讲，机群提示可以请求特定的辅助角色类型：\n\n```text\nUse task(agent_type=\"security-review\") for each independent package.\nRun the workers in parallel and summarize only high-confidence findings.\n```\n\n使插件提供的子代理类型保持窄和描述性，以便业务流程协调程序能够可靠地选择它们。\n\n## 最佳做法\n\n* 在启动机群模式之前，将工作分解为独立单位。\n* 尽量减少待办事项之间的依赖关系；依赖关系会降低并行性。\n* 为每个待办事项分配一个持久性 ID、一个清晰的标题和完整的描述。\n* 让每个子代理在同一时间只负责一个待办事项。\n* 使用后台子代理实现真正的并行处理。\n* 对序列化的步骤或验证入口使用同步子代理调用。\n* 为每个子代理提供完整的上下文；子代理在调用之间不保留状态。\n* 在每个工作代理提示中包含文件路径、命令、预期输出和约束。\n* 不要派发单个后台子代理；应优先使用同步调用，或并行批量调度多个工作器。\n* 除非父智能体会显式解决冲突，否则避免将重叠的文件分配给不同的辅助角色。\n* 要求每个工作者报告其更改了哪些内容、如何验证这些更改，以及哪些事项仍然受阻。\n* 在辅助角色完成任务后，由父智能体验证合并后的结果。\n\n## 限制和开放问题\n\n* 机群模式通过生成的会话 RPC 绑定公开，并在多个 SDK 中标记为实验性。\n* SQL todos 模式是运行时指南中的规范协调模型，但它是否是 SDK 使用者的稳定扩展性协定仍然是一个悬而未决的问题。\n* `subagentStart` 和 `subagentStop` 是运行时钩子名称；该分支通过通用会话事件流（而非专用钩子回调）向 SDK 使用者暴露子代理的生命周期。\n* 插件子代理注册是通过 `--plugin-dir`运行时层配置的;在此分支上未验证 SDK 级插件注册帮助程序。\n* 在此分支的 Java SDK 源代码中未找到 `session.fleet.start` 的 Java 原生类型绑定。\n* 机群模式并不能免除父智能体的审核需求。 并行工作器可能会产生不一致的假设，而这需要由协调器进行调和。\n\n## 另请参阅\n\n* [自定义代理和子代理编排](/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/custom-agents)\n* [使用挂钩](/zh/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/hooks)"}