Skip to main content

Servidor ACP da CLI do Copilot

Saiba mais sobre o o servidor do Protocolo do Cliente do Agente do CLI do GitHub Copilot.

Observação

O suporte à ACP no CLI do GitHub Copilot está em versão prévia pública e está sujeito a alterações.

Visão geral

O Protocolo de Cliente do Agente (ACP) é um protocolo que padroniza a comunicação entre clientes (como editores de código e IDEs) e agentes de codificação (como CLI do Copilot). Para obter mais detalhes sobre esse protocolo, consulte a introdução oficial.

Casos de uso

  •         **Integrações do IDE:** Incorpore suporte para Copilot em qualquer editor ou ambiente de desenvolvimento.
    
  •         **Pipelines de CI/CD:** Orquestrar tarefas de codificação autônomas em fluxos de trabalho automatizados.
    
  •         **Front-ends personalizados:** Crie interfaces especializadas para fluxos de trabalho de desenvolvedor específicos.
    
  •         **Sistemas de vários agentes:** Coordene Copilot com outros agentes de IA usando um protocolo padrão.
    

Iniciando o servidor ACP

CLI do GitHub Copilot pode ser iniciado como um servidor ACP usando o --acp flag. O servidor dá suporte a dois modos stdio e TCP.

Por padrão, ao fornecer o sinalizador --acp, o modo stdio será inferido. O --stdio sinalizador também pode ser fornecido para desambiguação.

copilot --acp --stdio

Modo TCP

Se o sinalizador --port for fornecido em combinação com o sinalizador --acp, o servidor será iniciado no modo TCP.

copilot --acp --port 3000

Integração com o servidor ACP

Há um ecossistema crescente de bibliotecas para interagir programaticamente com servidores ACP. Se CLI do GitHub Copilot estiver instalado e autenticado corretamente, o exemplo a seguir demonstrará o uso do cliente typescript para enviar um único prompt e imprimir a resposta de IA.

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;
});

Leitura adicional

  •         [Documentação oficial da ACP](https://agentclientprotocol.com/protocol/overview)