Skip to main content

Crea tu primera aplicación con tecnología Copilot

En este tutorial, usará el SDK de Copilot para compilar un asistente de línea de comandos. Empezarás con los conceptos básicos, añadirás respuestas en tiempo real y, a continuación, añadirás herramientas personalizadas, lo que le dará a Copilot la capacidad de invocar tu código.

Lo que vas a construir:

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!

Prerequisites

Antes de comenzar, asegúrese de que tiene:

  • GitHub Copilot CLI instalada y autenticada ( Guía de instalación)
  • Su entorno de ejecución de lenguaje preferido:
    • Node.js 20+ o Python 3.11+ o Go 1.24+ o Rust 1.94+ o Java 17+ o .NET 8.0+

Compruebe que la CLI funciona:

copilot --version

Paso 1: instalar el SDK

Lenguajes de código navigation

TypeScript

En primer lugar, cree un nuevo directorio e inicialice el proyecto:

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

A continuación, instale el SDK y el ejecutor de TypeScript:

npm install @github/copilot-sdk tsx

Paso 2: enviar el primer mensaje

Cree un nuevo archivo y agregue el código siguiente. Esta es la manera más sencilla de usar el SDK, aproximadamente 5 líneas de código.

Lenguajes de código navigation

TypeScript

Creación de 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);

Ejecútelo:

npx tsx index.ts

Debería ver:

4

¡Felicidades! Acaba de crear su primera aplicación con tecnología Copilot.

Paso 3: agregar respuestas de streaming

Ahora mismo, tienes que esperar a que se muestre la respuesta completa antes de ver nada. Vamos a hacer que sea interactivo mediante el streaming de la respuesta a medida que se genera.

Lenguajes de código navigation

TypeScript

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

Vuelva a ejecutar el código. Verá que la respuesta aparece palabra por palabra.

Métodos de suscripción de eventos

El SDK proporciona métodos para suscribirse a eventos de sesión:

MétodoDescription
on(handler)Suscribirse a todos los eventos; devuelve la función de cancelación de suscripción
on(eventType, handler)Suscribirse a un tipo específico de evento (solo Node.js/TypeScript); devuelve una función para cancelar la suscripción
subscribe()Suscribirse a todos los eventos (Rust); filtrar por event_type

Lenguajes de código 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();

Paso 4: agregar una herramienta personalizada

Y ahora viene la parte potente. Vamos a darle a Copilot la capacidad de llamar a tu código definiendo una herramienta personalizada. Crearemos una herramienta de búsqueda meteorológica sencilla.

Lenguajes de código navigation

TypeScript

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

Ejecútelo y verá que Copilot usa la herramienta para obtener datos del tiempo y, a continuación, responde con los resultados.

Paso 5: crear un asistente interactivo

Vamos a ponerlo todo juntos en un asistente interactivo útil:

Lenguajes de código 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();

Ejecute con:

npx tsx weather-assistant.ts

Sesión de ejemplo:

🌤️  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

¡Has creado un asistente con una herramienta personalizada que Copilot puede invocar!

Funcionamiento de las herramientas

Cuando defines una herramienta, le estás diciendo a Copilot:

  1. Qué hace la herramienta (descripción)
  2. Qué parámetros necesita (esquema)
  3. Qué código se va a ejecutar (controlador)

Copilot decide cuándo llamar a la herramienta en función de la pregunta del usuario. Cuando lo haga:

  1. Copilot envía una solicitud de llamada de herramienta con los parámetros
  2. El SDK ejecuta la función del controlador.
  3. El resultado se devuelve a Copilot
  4. Copilot incorpora el resultado en su respuesta

¿Qué sigue?

Ahora que tiene los conceptos básicos, estas son características más eficaces para explorar:

Conexión a servidores MCP

Los servidores MCP (Protocolo de contexto de modelo) proporcionan herramientas pregeneradas. Conéctese al servidor MCP de GitHub para conceder a Copilot acceso a repositorios, problemas y solicitudes de incorporación de cambios:

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

📖 ** Using MCP servers with the GitHub Copilot SDK** : obtenga información sobre servidores locales frente a remotos, todas las opciones de configuración y la solución de problemas.

Creación de agentes personalizados

Defina roles de IA especializados para tareas específicas:

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

Sugerencia

También puede establecer agent: "pr-reviewer" en la configuración de sesión para seleccionar previamente este agente desde el principio. Consulte autotitle para obtener más información.

Personalización del mensaje del sistema

Controle el comportamiento y la personalidad de la inteligencia artificial anexando instrucciones:

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

Para un control más detallado, use mode: "customize" para anular secciones individuales del prompt del sistema sin dejar de preservar el resto:

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

Identificadores de sección disponibles: identity, tone, tool_efficiency, environment_context, code_change_rules, guidelines, safety, tool_instructions, custom_instructions, runtime_instructions, last_instructions.

