Skip to main content

Erstellen Sie Ihre erste Copilot-gestützte App

In diesem Lernprogramm verwenden Sie das Copilot SDK, um einen Befehlszeilen-Assistenten zu erstellen. Sie beginnen mit den Grundlagen, fügen Streaming-Antworten hinzu und ergänzen dann benutzerdefinierte Tools, wodurch Copilot Ihren Code aufrufen kann.

Was Sie erstellen werden:

You: What's the weather like in Seattle?
Copilot: Let me check the weather for Seattle...
         Currently 62°F and cloudy with a chance of rain.
         Typical Seattle weather!

You: How about Tokyo?
Copilot: In Tokyo it's 75°F and sunny. Great day to be outside!

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie folgendes haben:

  • GitHub Copilot CLI installiert und authentifiziert (Installationshandbuch)
  • Ihre bevorzugte Sprachlaufzeit:
    • Node.js 20+ oder Python 3,11+ oder Go 1,24+ oder < c3>Rust 1,94+ oder Java 17+ oder .NET 8,0+

Überprüfen Sie, ob die CLI funktioniert:

copilot --version

Schritt 1: Installieren des SDK

Codesprachen navigation

TypeScript

Erstellen Sie zunächst ein neues Verzeichnis, und initialisieren Sie Ihr Projekt:

mkdir copilot-demo && cd copilot-demo
npm init -y --init-type module

Installieren Sie dann das SDK und typeScript runner:

npm install @github/copilot-sdk tsx

Schritt 2: Senden Ihrer ersten Nachricht

Erstellen Sie eine neue Datei, und fügen Sie den folgenden Code hinzu. Dies ist die einfachste Möglichkeit, das SDK zu verwenden – etwa 5 Codezeilen.

Codesprachen navigation

TypeScript

Erstellen Sie index.ts:

import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({ model: "gpt-4.1" });

const response = await session.sendAndWait({ prompt: "What is 2 + 2?" });
console.log(response?.data.content);

await client.stop();
process.exit(0);

Ausführen:

npx tsx index.ts

Sie sollten Folgendes sehen:

4

Glückwunsch! Sie haben gerade Ihre erste Copilot-basierte App erstellt.

Schritt 3: Hinzufügen von Streamingantworten

Im Moment warten Sie auf die vollständige Antwort, bevor Sie etwas sehen. Lassen Sie uns dies interaktiv machen, indem sie die Antwort streamen, während sie generiert wird.

Codesprachen navigation

TypeScript

Aktualisieren Sie index.ts:

import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-4.1",
    streaming: true,
});

// Listen for response chunks
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});
session.on("session.idle", () => {
    console.log(); // New line when done
});

await session.sendAndWait({ prompt: "Tell me a short joke" });

await client.stop();
process.exit(0);

Führen Sie den Code erneut aus. Du siehst, wie die Antwort Wort für Wort erscheint.

Ereignisabonnementmethoden

Das SDK stellt Methoden zum Abonnieren von Sitzungsereignissen bereit:

MethodeDescription
on(handler)Alle Ereignisse abonnieren; gibt eine Funktion zum Abbestellen zurück.
on(eventType, handler)Einen bestimmten Ereignistyp abonnieren (nur für Node.js/TypeScript); gibt eine Funktion zum Abbestellen zurück.
subscribe()Abonnieren Sie alle Veranstaltungen (Rust); filtern nach event_type

Codesprachen navigation

TypeScript
// Subscribe to all events
const unsubscribeAll = session.on((event) => {
    console.log("Event:", event.type);
});

// Subscribe to specific event type
const unsubscribeIdle = session.on("session.idle", (event) => {
    console.log("Session is idle");
});

// Later, to unsubscribe:
unsubscribeAll();
unsubscribeIdle();

Schritt 4: Hinzufügen eines benutzerdefinierten Tools

Nun zum leistungsstarken Teil. Lassen Sie uns Copilot die Möglichkeit geben, Ihren Code aufzurufen, indem wir ein benutzerdefiniertes Tool definieren. Wir erstellen ein einfaches Wetter-Nachschlagetool.

Codesprachen navigation

TypeScript

Aktualisieren Sie index.ts:

import { CopilotClient, defineTool } from "@github/copilot-sdk";

