Skip to main content

Copilot CLI ACP 서버

GitHub Copilot 명령 줄 인터페이스 (CLI)의 에이전트 클라이언트 프로토콜 서버에 대해 알아봅니다.

이 문서의 내용

참고 항목

GitHub Copilot 명령 줄 인터페이스 (CLI)에서의 ACP 지원은 공개 미리 보기 단계에 있으며, 변경될 수 있습니다.

개요

ACP(에이전트 클라이언트 프로토콜)는 클라이언트(예: 코드 편집기 및 IDE)와 코딩 에이전트(예: 부조종사 CLI) 간의 통신을 표준화하는 프로토콜입니다. 이 프로토콜에 대한 자세한 내용은 공식 소개를 참조하세요.

사용 사례

  •         **IDE 통합:** 모든 편집기 또는 개발 환경에 Copilot 지원을 구축합니다.
    
  •         **CI/CD 파이프라인:** 자동화된 워크플로에서 에이전트 코딩 작업을 오케스트레이션합니다.
    
  •         **사용자 지정 프런트 엔드:** 특정 개발자 워크플로에 대한 특수 인터페이스를 만듭니다.
    
  •         **다중 에이전트 시스템:** 표준 프로토콜을 사용하여 Copilot를 다른 AI 에이전트들과 조정합니다.
    

ACP 서버 시작

GitHub Copilot 명령 줄 인터페이스 (CLI)은(는) --acp 플래그를 사용하여 ACP 서버로 시작할 수 있습니다. 서버는 두 가지 모드를 지원합니다stdio. TCP

기본적으로 플래그 --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)