참고 항목
GitHub Copilot 명령 줄 인터페이스 (CLI)에서의 ACP 지원은 공개 미리 보기 단계에 있으며, 변경될 수 있습니다.
개요
ACP(에이전트 클라이언트 프로토콜)는 클라이언트(예: 코드 편집기 및 IDE)와 코딩 에이전트(예: 부조종사 CLI) 간의 통신을 표준화하는 프로토콜입니다. 이 프로토콜에 대한 자세한 내용은 공식 소개를 참조하세요.
사용 사례
-
**IDE 통합:** 모든 편집기 또는 개발 환경에 Copilot 지원을 구축합니다. -
**CI/CD 파이프라인:** 자동화된 워크플로에서 에이전트 코딩 작업을 오케스트레이션합니다. -
**사용자 지정 프런트 엔드:** 특정 개발자 워크플로에 대한 특수 인터페이스를 만듭니다. -
**다중 에이전트 시스템:** 표준 프로토콜을 사용하여 Copilot를 다른 AI 에이전트들과 조정합니다.
ACP 서버 시작
GitHub Copilot 명령 줄 인터페이스 (CLI)은(는) --acp 플래그를 사용하여 ACP 서버로 시작할 수 있습니다. 서버는 두 가지 모드를 지원합니다stdio. TCP
stdio 모드(IDE 통합에 권장됨)
기본적으로 플래그 --acp를 제공하면 모드 stdio가 유추됩니다.
--stdio 명확성을 위해 플래그를 제공할 수도 있습니다.
copilot --acp --stdio
TCP 모드
플래그가 --port 플래그와 --acp 함께 제공되면 서버가 TCP 모드에서 시작됩니다.
copilot --acp --port 3000
ACP 서버와 통합
ACP 서버와 프로그래밍 방식으로 상호 작용하는 라이브러리 에코시스템이 증가하고 있습니다. GitHub Copilot 명령 줄 인터페이스 (CLI)이 올바르게 설치되고 인증된 경우 다음 예제에서는 typescript 클라이언트를 사용하여 단일 프롬프트를 보내고 AI 응답을 출력하는 방법을 보여 줍니다.
import * as acp from "@agentclientprotocol/sdk";
import { spawn } from "node:child_process";
import { Readable, Writable } from "node:stream";
async function main() {
const executable = process.env.COPILOT_CLI_PATH ?? "copilot";
// ACP uses standard input/output (stdin/stdout) for transport; we pipe these for the NDJSON stream.
const copilotProcess = spawn(executable, ["--acp", "--stdio"], {
stdio: ["pipe", "pipe", "inherit"],
});
if (!copilotProcess.stdin || !copilotProcess.stdout) {
throw new Error("Failed to start Copilot ACP process with piped stdio.");
}
// Create ACP streams (NDJSON over stdio)
const output = Writable.toWeb(copilotProcess.stdin) as WritableStream<Uint8Array>;
const input = Readable.toWeb(copilotProcess.stdout) as ReadableStream<Uint8Array>;
const stream = acp.ndJsonStream(output, input);
const client: acp.Client = {
async requestPermission(params) {
// This example should not trigger tool calls; if it does, refuse.
return { outcome: { outcome: "cancelled" } };
},
async sessionUpdate(params) {
const update = params.update;
if (update.sessionUpdate === "agent_message_chunk" && update.content.type === "text") {
process.stdout.write(update.content.text);
}
},
};
const connection = new acp.ClientSideConnection((_agent) => client, stream);
await connection.initialize({
protocolVersion: acp.PROTOCOL_VERSION,
clientCapabilities: {},
});
const sessionResult = await connection.newSession({
cwd: process.cwd(),
mcpServers: [],
});
process.stdout.write("Session started!\n");
const promptText = "Hello ACP Server!";
process.stdout.write(`Sending prompt: '${promptText}'\n`);
const promptResult = await connection.prompt({
sessionId: sessionResult.sessionId,
prompt: [{ type: "text", text: promptText }],
});
process.stdout.write("\n");
if (promptResult.stopReason !== "end_turn") {
process.stderr.write(`Prompt finished with stopReason=${promptResult.stopReason}\n`);
}
// Best-effort cleanup
copilotProcess.stdin.end();
copilotProcess.kill("SIGTERM");
await new Promise<void>((resolve) => {
copilotProcess.once("exit", () => resolve());
setTimeout(() => resolve(), 2000);
});
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
추가 읽기
-
[공식 ACP 설명서](https://agentclientprotocol.com/protocol/overview)