{"meta":{"title":"Облачные сессии","intro":"Облачные сессии запускают работу Copilot на вычислениях, размещённых на GitHub, через Центр управления полётом. Используйте их, когда ваше приложение должно создавать удалённую сессию, а не запускать локальную CLI-сессию Copilot на компьютере пользователя или вашем сервере.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/how-tos","title":"Инструкции"},{"href":"/ru/copilot/how-tos/copilot-sdk","title":"Второй пилот SDK"},{"href":"/ru/copilot/how-tos/copilot-sdk/features","title":"Возможности"},{"href":"/ru/copilot/how-tos/copilot-sdk/features/cloud-sessions","title":"Облачные сессии"}],"documentType":"article"},"body":"# Облачные сессии\n\nОблачные сессии запускают работу Copilot на вычислениях, размещённых на GitHub, через Центр управления полётом. Используйте их, когда ваше приложение должно создавать удалённую сессию, а не запускать локальную CLI-сессию Copilot на компьютере пользователя или вашем сервере.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## Необходимые условия\n\nПеред созданием облачной сессии убедитесь:\n\n* Пользователь имеет доступ к Copilot с правом облачного агента.\n* Сессия может аутентифицироваться в GitHub либо с помощью пользовательского токена, либо с авторизованной идентификацией Copilot CLI.\n* Сессию можно связать с репозиторием GitHub. Это опционально для типа SDK, но рекомендуется для того, чтобы Центр управления полетами и облачный агент имели контекст репозитория.\n* Политики организации позволяют проводить удалённое управление и просмотр сессий с облачных поверхностей.\n\n## Создание облачной сессии\n\nНастройте опцию создания сессии `cloud` в облаке. Вы можете включить метаданные репозитория, чтобы связать облачную сессию с репозиторием GitHub.\n\n<!-- tabs:start -->\n\n### TypeScript\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nawait client.start();\n\nconst session = await client.createSession({\n  onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n  cloud: {\n    repository: {\n      owner: \"github\",\n      name: \"copilot-sdk\",\n      branch: \"main\",\n    },\n  },\n});\n```\n\n### Python\n\n```python\nfrom copilot import (\n    CloudSessionOptions,\n    CloudSessionRepository,\n    CopilotClient,\n    PermissionHandler,\n)\n\nclient = CopilotClient()\nawait client.start()\n\nsession = await client.create_session(\n    on_permission_request=PermissionHandler.approve_all,\n    cloud=CloudSessionOptions(\n        repository=CloudSessionRepository(\n            owner=\"github\",\n            name=\"copilot-sdk\",\n            branch=\"main\",\n        )\n    ),\n)\n```\n\n### Go\n\n```golang\nclient := copilot.NewClient(nil)\nif err := client.Start(ctx); err != nil {\n    return err\n}\n\nsession, err := client.CreateSession(ctx, &copilot.SessionConfig{\n    Cloud: &copilot.CloudSessionOptions{\n        Repository: &copilot.CloudSessionRepository{\n            Owner:  \"github\",\n            Name:   \"copilot-sdk\",\n            Branch: \"main\",\n        },\n    },\n    OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {\n        return &rpc.PermissionDecisionApproveOnce{}, nil\n    },\n})\n_ = session\n```\n\n### .NET\n\n```csharp\nawait using var client = new CopilotClient();\n\nvar session = await client.CreateSessionAsync(new SessionConfig\n{\n    Cloud = new CloudSessionOptions\n    {\n        Repository = new CloudSessionRepository\n        {\n            Owner = \"github\",\n            Name = \"copilot-sdk\",\n            Branch = \"main\",\n        },\n    },\n    OnPermissionRequest = (req, inv) =>\n        Task.FromResult(PermissionDecision.ApproveOnce()),\n});\n```\n\n### Java\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\n\ntry (var client = new CopilotClient()) {\n    client.start().get();\n\n    var session = client.createSession(\n        new SessionConfig()\n            .setCloud(new CloudSessionOptions()\n                .setRepository(new CloudSessionRepository()\n                    .setOwner(\"github\")\n                    .setName(\"copilot-sdk\")\n                    .setBranch(\"main\")))\n            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n}\n```\n\n### Rust\n\n```rust\nuse std::sync::Arc;\nuse github_copilot_sdk::{CloudSessionOptions, CloudSessionRepository, SessionConfig};\nuse github_copilot_sdk::handler::ApproveAllHandler;\n\nlet session = client.create_session(\n    SessionConfig::default()\n        .with_cloud(CloudSessionOptions::with_repository(\n            CloudSessionRepository::new(\"github\", \"copilot-sdk\").with_branch(\"main\"),\n        ))\n        .with_permission_handler(Arc::new(ApproveAllHandler)),\n).await?;\n```\n\n<!-- tabs:end -->\n\n## Отправка первого запроса\n\nОблачные сессии инициализируются в две фазы: `createSession` разрешаются сразу после того, как Центр управления полётом зарезервировал задачу, но удалённый `copilot-agent` сотрудник подключается ещё секунду или две, чтобы подключиться и излучить `session.start`. Если звонить `session.send` раньше, время выполнения `RemoteSession.send` срабатывает `\"Remote session is still starting\"` — но обёртка схемы работает с режимом «отстрелить и забыть» и **молча проглатывает ошибку** , при этом возвращая свежую `messageId` версию в ваш код. Запрос сбрасывается на сервере и никогда не доходит до работника.\n\nЧтобы отправлять надёжно, подпишитесь **на события перед** отправкой и ждите первое `session.start` событие, которое`producer`:`\"copilot-agent\"`\n\n<!-- docs-validate: skip -->\n\n```typescript\nimport { CopilotClient, type CopilotSession } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nawait client.start();\n\nconst session: CopilotSession = await client.createSession({\n  streaming: true, // required for assistant.message_delta to fire\n  cloud: { repository: { owner: \"github\", name: \"copilot-sdk\" } },\n  onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\n// Subscribe BEFORE sending so you don't miss the start event.\nconst ready = new Promise<void>((resolve) => {\n  const off = session.on(\"session.start\", (event) => {\n    if (event.data?.producer === \"copilot-agent\") {\n      off();\n      resolve();\n    }\n  });\n});\n\nawait ready;\nawait session.send({ prompt: \"Summarize the README\" });\n```\n\nНесколько примечаний:\n\n* Сделайте `streaming: true` так `createSession` , чтобы время исполнения `assistant.message_delta` событий. Без него единственный сигнал помощника — это финальный `assistant.message` сигнал — это нормально для пакетного использования, но чат будет выглядеть застывшим, если вы рендерите живой интерфейс. См [. раздел AUTOTITLE](/ru/copilot/how-tos/copilot-sdk/features/streaming-events).\n* Только **первая**`session.send` чувствительна к этой расе. Последующие отправки на одну и ту же сессию работают нормально, потому что время выполнения остаётся `hasSessionStarted` установленным на протяжении всей сессии.\n* Введите тайм-аут (например, 60 секунд) вокруг обещания `ready` , чтобы зависшая настройка Центра управления полётом не зависала в приложении навсегда.\n* Та же схема работает во всех SDK-языках — подписаться на `session.start`, проверить `producer === \"copilot-agent\"`, затем вызвать `send`.\n\n## Доступ к URL Управления полётом\n\nОблачные сессии по своей сути удалены: после подключения сотрудника Центр управления публикует сессию на Mission Control `https://github.com/copilot/tasks/{sessionId}` , и время выполнения генерирует `session.info` событие с URL. Вам **не** нужно звонить `remote.enable()` — этот API предназначен только для продвижения локальной сессии в Центр управления полётами.\n\nЗахватите URL, подписавшись на `session.info` и отфильтровав по `infoType: \"remote\"`:\n\n<!-- docs-validate: skip -->\n\n```typescript\nsession.on(\"session.info\", (event) => {\n  if (event.data?.infoType === \"remote\" && event.data.url) {\n    console.log(\"Open from web or mobile:\", event.data.url);\n    // For example, surface in your UI as a shareable link or QR code.\n  }\n});\n```\n\nСобытие запускается вскоре после `session.start`этого. Если ваш рендерер монтируется после того, как событие уже сработало, сохраняйте URL вместе с записью сессии в состоянии приложения и восстанавливайтесь при повторном подключении — время выполнения не `session.info` повторяет работу самостоятельно.\n\nО той же проводке в локальных сессиях, продвигаемых через `remote: true`, см. [AUTOTITLE.](/ru/copilot/how-tos/copilot-sdk/features/remote-sessions)\n\n## Ассоциация хранилищ\n\nОбъект `cloud.repository` связывает облачную сессию с репозиторием GitHub:\n\n| Поле     | Обязательный | Description                                                                                                                       |\n| -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------- |\n| `owner`  | Да           | Владелец репозитория или организация.                                                                                             |\n| `name`   | Да           | Имя репозитория.                                                                                                                  |\n| `branch` | Нет          | Ветка для контекста репозитория. Опустите его, чтобы время выполнения выбрало стандартную ветку или текущий контекст репозитория. |\n\nАссоциация репозитория необязательна в типе SDK, но включайте её, когда ваше приложение знает целевой репозиторий. Это помогает Центру управления миссией отображать сессию в нужном контексте и даёт облачному агенту более чёткую отправную точку.\n\nИспользуйте `branch` тогда, когда работа должна начинаться с определённой ветви. Если ваше приложение создаёт сессии из pull request, процессов сортировки или процессов развертывания, передайте ветку, которая соответствует видимой задаче.\n\n## Возобновление облачной сессии\n\nЭта `cloud` опция применяется только при создании новой сессии. Чтобы возобновить существующую облачную сессию, используйте стандартный API resume для языка SDK:\n\n```typescript\nconst session = await client.resumeSession(\"session-id\", {\n  onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n```\n\nНе проходите `cloud` снова в резюме. Метаданные сохранённой сессии определяют, что сессия поддерживается облаком, и возобновление следует обычному пути возобновления сессии.\n\n## Политики и права организации\n\nСоздание облачных сессий может провалиться, если пользователь или организация не имеют права на выполнение облачных агентов или если политики на уровне организации блокируют этот поток. В частности, политики для облачных песочниц могут мешать клиентам создавать облачную задачу.\n\nКогда это происходит, среда выполнения сообщает `\"policy_blocked\"` о причине отказа создания облачных задач. Рассматривайте это как разрешение или результат политики, а не как временный сбой инфраструктуры.\n\nВ TypeScript проверьте причину перед повторной попыткой:\n\n```typescript\ntry {\n  await client.createSession({ cloud: { repository } });\n} catch (error) {\n  if ((error as { reason?: string }).reason === \"policy_blocked\") {\n    // Show an admin-facing message or link to org policy settings.\n  }\n  throw error;\n}\n```\n\nВ языках, где ошибки SDK представлены по-разному, проверьте поверхностную причину ошибки или код и обрабатывайте `\"policy_blocked\"` её явно. Ожидается, что повторная попытка без изменения политики не принесёт успеха.\n\n## Идентификатор интеграции и маршрутизация\n\nОблачные сессии имеют заголовок `Copilot-Integration-Id`, полученный из переменной среды `GITHUB_COPILOT_INTEGRATION_ID`. Этот идентификатор интеграции используется Центром управления полётами для маршрутизации, атрибуции и поведения, специфичного для интеграции.\n\nДля рекомендаций по многопользовательскому серверу и полной информации об идентификаторе интеграции см. [раздел AUTOTITLE](/ru/copilot/how-tos/copilot-sdk/setup/multi-tenancy).\n\nЦентр управления полётами направляет облачные сессии, созданные SDK, к `copilot-developer-sandbox` агентному слагу. Название является внутренним маршрутизатором для облачного агента и не означает, что сессия использует локальную песочницу Windows.\n\n## Продвинутые программы: `COPILOT_MC_BASE_URL`\n\nПо умолчанию среда выполнения выводит базовый URL Управления полётами из настроенного URL API Copilot. Устанавливайте `COPILOT_MC_BASE_URL` только тогда, когда нужно переобойти конечную точку управления полётами.\n\nЭто может потребоваться для развертывания GitHub Enterprise Server. Проверьте правильное значение и статус поддержки с вашим представителем GitHub, прежде чем использовать это в продакшене.\n\n```shell\nCOPILOT_MC_BASE_URL=\"https://example.com/agents\"\n```\n\n## Облачные сессии против удалённых сессий\n\n| Функциональность                     | Удалённые сессии                                    | Облачные сессии                             |\n| ------------------------------------ | --------------------------------------------------- | ------------------------------------------- |\n| Место выполнения                     | Локальный компьютер или ваш сервер                  | Вычисления, размещённые на GitHub           |\n| Роль в центре управления полётами    | Обменивается локальной сессией на GitHub web/mobile | Создаёт и маршрутизирует размещённую сессию |\n| Опция SDK                            |                                                     |                                             |\n| `remote: true` на клиенте или сессии |                                                     |                                             |\n| `cloud: { ... }` На сессии создания  |                                                     |                                             |\n| Путь резюме                          | Стандартное резюме                                  | Стандартное резюме                          |\n| Отношение песочницы Windows          | Не по теме.                                         | Не по теме.                                 |\n\nИспользуйте удалённые сессии, когда сессия должна выполняться там, где SDK уже работает, но при этом быть доступной из Центра управления. Используйте облачные сессии, когда сессия должна выполняться на вычислениях, размещённых на GitHub.\n\n## Troubleshooting\n\n| Симптом                                                                                                                                    | Вероятно, причина                                                                                    | Что проверить                                                                                                                                   |\n| ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |\n| Возвращение создания облачных сессий `\"policy_blocked\"`                                                                                    | Политика организации блокирует удалённое управление или просмотр из облачных потоков                 | Проверьте политики org Copilot и права пользователей                                                                                            |\n| Сессия создаётся без контекста репозитория                                                                                                 |                                                                                                      |                                                                                                                                                 |\n| `cloud.repository` был опущен                                                                                                              | Pass `owner`, `name`, и по желанию `branch`                                                          |                                                                                                                                                 |\n| Резюме игнорирует новый `cloud` вариант                                                                                                    |                                                                                                      |                                                                                                                                                 |\n| `cloud` Применяется только к новым сессиям                                                                                                 | Возобновить существующую сессию в обычном режиме                                                     |                                                                                                                                                 |\n| Путаница с настройками песочницы                                                                                                           | Windows песочница и облачные сессии — это отдельные                                                  | Не используйте `SANDBOX=true` для облачного выполнения                                                                                          |\n| `session.send` разрешается с a `messageId` , но без `assistant.*` событий, срабатывает, и Центр управления полётом не показывает подсказки | Session.send мчался впереди `session.start` удалённого сотрудника; время выполнения поглотило запрос | Ждите первого `session.start` события `producer === \"copilot-agent\"` перед отправкой. См. [Отправка первого запроса](#sending-the-first-prompt) |\n| Живой интерфейс никогда не обновляется, даже когда облачный работник обрабатывает процесс                                                  |                                                                                                      |                                                                                                                                                 |\n| `streaming` не был установлен на `createSession`, поэтому выпускается только финальный `assistant.message` сигнал                          | Запусти `streaming: true``createSession` и перезапусти                                               |                                                                                                                                                 |\n| Облачная сессия работает, но в вашем интерфейсе не отображается общий URL                                                                  | Приложение никогда не подписывалось `session.info` на URL                                            | Подписывайтесь и `session.info` фильтруйте `infoType === \"remote\"`. См. [Доступ к URL Управления полётом](#accessing-the-mission-control-url)   |\n\n## См. также\n\n* [Удалённые сессии](/ru/copilot/how-tos/copilot-sdk/features/remote-sessions): делиться локально размещёнными сессиями через Центр управления полётами\n* [АВТОТИТРЫ](/ru/copilot/how-tos/copilot-sdk/features/streaming-events): подписывайтесь на `assistant.*` дельты для живого рендеринга UI\n* [Мультиарендные и серверные развертывания](/ru/copilot/how-tos/copilot-sdk/setup/multi-tenancy): идентификаторы интеграции и шаблоны развертывания серверов\n* [Проверка подлинности](/ru/copilot/how-tos/copilot-sdk/auth): настраивать GitHub аутентификацию для сессий SDK"}