{"meta":{"title":"Copilot CLI ACP сервер","intro":"Узнайте о GitHub Copilot CLIсервере протокола Agent Client от '.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/reference","title":"Справочные материалы"},{"href":"/ru/copilot/reference/copilot-cli-reference","title":"Ссылка Copilot CLI"},{"href":"/ru/copilot/reference/copilot-cli-reference/acp-server","title":"ACP-сервер"}],"documentType":"article"},"body":"# Copilot CLI ACP сервер\n\nУзнайте о GitHub Copilot CLIсервере протокола Agent Client от '.\n\n> \\[!NOTE]\n> Поддержка ACP в GitHub Copilot CLI системе Публичный предварительный просмотр и может измениться.\n\n## Обзор\n\nПротокол агента-клиента (ACP) — это протокол, который стандартизирует коммуникацию между клиентами (такими как редакторы кода и IDE) и агентами (например Copilot CLI, ). Для получения дополнительной информации об этом протоколе см. [официальное введение](https://agentclientprotocol.com/get-started/introduction).\n\n## Случаи использования\n\n* **Интеграции IDE:** Встраивайте Copilot поддержку в любой редактор или среду разработки.\n* **CI/CD pipelines:** Оркестрирование задач агентного кодирования в автоматизированных рабочих процессах.\n* **Кастомные фронтенды:** Создавайте специализированные интерфейсы для конкретных рабочих процессов разработчиков.\n* **Многоагентные системы:** Координируйте Copilot действия с другими агентами ИИ по стандартному протоколу.\n\n## Запуск сервера ACP\n\n`--acp` Используйте параметр `copilot` команды, чтобы запустить сервер ACP интерфейса командной строки. Можно указать режим транспорта с `--stdio` помощью параметров или `--port` параметров. Если режим транспорта не указан, сервер по умолчанию использует режим stdio.\n\nРежим ACP позволяет сеансам с настроенным поставщиком собственных ключей (BYOK) (`COPILOT_PROVIDER_*` переменными среды) выполняться без GitHub входа, совпадая с поведением /интерактивным `-p`режимом.\n\n### Параметры, применяемые к каждому сеансу\n\nЗапрос ACP `session/new` позволяет клиенту задать несколько параметров сеанса, таких как рабочий каталог и серверы MCP. Он не содержит параметров фильтрации инструментов или причин. Чтобы настроить эти параметры, передайте соответствующие параметры при **запуске сервера**. Сервер хранит значения и применяет их в качестве начальной конфигурации для каждого сеанса, который он создает или загружает, для любого клиента, который подключается. Подключающийся клиент не выбирает эти значения, независимо от того, кто запускает сервер.\n\n| Параметр сервера                             | Принятое значение                                      | Влияние на каждый сеанс                                 |\n| -------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------- |\n| `--available-tools=TOOL ...`                 | Кавычек, разделенный запятыми список имен инструментов | Сеанс может использовать только перечисленные средства. |\n| `--excluded-tools=TOOL ...`                  | Кавычек, разделенный запятыми список имен инструментов | Перечисленные средства удаляются из сеанса.             |\n| `--effort=LEVEL`, `--reasoning-effort=LEVEL` |                                                        |                                                         |\n| `low`, `medium`, `high`, `xhigh` или `max`   | Задает начальную причину сеанса.                       |                                                         |\n\nНапример, эта команда запускает сервер, сеансы которого используют максимальное усилие по поводу и предоставляют только `bash` те и `view` средства:\n\n```bash\ncopilot --acp --port 3000 --effort=max --available-tools=\"bash,view\"\n```\n\nКаждый сеанс подключенного клиента открывается для этого сервера, наследуя эти параметры. Так как значения фиксируются при запуске сервера, клиент не может изменять их на сеанс.`session/new`\n\n### Режим stdio\n\nРежим stdio по умолчанию выводится при запуске сервера ACP. Вы также можете использовать `--stdio` параметр для диамбигуации.\n\n```bash\ncopilot --acp --stdio\n```\n\n### Режим TCP\n\nЕсли параметр `--port` предоставляется в сочетании с параметром `--acp` , сервер запускается в режиме TCP.\n\n```bash\ncopilot --acp --port 3000\n```\n\n### Выбор между stdio и TCP\n\nОба режима транспорта несут одни и те же сообщения ACP, закодированные в формате JSON с разделителями новой строки (NDJSON). Они отличаются только тем, как клиент подключается к серверу и как управляется жизненным циклом сервера. Два режима являются взаимоисключающими: передача обоих `--stdio` и `--port` отклонений.\n\n| Аспект                          | Режим stdio                                                                                                                                                 | Режим TCP                                                                                                                                                    |\n| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| **Как клиент подключается**     | Клиент запускается `copilot --acp` как дочерний процесс и обменивается сообщениями по стандартным входным и выходным данным процесса.                       | Сервер открывает прослушиватель TCP, к которому клиенты подключаются через сетевой сокет. По умолчанию он привязывается к адресу `127.0.0.1`обратного цикла. |\n| **Количество клиентов**         | Один клиент — процесс, который породил сервер и владеет каналом.                                                                                            | Прослушиватель принимает подключения сокетов, каждый из которых обрабатывается в качестве собственного подключения агента.                                   |\n| **Жизненный цикл**              | Привязан к родительскому процессу. Когда входной поток закрывается , так как родительский выход или закрывает канал, сервер завершает работу автоматически. | Независимо от одного клиента. Сервер продолжает прослушивать порт, пока он не будет остановлен, например с <kbd>помощью CTRL</kbd>+<kbd>C</kbd>.             |\n| **Стандартные выходные данные** | Зарезервировано для потока протокола NDJSON, поэтому его нельзя использовать для журналов или другого текста.                                               | Бесплатно для другого использования, так как трафик протокола перемещается по сокету.                                                                        |\n\nКогда следует использовать каждый режим:\n\n* Используйте **режим stdio** , когда редактор, интегрированная среда разработки или скрипты возникают Copilot CLI непосредственно в качестве подпроцесса. Это по умолчанию и рекомендуемая настройка для интеграции интегрированной среды разработки, так как транспорт устанавливается автоматически при запуске процесса и отключается при завершении работы.\n* Используйте **режим TCP** , когда клиенту нужно связаться с сервером через сокет вместо канала, например из отдельного процесса или контейнера или при подключении к более длительному серверу на известном порту.\n\n## Пример: интеграция с сервером ACP\n\nВ следующем примере используется клиентское приложение, которое взаимодействует Copilot с GitHub Copilot CLIсервером ACP. Он запускает сервер ACP в режиме stdio, открывает сеанс, запрашивает ввод запроса, отправляет его и выводит потоковый ответ.\n\nСуществует растущая экосистема библиотек для программного взаимодействия с серверами ACP. В этом примере используется [библиотека ACP TypeScript](https://agentclientprotocol.com/libraries/typescript).\n\nЧтобы запустить этот пример, вам потребуется следующие зависимости:\n\n* [Node.js](https://nodejs.org) версии 18 или более поздней.\n* GitHub Copilot CLI, установленный и прошедший проверку подлинности с GitHub помощью поставщика BYOK (см. раздел [\"Запуск сервера ACP](#starting-the-acp-server)\").\n* Пакет `@agentclientprotocol/sdk` , предоставляющий библиотеку ACP TypeScript. Установите его, выполнив команду `npm install @agentclientprotocol/sdk`.\n\n```typescript copy\nimport * as acp from \"@agentclientprotocol/sdk\";\nimport { spawn } from \"node:child_process\";\nimport { Readable, Writable } from \"node:stream\";\nimport * as readline from \"node:readline/promises\";\n\nasync function main() {\n  const executable = process.env.COPILOT_CLI_PATH ?? \"copilot\";\n\n  // ACP uses standard input/output (stdin/stdout) for transport; we pipe these for the NDJSON stream.\n  const copilotProcess = spawn(executable, [\"--acp\", \"--stdio\"], {\n    stdio: [\"pipe\", \"pipe\", \"inherit\"],\n  });\n\n  if (!copilotProcess.stdin || !copilotProcess.stdout) {\n    throw new Error(\"Failed to start Copilot ACP process with piped stdio.\");\n  }\n\n  // Create ACP streams (NDJSON over stdio)\n  const output = Writable.toWeb(copilotProcess.stdin) as WritableStream<Uint8Array>;\n  const input = Readable.toWeb(copilotProcess.stdout) as ReadableStream<Uint8Array>;\n  const stream = acp.ndJsonStream(output, input);\n\n  const client: acp.Client = {\n    async requestPermission(params) {\n      // This example should not trigger tool calls; if it does, refuse.\n      return { outcome: { outcome: \"cancelled\" } };\n    },\n\n    async sessionUpdate(params) {\n      const update = params.update;\n\n      if (update.sessionUpdate === \"agent_message_chunk\" && update.content.type === \"text\") {\n        process.stdout.write(update.content.text);\n      }\n    },\n  };\n\n  const connection = new acp.ClientSideConnection((_agent) => client, stream);\n\n  await connection.initialize({\n    protocolVersion: acp.PROTOCOL_VERSION,\n    clientCapabilities: {},\n  });\n\n  const sessionResult = await connection.newSession({\n    cwd: process.cwd(),\n    mcpServers: [],\n  });\n\n  process.stdout.write(\"Session started!\\n\");\n\n  // Ask the user to enter a prompt instead of using a hard-coded one.\n  const rl = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout,\n  });\n  const promptText = await rl.question(\"Enter a prompt: \");\n  rl.close();\n\n  const promptResult = await connection.prompt({\n    sessionId: sessionResult.sessionId,\n    prompt: [{ type: \"text\", text: promptText }],\n  });\n\n  process.stdout.write(\"\\n\");\n\n  if (promptResult.stopReason !== \"end_turn\") {\n    process.stderr.write(`Prompt finished with stopReason=${promptResult.stopReason}\\n`);\n  }\n\n  // Best-effort cleanup\n  copilotProcess.stdin.end();\n  copilotProcess.kill(\"SIGTERM\");\n  await new Promise<void>((resolve) => {\n    copilotProcess.once(\"exit\", () => resolve());\n    setTimeout(() => resolve(), 2000);\n  });\n}\n\nmain().catch((error) => {\n  console.error(error);\n  process.exitCode = 1;\n});\n```\n\nЧтобы выполнить пример, выполните следующие действия:\n\n1. Сохраните приведенный выше код в файл с именем `acp-client.ts`.\n2. Запустите файл с `npx tsx`файлом, с помощью которого выполняется TypeScript напрямую без отдельного шага сборки:\n\n   ```bash\n   npx tsx acp-client.ts\n   ```\n\n## Использование команд косой черты\n\nGitHub Copilot CLIВстроенные команды косой черты могут выполняться по ACP. Чтобы вызвать его, отправьте его как обычный запрос, текст которого является командой, переданный в виде одного блока текстового содержимого, например `/context` или `/session info`. Сервер распознает команду и запускает ее напрямую: информационные команды, такие как или `/usage` возвращающие их выходные данные без вызова модели, а команды действий, такие как `/context``/plan` или `/review` запуск соответствующей задачи агента. В любом случае текст команды не отправляется в модель как вопрос.\n\n### Обнаружение доступных команд\n\nСервер объявляет команды, поддерживаемые с помощью стандартного уведомления сеанса ACP `available_commands_update` . Он отправляется после создания или загрузки сеанса, а также при каждом изменении набора, например при завершении загрузки навыков. Этот объявленный список является авторитетным, всегда текущим набором команд, которые можно запускать по ACP, и клиенты обычно отображают его в меню команд.\n\nОбъявленный список содержит следующее:\n\n* **Встроенные команды**, такие как `/compact`, `/context``/usage``/env``/model``/mcp``/plan`, `/review``/research``/session`и .`/rename`\n* **Включено, неизменяемые пользователем навыки**, которые отображаются в виде `/SKILL-NAME` команд.\n\nКоманды, которые сам клиент регистрирует, не объявляются обратно в него.\n\n### Доступ к списку из клиента\n\nТак как список поступает как уведомление, а не в ответ на запрос, нет метода получения по запросу. Клиент обращается к нему, обрабатывая `session/update` уведомление и реагируя на обновления, тип которых имеет тип `available_commands_update`. Каждая запись имеет значение `name` (без начальной косой черты), а `description`также необязательный элемент `input.hint` , описывающий аргументы команды. Уведомление отправляется повторно всякий раз при изменении набора, поэтому следует рассматривать каждую из них как полную замену любого кэшированного списка.\n\n`sessionUpdate` Следующий обработчик записывает объявленные команды, расширяя `client` объект из примера, показанного ранее.\n\n```typescript copy\n// Track the latest advertised commands for the session.\nlet availableCommands: acp.AvailableCommand[] = [];\n\nconst client: acp.Client = {\n  async sessionUpdate(params) {\n    const update = params.update;\n\n    if (update.sessionUpdate === \"available_commands_update\") {\n      // This notification is a full snapshot—replace any cached list.\n      availableCommands = update.availableCommands;\n      for (const command of availableCommands) {\n        // command.name has no leading slash; invoke it by sending \"/<name>\" as a prompt.\n        console.log(`/${command.name} — ${command.description}`);\n      }\n      return;\n    }\n\n    // ...handle other updates, such as agent_message_chunk\n  },\n\n  // ...other client methods, such as requestPermission\n};\n```\n\nЧтобы выполнить одну из объявленных команд, отправьте его имя в виде запроса в одном блоке текстового содержимого( например, `{ type: \"text\", text: \"/context\" }`как описано в [разделе \"Использование команд косой черты](#using-slash-commands)\".\n\n### Команды, которые нельзя использовать для ACP\n\nКоманды косой черты, зависящие от интерактивного интерфейса терминала, не обрабатываются сервером ACP. Сюда входят команды, которые открывают средство выбора, диалоговое окно или полноэкранное представление, например `/diff`, `/resume`, `/theme`, `/settings`, `/login`, `/help`и `/tasks``/undo`. Как правило, если команда не отображается в `available_commands_update` списке, она не будет выполняться по ACP: сервер обрабатывает текст как обычный запрос и пересылает его в модель вместо выполнения.\n\nТак как у клиентов ACP нет интерактивных средства выбора, встроенная команда, которая обычно открывает подменю, возвращает параметры в виде текста. Предоставьте подкоманда явным образом, чтобы получить прямой результат, например, или `/session info` вместо того, `/mcp list` чтобы `/session``/mcp` или самостоятельно.\n\nПолный список команд косой черты см Copilot CLI. в разделе [Справочник команды GitHub Copilot CLI](/ru/copilot/reference/copilot-cli-reference/cli-command-reference#slash-commands-in-the-interactive-interface).\n\n## Дополнительные материалы\n\n* [Официальная документация ACP](https://agentclientprotocol.com/protocol/overview)"}