# Configuration des services principaux

Utilisez le SDK Copilot dans des applications serveur — API, backends web, microservices et processus d’arrière-plan. L’interface CLI s’exécute en tant que serveur sans tête auquel votre code principal se connecte sur le réseau.

<!-- markdownlint-disable GHD046 GHD005 -->

<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

**Meilleur pour :** Back-ends d’application web, services API, outils internes, intégrations CI/CD, n’importe quelle charge de travail côté serveur.

## Fonctionnement

Au lieu du SDK qui génère un processus enfant CLI, vous exécutez l’interface CLI indépendamment en **mode serveur sans tête**. Votre back-end se connecte à celui-ci via TCP à l’aide de l’option `Connection` (`URIConnection`).

![Diagramme : Organigramme montrant le processus décrit.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-0.png)

**Principales caractéristiques :**

* L’interface CLI s’exécute en tant que processus de serveur persistant (non généré par requête)
* Le SDK se connecte via TCP : l’interface CLI et l’application peuvent s’exécuter dans différents conteneurs
* Plusieurs clients du Kit de développement logiciel (SDK) peuvent partager un serveur CLI
* Fonctionne avec n’importe quelle méthode d’authentification (GitHub jetons, env vars, BYOK)

Pour le mode serveur multi-utilisateur, configurez les clients sdk avec `mode: "empty"`, transmettez les informations d’identification utilisateur par session et autorisez explicitement les outils pour chaque session. Consultez [Multilocataire et déploiements de serveurs](/fr/copilot/how-tos/copilot-sdk/setup/multi-tenancy) pour obtenir le modèle complet.

## Architecture : gérée automatiquement par rapport à l’interface CLI externe

![Diagramme : Organigramme montrant le processus décrit.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-1.png)

## Étape 1 : démarrer l’interface CLI en mode sans tête

Exécutez l’interface CLI en tant que serveur en arrière-plan :

```bash
# Start with a specific port
copilot --headless --port 4321

# Or let it pick a random port (prints the URL)
copilot --headless
# Output: Listening on http://localhost:52431
```

Par défaut, le serveur sans interface utilisateur n’accepte que les connexions provenant de l’adresse de bouclage (`127.0.0.1`). Pour accepter des connexions provenant d’autres hôtes — par exemple d’une autre machine de votre réseau —, liez le serveur à une adresse autre qu’une adresse de bouclage à l’aide de `--host` :

```bash
copilot --headless --host 0.0.0.0 --port 4321
```

Pour la production, exécutez-le en tant que service système ou dans un conteneur.

> \[!NOTE]
> Il n’existe aucune image Docker prédéfinie officielle pour l’interface CLI Copilot. Vous pouvez créer votre propre version à partir des versions [GitHub](https://github.com/github/copilot-cli/releases) :

```dockerfile
FROM debian:bookworm-slim
ARG COPILOT_VERSION=1.0.7
RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates wget \
    && ARCH=$(dpkg --print-architecture) \
    && case "${ARCH}" in amd64) COPILOT_ARCH="x64" ;; arm64) COPILOT_ARCH="arm64" ;; *) echo "Unsupported: ${ARCH}" && exit 1 ;; esac \
    && wget -q "https://github.com/github/copilot-cli/releases/download/v${COPILOT_VERSION}/copilot-linux-${COPILOT_ARCH}.tar.gz" \
    && tar -xzf "copilot-linux-${COPILOT_ARCH}.tar.gz" \
    && mv copilot /usr/local/bin/ \
    && rm "copilot-linux-${COPILOT_ARCH}.tar.gz" \
    && apt-get purge -y wget && apt-get autoremove -y && rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["copilot"]
```

```bash
# Build the image
docker build --build-arg COPILOT_VERSION=1.0.7 -t copilot-cli:latest .

# For remote deployments (Kubernetes, ACI, etc.), push to your registry
docker tag copilot-cli:latest your-registry/copilot-cli:latest
docker push your-registry/copilot-cli:latest
```

```bash
# Docker — must bind to 0.0.0.0 so the container's published port is reachable
docker run -d --name copilot-cli \
    -p 4321:4321 \
    -e COPILOT_GITHUB_TOKEN="$TOKEN" \
    copilot-cli:latest \
    --headless --host 0.0.0.0 --port 4321

# systemd
[Service]
ExecStart=/usr/local/bin/copilot --headless --port 4321
Environment=COPILOT_GITHUB_TOKEN=your-token
Restart=always
```

## Étape 2 : connecter le Kit de développement logiciel (SDK)

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

```typescript
import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk";

const client = new CopilotClient({
    connection: RuntimeConnection.forUri("localhost:4321"),
    mode: "empty",
});

const session = await client.createSession({
    sessionId: `user-${userId}-${Date.now()}`,
    model: "gpt-5.4",
    availableTools: ["custom:*"],
    gitHubToken: user.githubToken,
});

const response = await session.sendAndWait({ prompt: req.body.message });
res.json({ content: response?.data.content });
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

```python
from copilot import CopilotClient, RuntimeConnection
from copilot.session import PermissionHandler

client = CopilotClient(
    connection=RuntimeConnection.for_uri("localhost:4321"),
)
await client.start()

session = await client.create_session(on_permission_request=PermissionHandler.approve_all, model="gpt-5.4", session_id=f"user-{user_id}-{int(time.time())}")

response = await session.send_and_wait(message)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

```golang
client := copilot.NewClient(&copilot.ClientOptions{
    Connection: copilot.URIConnection{URL: "localhost:4321"},
})
client.Start(ctx)
defer client.Stop()

session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
    SessionID: fmt.Sprintf("user-%s-%d", userID, time.Now().Unix()),
    Model:     "gpt-5.4",
})

response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: message})
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

```csharp
var client = new CopilotClient(new CopilotClientOptions
{
    Connection = RuntimeConnection.ForUri("localhost:4321"),
});

await using var session = await client.CreateSessionAsync(new SessionConfig
{
    SessionId = $"user-{userId}-{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}",
    Model = "gpt-5.4",
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = message });
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;

var userId = "user1";
var message = "Hello!";

var client = new CopilotClient(new CopilotClientOptions()
    .setCliUrl("localhost:4321")
);

try {
    client.start().get();

    var session = client.createSession(new SessionConfig()
        .setSessionId(String.format("user-%s-%d", userId, System.currentTimeMillis() / 1000))
        .setModel("gpt-5.4")
        .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
    ).get();

    var response = session.sendAndWait(new MessageOptions()
        .setPrompt(message)).get();
} finally {
    client.stop().get();
}
```

</div>

</div>

## Authentification pour les services principaux

### Jetons de variables d'environnement

L’approche la plus simple : définissez un jeton sur le serveur CLI :

![Diagramme : Organigramme montrant le processus décrit.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-2.png)

```bash
# All requests use this token
export COPILOT_GITHUB_TOKEN="gho_service_account_token"
copilot --headless --port 4321
```

### Jetons OAuth par utilisateur

Transmettez des jetons d’utilisateur individuels lors de la création de sessions. Consultez [configuration de GitHub OAuth](/fr/copilot/how-tos/copilot-sdk/setup/github-oauth) pour le flux complet.

```typescript
const client = new CopilotClient({
    connection: RuntimeConnection.forUri("localhost:4321"),
    mode: "empty",
});

// Your API receives user tokens from your auth layer
app.post("/chat", authMiddleware, async (req, res) => {
    const session = await client.createSession({
        sessionId: `user-${req.user.id}-chat`,
        model: "gpt-5.4",
        availableTools: ["custom:*"],
        gitHubToken: req.user.githubToken,
    });

    const response = await session.sendAndWait({
        prompt: req.body.message,
    });

    res.json({ content: response?.data.content });
});
```

### BYOK (aucune authentification GitHub)

Utilisez vos propres clés API pour le fournisseur de modèles. Pour plus d’informations, consultez [BYOK (apportez votre propre clé)](/fr/copilot/how-tos/copilot-sdk/auth/byok).

```typescript
const client = new CopilotClient({
    connection: RuntimeConnection.forUri("localhost:4321"),
});

const session = await client.createSession({
    model: "gpt-5.4",
    provider: {
        type: "openai",
        baseUrl: "https://api.openai.com/v1",
        apiKey: process.env.OPENAI_API_KEY,
    },
});
```

## Modèles courants de backend

### API web avec Express

![Diagramme : Organigramme montrant le processus décrit.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-3.png)

```typescript
import express from "express";
import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk";

const app = express();
app.use(express.json());

// Single shared CLI connection for multi-user server mode
const client = new CopilotClient({
    connection: RuntimeConnection.forUri(process.env.CLI_URL || "localhost:4321"),
    mode: "empty",
});

app.post("/api/chat", async (req, res) => {
    const { sessionId, message } = req.body;

    // Create or resume session
    let session;
    try {
        session = await client.resumeSession(sessionId);
    } catch {
        session = await client.createSession({
            sessionId,
            model: "gpt-5.4",
            availableTools: ["custom:*"],
            gitHubToken: req.user.githubToken,
        });
    }

    const response = await session.sendAndWait({ prompt: message });
    res.json({
        sessionId,
        content: response?.data.content,
    });
});

app.listen(3000);
```

### Travailleur en arrière-plan

```typescript
import { CopilotClient, RuntimeConnection } from "@github/copilot-sdk";

const client = new CopilotClient({
    connection: RuntimeConnection.forUri(process.env.CLI_URL || "localhost:4321"),
});

// Process jobs from a queue
async function processJob(job: Job) {
    const session = await client.createSession({
        sessionId: `job-${job.id}`,
        model: "gpt-5.4",
    });

    const response = await session.sendAndWait({
        prompt: job.prompt,
    });

    await saveResult(job.id, response?.data.content);
    await session.disconnect();  // Clean up after job completes
}
```

### Déploiement Docker Compose

```yaml
version: "3.8"

services:
  copilot-cli:
    image: copilot-cli:latest  # See "Step 1" above for how to build this image
    command: ["--headless", "--host", "0.0.0.0", "--port", "4321"]
    environment:
      - COPILOT_GITHUB_TOKEN=${COPILOT_GITHUB_TOKEN}
    ports:
      - "4321:4321"
    restart: always
    volumes:
      - session-data:/root/.copilot/session-state

  api:
    build: .
    environment:
      - CLI_URL=copilot-cli:4321
    depends_on:
      - copilot-cli
    ports:
      - "3000:3000"

volumes:
  session-data:
```

![Diagramme : Organigramme montrant le processus décrit.](/assets/images/help/copilot/copilot-sdk/setup-backend-services-diagram-4.png)

## Contrôles de santé

Surveillez l’intégrité du serveur CLI :

```typescript
// Periodic health check
async function checkCLIHealth(): Promise<boolean> {
    try {
        const status = await client.getStatus();
        return status !== undefined;
    } catch {
        return false;
    }
}
```

## Nettoyage de session

Les services principaux doivent nettoyer activement les sessions pour éviter les fuites de ressources :

```typescript
// Clean up expired sessions periodically
async function cleanupSessions(maxAgeMs: number) {
    const sessions = await client.listSessions();
    const now = Date.now();

    for (const session of sessions) {
        const age = now - new Date(session.createdAt).getTime();
        if (age > maxAgeMs) {
            await client.deleteSession(session.sessionId);
        }
    }
}

// Run every hour
setInterval(() => cleanupSessions(24 * 60 * 60 * 1000), 60 * 60 * 1000);
```

## Limitations

| Limitation                                                           | Détails                                                                                                                       |
| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| **Serveur CLI unique = point de défaillance unique**                 | Voir [Mise à l'échelle et multilocataire](/fr/copilot/how-tos/copilot-sdk/setup/scaling) pour les modèles haute disponibilité |
| **Aucune authentification intégrée entre le SDK et l’interface CLI** | Sécuriser le chemin d’accès réseau (même hôte, VPC, etc.)                                                                     |
| **État de session sur le disque local**                              | Monter un stockage persistant pour les redémarrages du conteneur                                                              |
| **Délai d’inactivité de 30 minutes**                                 | Les sessions sans activité sont nettoyées automatiquement                                                                     |

## Quand se déplacer

| Besoin                                                                                            | Guide suivant |
| ------------------------------------------------------------------------------------------------- | ------------- |
| Serveurs CLI multiples / haute disponibilité                                                      |               |
| [Mise à l'échelle et multilocataire](/fr/copilot/how-tos/copilot-sdk/setup/scaling)               |               |
| Isolation du Kit de développement logiciel (SDK) pour les utilisateurs simultanés                 |               |
| [Multilocataire et déploiements de serveurs](/fr/copilot/how-tos/copilot-sdk/setup/multi-tenancy) |               |
| Authentification du compte GitHub pour les utilisateurs                                           |               |
| [configuration de GitHub OAuth](/fr/copilot/how-tos/copilot-sdk/setup/github-oauth)               |               |
| Vos propres clés de modèle                                                                        |               |
| [BYOK (apportez votre propre clé)](/fr/copilot/how-tos/copilot-sdk/auth/byok)                     |               |

## Étapes suivantes

* **[Multilocataire et déploiements de serveurs](/fr/copilot/how-tos/copilot-sdk/setup/multi-tenancy)** : Configurer l’isolation du Kit de développement logiciel (SDK) pour les utilisateurs simultanés
* **[Mise à l'échelle et multilocataire](/fr/copilot/how-tos/copilot-sdk/setup/scaling)** : Gérer davantage d’utilisateurs, ajouter une redondance
* **[Reprise de session et persistance](/fr/copilot/how-tos/copilot-sdk/features/session-persistence)** : Reprendre les sessions après le redémarrage
* **[configuration de GitHub OAuth](/fr/copilot/how-tos/copilot-sdk/setup/github-oauth)** : Ajouter une authentification utilisateur