// Define a tool that Copilot can call
const getWeather = defineTool("get_weather", {
    description: "Get the current weather for a city",
    parameters: {
        type: "object",
        properties: {
            city: { type: "string", description: "The city name" },
        },
        required: ["city"],
    },
    handler: async (args: { city: string }) => {
        const { city } = args;
        // In a real app, you'd call a weather API here
        const conditions = ["sunny", "cloudy", "rainy", "partly cloudy"];
        const temp = Math.floor(Math.random() * 30) + 50;
        const condition = conditions[Math.floor(Math.random() * conditions.length)];
        return { city, temperature: `${temp}°F`, condition };
    },
});

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-4.1",
    streaming: true,
    tools: [getWeather],
});

session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

session.on("session.idle", () => {
    console.log(); // New line when done
});

await session.sendAndWait({
    prompt: "What's the weather like in Seattle and Tokyo?",
});

await client.stop();
process.exit(0);

Führen Sie es aus, und Sie werden sehen, dass Copilot Ihr Tool aufruft, um Wetterdaten abzurufen, und anschließend mit den Ergebnissen antwortet!

Schritt 5: Erstellen eines interaktiven Assistenten

Lassen Sie uns alles in einen nützlichen interaktiven Assistenten zusammenfassen:

Codesprachen navigation

TypeScript
import { CopilotClient, defineTool } from "@github/copilot-sdk";
import * as readline from "readline";

const getWeather = defineTool("get_weather", {
    description: "Get the current weather for a city",
    parameters: {
        type: "object",
        properties: {
            city: { type: "string", description: "The city name" },
        },
        required: ["city"],
    },
    handler: async ({ city }) => {
        const conditions = ["sunny", "cloudy", "rainy", "partly cloudy"];
        const temp = Math.floor(Math.random() * 30) + 50;
        const condition = conditions[Math.floor(Math.random() * conditions.length)];
        return { city, temperature: `${temp}°F`, condition };
    },
});

const client = new CopilotClient();
const session = await client.createSession({
    model: "gpt-4.1",
    streaming: true,
    tools: [getWeather],
});

session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

console.log("🌤️  Weather Assistant (type 'exit' to quit)");
console.log("   Try: 'What's the weather in Paris?'\n");

const prompt = () => {
    rl.question("You: ", async (input) => {
        if (input.toLowerCase() === "exit") {
            await client.stop();
            rl.close();
            return;
        }

        process.stdout.write("Assistant: ");
        await session.sendAndWait({ prompt: input });
        console.log("\n");
        prompt();
    });
};

prompt();

Ausführen mit:

npx tsx weather-assistant.ts

Beispielsitzung:

🌤️  Weather Assistant (type 'exit' to quit)
   Try: 'What's the weather in Paris?' or 'Compare weather in NYC and LA'

You: What's the weather in Seattle?
Assistant: Let me check the weather for Seattle...
It's currently 62°F and cloudy in Seattle.

You: How about Tokyo and London?
Assistant: I'll check both cities for you:
- Tokyo: 75°F and sunny
- London: 58°F and rainy

You: exit

Sie haben einen Assistenten mit einem benutzerdefinierten Tool erstellt, das Copilot aufrufen kann!

Funktionsweise von Tools

Wenn Sie ein Tool definieren, sagen Sie Copilot:

  1. Funktionsweise des Tools (Beschreibung)
  2. Welche Parameter benötigt werden (Schema)
  3. Auszuführender Code (Handler)

Copilot entscheidet, wann Ihr Tool basierend auf der Frage des Benutzers aufgerufen werden soll. Wann dies der Fall ist:

  1. Copilot sendet eine Toolaufrufanforderung mit den Parametern
  2. Das SDK führt die Handlerfunktion aus.
  3. Das Ergebnis wird an Copilot zurückgesendet.
  4. Copilot enthält das Ergebnis in seine Antwort

Wie geht es weiter?

Jetzt, da Sie die Grundlagen haben, finden Sie hier leistungsfähigere Features, die Sie erkunden können:

Herstellen einer Verbindung mit MCP-Servern

MCP-Server (Model Context Protocol) stellen vordefinierte Tools bereit. Stellen Sie eine Verbindung mit dem MCP-Server von GitHub her, um Copilot Zugriff auf Repositorys, Probleme und Pullanforderungen zu gewähren:

const session = await client.createSession({
    mcpServers: {
        github: {
            type: "http",
            url: "https://api.githubcopilot.com/mcp/",
        },
    },
});

📖 ** Using MCP servers with the GitHub Copilot SDK** – Erfahren Sie mehr über lokale und Remoteserver, alle Konfigurationsoptionen und die Problembehandlung.

Erstellen von benutzerdefinierten Agents

Definieren Sie spezielle KI-Personas für bestimmte Aufgaben:

const session = await client.createSession({
    customAgents: [{
        name: "pr-reviewer",
        displayName: "PR Reviewer",
        description: "Reviews pull requests for best practices",
        prompt: "You are an expert code reviewer. Focus on security, performance, and maintainability.",
    }],
});

Tipp

Sie können auch in der Sitzungskonfiguration festlegen agent: "pr-reviewer" , dass dieser Agent von Anfang an vorab ausgewählt wird. Weitere Einzelheiten finden Sie unter Angepasste Agents und Orchestrierung von Unteragenten.

Anpassen der Systemnachricht

Steuern Sie das Verhalten und die Persönlichkeit der KI, indem Sie Anweisungen anfügen:

const session = await client.createSession({
    systemMessage: {
        content: "You are a helpful assistant for our engineering team. Always be concise.",
    },
});

Für eine granularere Steuerung verwenden Sie mode: "customize", um einzelne Abschnitte des Systemprompts zu überschreiben, während der Rest erhalten bleibt:

const session = await client.createSession({
    systemMessage: {
        mode: "customize",
        sections: {
            tone: { action: "replace", content: "Respond in a warm, professional tone. Be thorough in explanations." },
            code_change_rules: { action: "remove" },
            guidelines: { action: "append", content: "\n* Always cite data sources" },
        },
        content: "Focus on financial analysis and reporting.",
    },
});

Verfügbare Abschnitts-IDs: identity, , tone``tool_efficiency``environment_context``code_change_rules``guidelines``safety``tool_instructions``custom_instructions. . runtime_instructions``last_instructions

Jede Überschreibung unterstützt vier Aktionen: replace, remove, append und prepend. Unbekannte Abschnitts-IDs werden problemlos verarbeitet – Inhalte werden zusätzlichen Anweisungen angehängt, und es wird eine Warnung ausgegeben; remove bei unbekannten Abschnitten wird stillschweigend ignoriert.

Beispiele für sprachspezifische SDK-READMEs finden Sie in TypeScript, Python, Go, Rust, Java und C#.

Herstellen einer Verbindung mit einem externen CLI-Server

Standardmäßig verwaltet das SDK automatisch den Copilot CLI-Prozesslebenszyklus, startet und beendet die CLI bei Bedarf. Sie können die CLI jedoch auch separat im Servermodus ausführen und über das SDK eine Verbindung damit herstellen. Dies kann nützlich sein für:

  • Debuggen: Führen Sie die CLI zwischen SDK-Neustarts aus, um Protokolle zu prüfen
  • Ressourcenfreigabe: Mehrere SDK-Clients können eine Verbindung mit demselben CLI-Server herstellen.
  • Entwicklung: Ausführen der CLI mit benutzerdefinierten Einstellungen oder in einer anderen Umgebung

Ausführen der CLI im Servermodus

Starten Sie die CLI im Servermodus mit dem --headless Flag, und geben Sie optional einen Port an:

copilot --headless --port 4321

Wenn Sie keinen Port angeben, wählt die CLI einen zufällig verfügbaren Port aus.

Standardmäßig akzeptiert der Headless-Server nur Verbindungen von Loopback (127.0.0.1), sodass das SDK auf demselben Computer ausgeführt werden muss. Um Verbindungen von anderen Hosts zu akzeptieren (z. B. beim Ausführen der CLI in einem Container oder auf einem separaten Server), binden Sie eine Bindung an eine Nicht-Loopbackadresse mit --host:

# Listen on all interfaces
copilot --headless --host 0.0.0.0 --port 4321

Warnung

Wenn Sie den Headless-Server über eine andere Adresse als eine Loopback-Adresse zugänglich machen, ist er für jeden erreichbar, der eine Route zu dieser Adresse hat. Koppeln Sie sie mit Netzwerksteuerelementen (Firewall, privates Netzwerk, Reverseproxy) und Authentifizierung, die für Ihre Umgebung geeignet ist.