Cada anulación admite cuatro acciones: replace, remove, append y prepend. Los identificadores de sección desconocidos se gestionan correctamente: el contenido se agrega a las instrucciones adicionales y se emite una advertencia; remove en secciones no reconocidas se omite silenciosamente.

Consulte los READMEs del SDK específicos del lenguaje para obtener ejemplos en TypeScript, Python, Go, Rust, Java y C#.

Conexión a un servidor de la CLI externo

De forma predeterminada, el SDK administra automáticamente el ciclo de vida del proceso de la CLI de Copilot, iniciando y deteniendo la CLI según sea necesario. Sin embargo, también puede ejecutar la CLI en modo de servidor por separado y hacer que el SDK se conecte a él. Esto puede ser útil para:

  •           **Depuración**: Mantenga la interfaz de línea de comandos en ejecución entre reinicios del SDK para inspeccionar los registros
    
  • Uso compartido de recursos: varios clientes del SDK pueden conectarse al mismo servidor de la CLI
  • Desarrollo: ejecute la CLI con la configuración personalizada o en un entorno diferente.

Ejecución de la CLI en modo de servidor

Inicie la CLI en modo de servidor con la --headless marca y, opcionalmente, especifique un puerto:

copilot --headless --port 4321

Si no especifica un puerto, la CLI elegirá un puerto disponible aleatoriamente.

De forma predeterminada, el servidor headless solo acepta conexiones de loopback (127.0.0.1), por lo que el SDK debe ejecutarse en la misma máquina. Para aceptar conexiones desde otros hosts (por ejemplo, al ejecutar la CLI en un contenedor o en un servidor independiente), vincúlelo a una dirección distinta de la de loopback con --host:

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

Advertencia

Exponer el servidor sin encabezado en una dirección que no sea de bucle invertido hace que sea accesible por cualquier persona que pueda enrutar a esa dirección. Complételo con controles de red (cortafuegos, una red privada, proxy inverso) y mecanismos de autenticación adecuados para su entorno.

Conexión del SDK al servidor externo

Una vez que la CLI se ejecuta en modo de servidor, configure el cliente del SDK para conectarse a él mediante la opción "cli url":

Lenguajes de código 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 });
// ...

Nota: Cuando se proporciona cli_url / cliUrl o el UriConnection de Go, o Rust usa Transport::External, el SDK no iniciará ni administrará un proceso de CLI; solo se conectará al servidor existente en la URL especificada.

Telemetría y observabilidad

El SDK de Copilot admite OpenTelemetry para el seguimiento distribuido. Proporcione una telemetry configuración al cliente para habilitar la exportación de seguimiento desde el proceso de la CLI y la propagación automática del contexto de seguimiento de W3C entre el SDK y la CLI.

Habilitación de telemetría

Pasa una configuración telemetry (o Telemetry) al crear el cliente. Esta es la opción de aceptación voluntaria; no se necesita ningún indicador de «habilitado» por separado.

Lenguajes de código navigation

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

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

Dependencia de par opcional: @opentelemetry/api

Opciones de TelemetryConfig

OpciónNode.jsPythonIrÓxidoJava.NETDescription
Punto de conexión de OTLPotlpEndpointotlp_endpointOTLPEndpointotlp_endpointotlpEndpointOtlpEndpointDirección URL del punto de conexión HTTP de OTLP
Ruta del archivofilePathfile_pathFilePathfile_pathfilePathFilePathRuta de acceso de archivo para salida de seguimiento de líneas JSON
Tipo de exportadorexporterTypeexporter_typeExporterTypeexporter_typeexporterTypeExporterType
"otlp-http" o "file"
Nombre de origensourceNamesource_nameSourceNamesource_namesourceNameSourceNameNombre del ámbito de instrumentación
Captura de contenidocaptureContentcapture_contentCaptureContentcapture_contentcaptureContentCaptureContentSi se va a capturar el contenido del mensaje

Exportación de archivos

Para escribir las trazas en un archivo local en lugar de en un punto de conexión OTLP:

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

Propagación del contexto de rastreo

El contexto de seguimiento se propaga automáticamente; no se necesita instrumentación manual:

  • SDK → CLI: los encabezados traceparent y tracestate del span o la actividad actuales se incluyen en las llamadas RPC session.create, session.resume y session.send.
  • CLI → SDK: cuando la CLI invoca controladores de herramientas, el contexto de seguimiento del intervalo de la CLI se propaga para que el código de la herramienta se ejecute bajo el intervalo primario correcto.

📖 ** Instrumentación de OpenTelemetry para el SDK de Copilot**: opciones de TelemetryConfig, propagación de contexto de seguimiento y dependencias por lenguaje.

Aprende más

¡Lo hiciste! Ha aprendido los conceptos básicos del SDK de GitHub Copilot:

  • ✅ Creación de un cliente y una sesión
  • ✅ Envío de mensajes y recepción de respuestas
  • ✅ Transmisión de resultados en tiempo real
  • ✅ Definir herramientas personalizadas que Copilot puede invocar

¡Ahora vamos a construir algo increíble! 🚀