pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://docs.github.com/de/copilot/how-tos/copilot-sdk/setup/backend-services

"path-version" content="free-pro-team@latest" data-next-head=""/>
Skip to main content

Einrichtung von Back-End-Diensten

Führen Sie das Copilot SDK in serverseitigen Anwendungen aus– APIs, Web-Back-Ends, Microservices und Hintergrundmitarbeitern. Die CLI läuft als Headless-Server, mit dem sich Ihr Back-End-Code über das Netzwerk verbindet.

Am besten geeignet für: Web-App-Back-Ends, API-Dienste, interne Tools, CI/CD-Integrationen, jede serverseitige Workload.

So funktioniert es

Anstelle dass das SDK einen CLI-Unterprozess erzeugt, führen Sie die CLI unabhängig im Headless-Servermodus aus. Ihr Backend stellt über TCP mithilfe der Option Connection (URIConnection) eine Verbindung her.

Diagramm: Flussdiagramm mit dem beschriebenen Prozess.

Wichtige Merkmale:

  • CLI wird als persistenter Serverprozess ausgeführt (nicht für jede Anforderung neu erzeugt)
  • SDK stellt eine Verbindung über TCP her– CLI und App können in verschiedenen Containern ausgeführt werden.
  • Mehrere SDK-Clients können einen CLI-Server freigeben
  • Funktioniert mit jeder Authentifizierungsmethode (GitHub Token, env vars, BYOK)

Konfigurieren Sie für den Mehrbenutzerservermodus SDK-Clients mit mode: "empty", übergeben Sie Benutzeranmeldeinformationen pro Sitzung, und lassen Sie Tools für jede Sitzung explizit zu. Informationen zum vollständigen Muster finden Sie unter Mandantenfähigkeit und Serverbereitstellungen .

Architektur: automatisch verwaltete vs. externe CLI

Diagramm: Flussdiagramm mit dem beschriebenen Prozess.

Schritt 1: Starten der CLI im kopflosen Modus

Ausführen der CLI als Hintergrundserver:

# 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

Standardmäßig akzeptiert der Headless-Server nur Verbindungen über die Loopback-Schnittstelle (127.0.0.1). Um Verbindungen von anderen Hosts zu akzeptieren – zum Beispiel von einem anderen Computer in Ihrem Netzwerk – binden Sie mit --host an eine Nicht-Loopback-Adresse:

copilot --headless --host 0.0.0.0 --port 4321

Führen Sie sie in der Produktion als Systemdienst oder in einem Container aus.

Hinweis

Es gibt kein offizielles vordefiniertes Docker-Image für die Copilot CLI. Sie können eigene Versionen aus den GitHub-Versionen erstellen:

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"]
# 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
# 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

Schritt 2: Verbinden des SDK

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-4.1",
    availableTools: ["custom:*"],
    gitHubToken: user.githubToken,
});

const response = await session.sendAndWait({ prompt: req.body.message });
res.json({ content: response?.data.content });
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-4.1", session_id=f"user-{user_id}-{int(time.time())}")

response = await session.send_and_wait(message)
Go
package main

import (
    "context"
    "fmt"
    "time"
    copilot "github.com/github/copilot-sdk/go"
)

func main() {
    ctx := context.Background()
    userID := "user1"
    message := "Hello"

    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-4.1",
    })

    response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: message})
    _ = response
}
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-4.1",
})

response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: message})
.NET
using GitHub.Copilot;

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

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-4.1",
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = message });
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-4.1",
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = message });
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-4.1")
        .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
    ).get();

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

Authentifizierung für Back-End-Dienste

Umgebungsvariablen-Token

Der einfachste Ansatz: Legen Sie ein Token auf dem CLI-Server fest:

Diagramm: Flussdiagramm mit dem beschriebenen Prozess.

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

Benutzerbasierte Token (OAuth)

Übergeben Sie einzelne Benutzertoken beim Erstellen von Sitzungen. Informationen zum vollständigen Ablauf finden Sie unter Einrichtung von GitHub OAuth .

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-4.1",
        availableTools: ["custom:*"],
        gitHubToken: req.user.githubToken,
    });

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

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

BYOK (keine GitHub Authentifizierung)

Verwenden Sie Ihre eigenen API-Schlüssel für den Modellanbieter. Einzelheiten findest du unter BYOK (Bring Your Own Key).

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

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

Allgemeine Back-End-Muster

Web-API mit Express

Diagramm: Flussdiagramm mit dem beschriebenen Prozess.

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-4.1",
            availableTools: ["custom:*"],
            gitHubToken: req.user.githubToken,
        });
    }

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

app.listen(3000);

Hintergrundmitarbeiter

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-4.1",
    });

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

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

Docker Compose-Bereitstellung

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:

Diagramm: Flussdiagramm mit dem beschriebenen Prozess.

Gesundheitschecks

Überwachen Sie den Zustand des CLI-Servers:

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

Sitzungsbereinigung

Back-End-Dienste sollten Sitzungen aktiv bereinigen, um Ressourcenlecks zu vermeiden:

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

Einschränkungen

EinschränkungDetails
Einzelner CLI-Server = Einzelner FehlerpunktSiehe Skalierung und Mehrinstanzenfähigkeit für HA-Muster
Keine integrierte Authentifizierung zwischen SDK und CLIDen Netzwerkpfad absichern (derselbe Host, VPC usw.)
Sitzungszustand auf dem lokalen DatenträgerPersistenten Speicher bei Containerneustarts einbinden
30-minütige LeerlauftimeoutSitzungen ohne Aktivität werden automatisch bereinigt.

Wann muss ich fortfahren?

BedarfNächster Leitfaden
Mehrere CLI-Server / hohe Verfügbarkeit
Skalierung und Mehrinstanzenfähigkeit
SDK-Isolation für gleichzeitige Nutzer
Mandantenfähigkeit und Serverbereitstellungen
GitHub Kontoauthentifizierung für Benutzer
Einrichtung von GitHub OAuth
Ihre eigenen Modellschlüssel
BYOK (Bring Your Own Key)

Nächste Schritte

pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy