{"meta":{"title":"Sessions dans le cloud","intro":"Les sessions cloud exécutent les tâches Copilot sur l’infrastructure de calcul hébergée par GitHub via Mission Control. Utilisez-les lorsque votre application doit créer une session qui s'exécute à distance au lieu de démarrer une session CLI locale Copilot sur l'ordinateur de l'utilisateur ou votre serveur.","product":"GitHub Copilot","breadcrumbs":[{"href":"/fr/copilot","title":"GitHub Copilot"},{"href":"/fr/copilot/how-tos","title":"Procédures"},{"href":"/fr/copilot/how-tos/copilot-sdk","title":"Kit de développement logiciel (SDK) Copilot"},{"href":"/fr/copilot/how-tos/copilot-sdk/features","title":"Fonctionnalités"},{"href":"/fr/copilot/how-tos/copilot-sdk/features/cloud-sessions","title":"Sessions dans le cloud"}],"documentType":"article"},"body":"# Sessions dans le cloud\n\nLes sessions cloud exécutent les tâches Copilot sur l’infrastructure de calcul hébergée par GitHub via Mission Control. Utilisez-les lorsque votre application doit créer une session qui s'exécute à distance au lieu de démarrer une session CLI locale Copilot sur l'ordinateur de l'utilisateur ou votre serveur.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## Prerequisites\n\nAvant de créer une session cloud, assurez-vous :\n\n* L’utilisateur a accès à Copilot avec les droits d’accès à l’agent cloud.\n* La session peut s’authentifier auprès de GitHub, soit avec un jeton utilisateur, soit avec une identité Copilot CLI connectée.\n* Vous pouvez associer la session à un référentiel GitHub. Cela est facultatif dans le type du KIT de développement logiciel (SDK), mais recommandé pour que Mission Control et l’agent cloud disposent d’un contexte de référentiel.\n* Les stratégies d’organisation autorisent le contrôle à distance et l’affichage des sessions à partir de surfaces cloud.\n\n## Création d’une session cloud\n\nDéfinissez l’option create-session `cloud` pour créer une session cloud. Vous pouvez inclure des métadonnées de référentiel pour associer la session cloud à un référentiel 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### Allez\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## Envoi de la première invite\n\nLes sessions cloud s'initialisent en deux phases : `createSession` se résout dès que Mission Control a réservé une tâche, mais le Worker distant `copilot-agent` met une ou deux secondes supplémentaires à se connecter et à émettre `session.start`. Si vous appelez `session.send` avant cela, le `RemoteSession.send` du runtime génère une exception `\"Remote session is still starting\"`. Toutefois, le wrapper de schéma est de type fire-and-forget et **ignore silencieusement l'erreur** tout en renvoyant un nouveau `messageId` à votre code. L'invite est abandonnée sur le serveur et n'atteint jamais le Worker.\n\nPour envoyer de manière fiable, s’abonner aux événements **avant** d’envoyer et attendre le premier événement `session.start` dont la valeur de `producer` est `\"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\nQuelques remarques :\n\n* Définissez `streaming: true` sur `createSession` afin que le runtime génère des événements `assistant.message_delta`. Sans cela, le seul signal de l’assistant que vous obtenez est le final `assistant.message` , bien pour l’utilisation par lots, mais la conversation sera figée si vous affichez une interface utilisateur en direct. Consultez « [Événements de session de streaming](/fr/copilot/how-tos/copilot-sdk/features/streaming-events) ».\n* Seul le **premier**`session.send` est sensible à cette condition de concurrence. Les envois suivants sur la même session fonctionnent normalement, car le runtime conserve `hasSessionStarted` la valeur définie pour la durée de la session.\n* Appliquez un délai d’expiration (par exemple, 60 s) autour de la `ready` promesse afin qu’un provisionnement de Mission Control bloqué ne bloque pas votre application pour toujours.\n* Le même modèle fonctionne dans chaque langue du Kit de développement logiciel (SDK) : s’abonner à `session.start`, vérifier `producer === \"copilot-agent\"`, puis appeler `send`.\n\n## Accès à l’URL du contrôle de mission\n\nLes sessions cloud sont intrinsèquement distantes : une fois que le worker se connecte, Mission Control publie la session à `https://github.com/copilot/tasks/{sessionId}` et le runtime émet un `session.info` événement avec l’URL. Vous n’avez **pas** besoin d’appeler `remote.enable()` cette API uniquement pour promouvoir une session locale vers Mission Control.\n\nRécupérez l’URL en vous abonnant à `session.info` et en filtrant par `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\nL’événement se déclenche peu après `session.start`. Si votre moteur de rendu est monté une fois l'événement déjà déclenché, conservez l'URL avec l'enregistrement de session dans l'état de votre application et réhydratez-la lors du remontage ; le runtime ne réémet pas `session.info` de lui-même.\n\nPour obtenir le même comportement avec les sessions locales promues via `remote: true`, consultez [Sessions à distance](/fr/copilot/how-tos/copilot-sdk/features/remote-sessions).\n\n## Association de référentiels\n\nL’objet `cloud.repository` associe la session cloud à un référentiel GitHub :\n\n| Champ    | Obligatoire | Description                                                                                                                                                |\n| -------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `owner`  | Yes         | Propriétaire ou organisation du référentiel.                                                                                                               |\n| `name`   | Yes         | Nom du référentiel.                                                                                                                                        |\n| `branch` | No          | Branche à utiliser pour le contexte du référentiel. Omettez-le pour laisser le runtime choisir la branche par défaut ou le contexte de référentiel actuel. |\n\nL’association de référentiel est facultative dans le type du KIT de développement logiciel (SDK), mais incluez-la chaque fois que votre application connaît le référentiel cible. Il permet à Mission Control d’afficher la session dans le contexte approprié et de donner à l’agent cloud un point de départ plus clair.\n\nUtilisez `branch` quand le travail doit commencer à partir d’une branche spécifique. Si votre application crée des sessions à partir de pull requests, de flux de triage des tickets ou de workflows de déploiement, transmettez la branche correspondant à la tâche affichée à l’utilisateur.\n\n## Reprise d’une session cloud\n\nL’option `cloud` s’applique uniquement lors de la création d’une session. Pour reprendre une session cloud existante, utilisez l’API de reprise standard pour le langage sdk :\n\n```typescript\nconst session = await client.resumeSession(\"session-id\", {\n  onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n```\n\nNe transmettez plus `cloud` lors de la reprise. Les métadonnées de session enregistrées déterminent que la session est sauvegardée dans le cloud et reprend le chemin normal de reprise de session.\n\n## Politiques et droits de l’organisation\n\nLa création de session cloud peut échouer lorsque l’utilisateur ou l’organisation n’a pas droit à l’exécution de l’agent cloud ou lorsque les stratégies au niveau de l’organisation bloquent le flux. En particulier, les règles de sandbox cloud peuvent empêcher les clients de créer la tâche dans le cloud.\n\nLorsque cela se produit, le runtime signale une raison d’échec `\"policy_blocked\"` de la création de tâches cloud. Traitez-le comme un résultat d’autorisation ou de stratégie, et non comme une défaillance temporaire de l’infrastructure.\n\nDans TypeScript, vérifiez la raison avant de réessayer :\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\nDans les langages où les erreurs du Kit de développement logiciel (SDK) sont représentées différemment, inspectez la raison ou le code d’erreur exposés et gérez `\"policy_blocked\"` explicitement. Une nouvelle tentative sans modification de stratégie n’est pas censée réussir.\n\n## ID d’intégration et routage\n\nLes sessions cloud sont marquées avec un en-tête `Copilot-Integration-Id` dérivé de la variable d’environnement `GITHUB_COPILOT_INTEGRATION_ID`. Cet ID d’intégration est utilisé par Mission Control pour le routage, l’attribution et le comportement spécifique à l’intégration.\n\nPour obtenir des conseils sur le serveur multi-utilisateur et des détails complets de l’ID d’intégration, consultez [Multilocataire et déploiements de serveurs](/fr/copilot/how-tos/copilot-sdk/setup/multi-tenancy).\n\nMission Control achemine les sessions cloud créées par le SDK vers l'agent `copilot-developer-sandbox`. Le nom est un identifiant de routage interne pour l’agent du cloud et ne signifie pas que la session utilise le bac à sable Windows local.\n\n## Avancé: `COPILOT_MC_BASE_URL`\n\nPar défaut, le runtime déduit l’URL de base de Mission Control à partir de l’URL de l’API Copilot configurée. Définissez `COPILOT_MC_BASE_URL` uniquement lorsque vous devez remplacer le point de terminaison Mission Control.\n\nCela peut être nécessaire pour les déploiements de GitHub Enterprise Server. Confirmez la valeur et l’état de support corrects avec votre représentant GitHub avant de vous appuyer sur celui-ci en production.\n\n```shell\nCOPILOT_MC_BASE_URL=\"https://example.com/agents\"\n```\n\n## Sessions cloud et sessions distantes\n\n| Capacité                                           | Sessions à distance                              | Sessions dans le cloud            |\n| -------------------------------------------------- | ------------------------------------------------ | --------------------------------- |\n| Emplacement d’exécution                            | Ordinateur local ou votre serveur                | calcul hébergé par GitHub         |\n| Rôle De contrôle de mission                        | Partage une session locale sur GitHub web/mobile | Crée et route la session hébergée |\n| Option du Kit de développement logiciel (SDK       |                                                  |                                   |\n| `remote: true` sur le client ou la session         |                                                  |                                   |\n| `cloud: { ... }` lors de la création d’une session |                                                  |                                   |\n| Chemin de reprise                                  | Reprise standard                                 | Reprise standard                  |\n| Relation avec Windows Sandbox                      | Sans rapport                                     | Sans rapport                      |\n\nUtilisez des sessions à distance lorsque la session doit s’exécuter là où le runtime du SDK est déjà en cours d’exécution, mais également accessible à partir de Mission Control. Utilisez des sessions cloud quand la session doit s’exécuter sur GitHub calcul hébergé.\n\n## Résolution des problèmes\n\n| Symptôme                                                                                                                                | Cause la plus probable                                                                                | Que vérifier                                                                                                                                                     |\n| --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| La création d'une session cloud renvoie `\"policy_blocked\"`.                                                                             | La stratégie organisationnelle bloque le contrôle ou l’affichage à distance à partir de flux cloud    | Vérifier les stratégies d’organisation Copilot et les droits d’utilisateur                                                                                       |\n| Création de session sans contexte de dépôt                                                                                              |                                                                                                       |                                                                                                                                                                  |\n| `cloud.repository` a été omis                                                                                                           | Transmettez `owner`, `name`, et éventuellement `branch`                                               |                                                                                                                                                                  |\n| La reprise ignore une nouvelle option `cloud`.                                                                                          |                                                                                                       |                                                                                                                                                                  |\n| `cloud` s’applique uniquement aux nouvelles sessions                                                                                    | Reprendre la session existante normalement                                                            |                                                                                                                                                                  |\n| Confusion avec les paramètres de bac à sable                                                                                            | Windows Sandbox et les sessions cloud sont distincts                                                  | Ne pas utiliser `SANDBOX=true` pour l’exécution du cloud                                                                                                         |\n| `session.send` se résout avec un `messageId`, mais aucun événement `assistant.*` n'est émis et Mission Control n'affiche aucune invite. | Le session.send a été exécuté avant `session.start` du Worker distant ; le runtime a ignoré l'invite. | Attendez le premier événement `session.start` avec `producer === \"copilot-agent\"` avant d’envoyer. Voir [Envoi de la première invite](#sending-the-first-prompt) |\n| L’interface en temps réel ne se met jamais à jour, même si le worker cloud est en cours de traitement                                   |                                                                                                       |                                                                                                                                                                  |\n| `streaming` n’a pas été défini sur `createSession`, donc seule la finale `assistant.message` est émise                                  | Réglez `streaming: true` sur `createSession`, puis relancez                                           |                                                                                                                                                                  |\n| La session cloud fonctionne, mais aucune URL partageable n’apparaît dans votre interface utilisateur                                    | L’application n’a jamais été abonnée à `session.info` pour l’URL                                      | S’abonner à `session.info` et filtrer `infoType === \"remote\"`. Voir [Accéder à l’URL du contrôle de mission](#accessing-the-mission-control-url)                 |\n\n## Voir également :\n\n* [Sessions à distance](/fr/copilot/how-tos/copilot-sdk/features/remote-sessions) : partager des sessions hébergées localement via Mission Control\n* [Événements de session de streaming](/fr/copilot/how-tos/copilot-sdk/features/streaming-events): s’abonner aux `assistant.*` deltas pour le rendu d’interface utilisateur en direct\n* [Multilocataire et déploiements de serveurs](/fr/copilot/how-tos/copilot-sdk/setup/multi-tenancy) : ID d’intégration et modèles de déploiement de serveur\n* [Authentification](/fr/copilot/how-tos/copilot-sdk/auth) : configurer l’authentification GitHub pour les sessions sdk"}