플릿 모드를 사용하는 경우
플릿 모드는 실행 전에 작업을 분해할 수 있고 각 단위를 다른 단위를 기다리지 않고 실행할 수 있는 경우에 유용합니다.
적합한 경우는 다음과 같습니다.
- 각 작업자가 파일, 패키지 또는 언어 SDK를 소유하는 다중 파일 리팩터입니다.
- 각 작업자가 별도의 diff, 모듈 또는 경고 그룹을 확인하는 일괄 검토
- 독립적인 리포지토리, 서비스 또는 기능 영역에서 병렬 조사
- 설명서는 각 작업자가 페이지 또는 토픽을 소유하는 위치를 새로 고칩니다.
- 각 작업자가 자신에게 할당된 부분을 직접 검증하고 결과를 보고할 수 있는 마이그레이션 작업
다음의 경우 플릿 모드를 사용하지 않습니다.
- 2단계에서 1단계의 구체적인 출력이 필요한 순차 작업입니다.
- 작업자들이 동일한 파일을 두고 경합하게 되는 강하게 결합된 편집.
- 하나의 동기 하위 에이전트 또는 부모 에이전트가 빠르게 완료할 수 있는 작은 작업입니다.
- 소유권을 지우지 않고 지속적인 공유 추론이 필요한 작업입니다.
플릿 모드는 부모 세션에서 명확한 작업 단위를 만들고, 단위당 하나의 소유자를 할당하고, 각 작업자가 반환해야 하는 항목을 정의할 수 있는 경우에 가장 적합합니다.
플릿 모드 시작
SDK는 세션 RPC 네임스페이스를 통해 여러 언어로 플릿 모드를 노출합니다. 바인딩은 생성된 RPC 화면에서 실험적입니다. 애플리케이션이 의존하는 경우 SDK와 Copilot CLI 런타임을 모두 고정합니다.
세션 내에서
유선 방식은 session.fleet.start입니다. 선택 항목 prompt 은 런타임의 플릿 오케스트레이션 지침과 결합됩니다.
const result = await session.rpc.fleet.start({
prompt: "Refactor each SDK package independently, then summarize the changes.",
});
if (result.started) {
console.log("Fleet mode started");
}
from copilot.generated.rpc import FleetStartRequest
result = await session.rpc.fleet.start(
FleetStartRequest(
prompt="Review each service independently, then summarize the risks."
)
)
if result.started:
print("Fleet mode started")
package main
import (
"context"
"fmt"
copilot "github.com/github/copilot-sdk/go"
"github.com/github/copilot-sdk/go/rpc"
)
func main() {
ctx := context.Background()
client := copilot.NewClient(nil)
session, err := client.CreateSession(ctx, &copilot.SessionConfig{})
if err != nil {
return
}
prompt := "Update each package independently, then report validation results."
result, err := session.RPC.Fleet.Start(ctx, &rpc.FleetStartRequest{
Prompt: &prompt,
})
if err != nil {
return
}
if result.Started {
fmt.Println("Fleet mode started")
}
}
prompt := "Update each package independently, then report validation results."
result, err := session.RPC.Fleet.Start(ctx, &rpc.FleetStartRequest{
Prompt: &prompt,
})
if err != nil {
return err
}
if result.Started {
fmt.Println("Fleet mode started")
}
using GitHub.Copilot;
await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(new SessionConfig());
var result = await session.Rpc.Fleet.StartAsync(
"Audit each project independently, then summarize the findings.");
if (result.Started)
{
Console.WriteLine("Fleet mode started");
}
var result = await session.Rpc.Fleet.StartAsync(
"Audit each project independently, then summarize the findings.");
if (result.Started)
{
Console.WriteLine("Fleet mode started");
}
use github_copilot_sdk::generated::api_types::FleetStartRequest;
let result = session
.rpc()
.fleet()
.start(FleetStartRequest {
prompt: Some("Research each crate independently, then summarize the plan.".into()),
})
.await?;
if result.started {
println!("Fleet mode started");
}
플릿 모드에 대한 네이티브 형식 바인딩은 Node.js/TypeScript, Python, Go, .NET 및 Rust에서 확인되었습니다. 이 분기의 java/src/main/java Java 바인딩을 찾을 수 없으므로 Java 예제는 해당 표면을 사용할 수 있게 될 때까지 생략됩니다.
계획 모드에서
계획 모드 UI는 autopilot_fleet 종료 작업을 반환하면 플릿 배포를 시작할 수 있습니다. 생성된 세션 이벤트 유형은 다음과 같이 설명합니다.
type PlanModeExitAction =
| "exit_only"
| "interactive"
| "autopilot"
/** Exit plan mode and continue with parallel autonomous workers. */
| "autopilot_fleet";
사용자가 이미 독립적인 작업 항목이 포함된 계획을 승인할 때 사용합니다. 단일 자율 워커에는 autopilot를 사용하고, 사용자가 계속 개입해야 하는 경우에는 interactive를 사용합니다.
하위 에이전트가 조정하는 방법
플릿 모드는 암시적 공유 메모리 대신 명시적 조정 상태를 사용합니다. 부모 에이전트는 작업을 작업 항목으로 분해하고, 각 하위 에이전트는 작업 항목 하나를 맡으며, 오케스트레이터는 의존성이 이미 충족된 워커를 디스패치합니다.
정식 스키마는 다음과 같습니다.
CREATE TABLE todos (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
description TEXT,
status TEXT DEFAULT 'pending'
);
CREATE TABLE todo_deps (
todo_id TEXT,
depends_on TEXT,
PRIMARY KEY (todo_id, depends_on)
);
각 할 일은 작은 상태 컴퓨터를 통해 이동합니다.
pending -> in_progress -> done
\-> blocked
하위 에이전트는 다음을 수행해야 합니다.
status = 'in_progress'를 설정하여 준비된 할 일 하나만 정확히 할당하세요.- 해당 할 일의 범위 내에서만 작업하세요.
- 결과를 대화 또는 관련 작업 출력에 저장합니다.
- 완료되면
status = 'done'로 설정합니다. - 계속 진행할 수 없는 경우를 설정하고
status = 'blocked'이유를 포함합니다.
오케스트레이터는 다음과 같은 쿼리에 종속성이 충족되는 작업을 찾을 수 있습니다.
SELECT t.*
FROM todos t
WHERE t.status = 'pending'
AND NOT EXISTS (
SELECT 1
FROM todo_deps td
JOIN todos dep ON td.depends_on = dep.id
WHERE td.todo_id = t.id
AND dep.status != 'done'
);
이 패턴은 모든 작업자에게 명확한 소유자를 제공하고 부모 세션에서 준비, 실행, 완료 또는 차단된 항목에 대한 이유를 제공합니다.
수명 주기 후크
플릿 모드는 런타임의 작업 메커니즘을 통해 하위 에이전트를 호출합니다. 런타임은 하위 에이전트 도구 호출에 대한 후크 동작을 출력한다. 런타임 1.0.52 변경 로그에 따르면 하위 에이전트 도구 호출에 대해 preToolUse, postToolUse, subagentStart, 및 subagentStop가 올바르게 발생한다.
이 브랜치의 공개 SDK 범위에서 subagentStart 또는 subagentStop에 대한 전용 SDK 후크 콜백을 찾을 수 없습니다. SDK 소비자는 제네릭 세션 이벤트 스트림을 통해 하위 에이전트 작업을 관찰할 수 있습니다. 여기에는 이벤트(예: subagent.started, subagent.completed, subagent.failed``subagent.selected및subagent.deselected)가 포함됩니다.
session.on((event) => {
if (event.type === "subagent.started") {
console.log(`Started ${event.data.agentDisplayName}`);
}
if (event.type === "subagent.completed") {
console.log(`Completed ${event.data.agentDisplayName}`);
}
});
import asyncio
from copilot import CopilotClient
from copilot.session import PermissionHandler
async def main():
client = CopilotClient()
await client.start()
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
)
def handle_event(event):
if event.type == "subagent.started":
print(f"Started {event.data.agent_display_name}")
elif event.type == "subagent.completed":
print(f"Completed {event.data.agent_display_name}")
unsubscribe = session.on(handle_event)
asyncio.run(main())
def handle_event(event):
if event.type == "subagent.started":
print(f"Started {event.data.agent_display_name}")
elif event.type == "subagent.completed":
print(f"Completed {event.data.agent_display_name}")
unsubscribe = session.on(handle_event)
SDK 계층에 이미 노출된 후크 구성은 후크를 사용한 작업을 참조하세요. 하위 에이전트 이벤트 페이로드는 사용자 정의 에이전트 및 하위 에이전트 오케스트레이션을 참조하세요.
플러그 인 하위 에이전트
런타임은 --plugin-dir로 플러그인을 로드할 수 있습니다. 이러한 방식으로 로드된 플러그 인은 프롬프트 모드에서 에이전트를 사용 가능한 task(agent_type=...) 하위 에이전트 유형으로 등록할 수 있습니다. 즉, 플릿 모드가 플러그 인 제공 작업자 유형으로 디스패치할 수 있습니다.
이는 현재 문서화된 SDK 수준 등록 API가 아닌 런타임 수준 구성 패턴입니다. 플러그 인 디렉터리를 사용하여 Copilot CLI 런타임을 구성한 다음 SDK 클라이언트를 해당 런타임에 연결합니다. 플러그 인 하위 에이전트 유형을 등록하기 위한 네이티브 SDK 도우미는 나중에 추가될 수 있습니다.
개념적으로 플릿 프롬프트는 특정 작업자 유형을 요청할 수 있습니다.
Use task(agent_type="security-review") for each independent package.
Run the workers in parallel and summarize only high-confidence findings.
오케스트레이터가 안정적으로 선택할 수 있도록 플러그 인 제공 하위 에이전트 형식을 좁고 설명적으로 유지합니다.
모범 사례
- 플릿 모드를 시작하기 전에 작업을 독립 단위로 분해합니다.
- 할 일 간의 종속성을 최소화합니다. 종속성은 병렬 처리를 줄입니다.
- 각 할 일에 변하지 않는 고유 ID, 명확한 제목, 완전한 설명을 부여하세요.
- 각 하위 에이전트가 한 번에 정확히 하나의 할 일만 담당하도록 합니다.
- 진정한 병렬 작업에 백그라운드 하위 에이전트를 사용합니다.
- 직렬화된 단계 또는 유효성 검사 게이트에 동기 하위 에이전트 호출을 사용합니다.
- 각 하위 에이전트에 완전한 컨텍스트를 제공하세요. 하위 에이전트는 호출 간 상태를 유지하지 않습니다.
- 각 작업자 프롬프트에 파일 경로, 명령, 예상 출력 및 제약 조건을 포함합니다.
- 단일 백그라운드 하위 에이전트를 디스패치하지 마세요. 는 동기 호출을 선호하거나 여러 작업자를 병렬로 일괄 처리합니다.
- 부모 에이전트가 충돌을 명시적으로 조정하지 않는 한 겹치는 파일을 다른 작업자에게 할당하지 마세요.
- 모든 작업자가 변경된 내용, 변경 내용의 유효성을 검사하는 방법 및 차단된 상태를 보고하도록 요구합니다.
- 워커들이 작업을 마친 후 부모 에이전트가 통합된 결과를 확인하도록 합니다.
제한 사항 및 열린 질문
- 플릿 모드는 생성된 세션 RPC 바인딩을 통해 노출되며 여러 SDK에서 실험적으로 표시됩니다.
- SQL 할 일 패턴은 런타임 지침의 정식 조정 모델이지만 SDK 소비자를 위한 안정적인 확장성 계약인지 여부는 여전히 열려 있는 질문입니다.
subagentStart및subagentStop는 런타임 후크 이름이며, 이 분기는 전용 후크 콜백이 아니라 일반 세션 이벤트 스트림을 통해 하위 에이전트의 수명 주기를 SDK 사용자에게 노출합니다.- 플러그 인 하위 에이전트 등록은 런타임 계층
--plugin-dir에서 구성됩니다. 이 분기에서 SDK 수준 플러그 인 등록 도우미가 확인되지 않았습니다. session.fleet.start대한 Java 네이티브 형식 바인딩이 이 분기의 Java SDK 원본에서 찾을 수 없습니다.- 플릿 모드는 부모 에이전트 검토의 필요성을 제거하지 않습니다. 병렬 작업자는 오케스트레이터가 조정해야 하는 일관되지 않은 가정을 생성할 수 있습니다.