Verbinden des SDK mit dem externen Server

Nachdem die CLI im Servermodus ausgeführt wird, konfigurieren Sie Ihren SDK-Client so, dass er über die Option "cli url" eine Verbindung mit ihr herstellt:

Codesprachen navigation

TypeScript
import { CopilotClient, approveAll } from "@github/copilot-sdk";

const client = new CopilotClient({
    cliUrl: "localhost:4321"
});

// Use the client normally
const session = await client.createSession({ onPermissionRequest: approveAll });
// ...

Hinweis: Wenn cli_url / cliUrl / Go UriConnection bereitgestellt wird oder Rust Transport::External verwendet, wird das SDK keinen CLI-Prozess starten oder verwalten – es verbindet sich nur mit dem vorhandenen Server unter der angegebenen URL.

Telemetrie und Observierbarkeit

Das Copilot-SDK unterstützt OpenTelemetry zur verteilten Nachverfolgung. Stellen Sie dem Client eine telemetry-Konfiguration bereit, um den Trace-Export aus dem CLI-Prozess und die automatische Weitergabe des W3C Trace Context zwischen dem SDK und der CLI zu ermöglichen.

Aktivieren der Telemetrie

Übergeben Sie beim Erstellen des Clients eine Konfiguration vom Typ telemetry (oder Telemetry). Dies ist das Opt-In– es ist kein separates "enabled"-Flag erforderlich.

Codesprachen navigation

TypeScript
import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient({
  telemetry: {
    otlpEndpoint: "http://localhost:4318",
  },
});

Optionale Peer-Abhängigkeit: @opentelemetry/api

TelemetryConfig-Optionen

AuswahlNode.jsPythonGoRustJava.NETDescription
OTLP-EndpunktotlpEndpointotlp_endpointOTLPEndpointotlp_endpointotlpEndpointOtlpEndpointOTLP HTTP-Endpunkt-URL
DateipfadfilePathfile_pathFilePathfile_pathfilePathFilePathDateipfad für JSON-Zeilen-Ablaufverfolgungsausgabe
ExportertypexporterTypeexporter_typeExporterTypeexporter_typeexporterTypeExporterType
"otlp-http" oder "file"
QuellnamesourceNamesource_nameSourceNamesource_namesourceNameSourceNameName des Instrumentierungsbereichs
Erfassen von InhaltencaptureContentcapture_contentCaptureContentcapture_contentcaptureContentCaptureContentGibt an, ob Nachrichteninhalte erfasst werden sollen.

Dateiexport

So schreiben Sie Ablaufverfolgungen in eine lokale Datei anstelle eines OTLP-Endpunkts:

const client = new CopilotClient({
  telemetry: {
    filePath: "./traces.jsonl",
    exporterType: "file",
  },
});

Ablaufverfolgungskontext-Propagierung

Der Trace-Kontext wird automatisch weitergegeben – eine manuelle Instrumentierung ist nicht erforderlich:

  •           **SDK → CLI**: `traceparent`- und `tracestate`-Header aus dem aktuellen Span/der aktuellen Aktivität sind in `session.create`-, `session.resume`- und `session.send`-RPC-Aufrufen enthalten.
    
  •           **CLI → SDK**: Wenn die CLI Tool-Handler aufruft, wird der Trace-Kontext aus der CLI-Span weitergegeben, sodass Ihr Toolcode im richtigen übergeordneten Span ausgeführt wird.
    

📖 ** OpenTelemetry-Instrumentierung für Copilot SDK**—TelemetryConfig-Optionen, Weitergabe des Trace-Kontexts und sprachspezifische Abhängigkeiten.

Weitere Informationen

Du hast es geschafft! Sie haben die Kernkonzepte des GitHub Copilot SDK kennengelernt:

  • ✅ Erstellen eines Clients und einer Sitzung
  • ✅ Senden von Nachrichten und Empfangen von Antworten
  • ✅ Streaming für Echtzeitausgabe
  • ✅ Definieren von benutzerdefinierten Tools, die Copilot aufrufen können

Jetzt schaffen Sie etwas Erstaunliches! 🚀