Skip to main content

Crie seu primeiro aplicativo com tecnologia do Copilot

Neste tutorial, você usará o SDK do Copilot para criar um assistente de linha de comando. Você começará com as noções básicas, adicionará respostas de streaming e adicionará ferramentas personalizadas, dando Copilot a capacidade de chamar seu código.

O que você criará:

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!

Pré-requisitos

Antes de começar, verifique se você tem:

  • GitHub Copilot CLI instalada e autenticada (guia Instalação)
  • Seu runtime de idioma preferido:
    • Node.js 20+ ou Python 3,11+ ou Go 1,24+ ou < Rust 1,94+ ou Java 17+ ou .NET 8.0+

Verifique se a CLI está funcionando:

copilot --version

Etapa 1: instalar o SDK

Idiomas de código navigation

TypeScript

Primeiro, crie um novo diretório e inicialize seu projeto:

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

Em seguida, instale o SDK e o executor typeScript:

npm install @github/copilot-sdk tsx

Etapa 2: enviar sua primeira mensagem

Crie um novo arquivo e adicione o código a seguir. Essa é a maneira mais simples de usar o SDK – cerca de 5 linhas de código.

Idiomas de código navigation

TypeScript

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

Execute-o:

npx tsx index.ts

Você deve ver:

4

Parabéns! Você acabou de criar seu primeiro aplicativo com tecnologia Copilot.

Etapa 3: adicionar respostas de streaming

No momento, aguarde a resposta completa antes de ver qualquer coisa. Vamos torná-la interativa transmitindo a resposta conforme ela é gerada.

Idiomas de código navigation

TypeScript

Atualização 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);

Execute o código novamente. Você verá a resposta aparecer palavra por palavra.

Métodos de assinatura de evento

O SDK fornece métodos para assinar eventos de sessão:

MétodoDescription
on(handler)Inscreva-se em todos os eventos; retorna a função de cancelamento de assinatura
on(eventType, handler)Inscrever-se em um tipo específico de evento (somente Node.js/TypeScript); retorna a função para cancelar a inscrição
subscribe()Assinar todos os eventos (Rust); filtrar por event_type

Idiomas 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();

Etapa 4: adicionar uma ferramenta personalizada

Agora, a parte mais poderosa. Vamos dar a Copilot a capacidade de chamar seu código definindo uma ferramenta personalizada. Criaremos uma ferramenta de pesquisa de clima simples.

Idiomas de código navigation

TypeScript

Atualização 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);

Execute-o e você verá Copilot chamar sua ferramenta para obter dados meteorológicos e responder com os resultados!

Etapa 5: criar um assistente interativo

Vamos juntar tudo em um assistente interativo útil:

Idiomas 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();

Execute com:

npx tsx weather-assistant.ts

Sessão de exemplo:

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

Você criou um assistente com uma ferramenta personalizada que Copilot pode chamar!

Como as ferramentas funcionam

Ao definir uma ferramenta, você informa Copilot:

  1. O que a ferramenta faz (descrição)
  2. Quais parâmetros ele precisa (esquema)
  3. Que código executar (manipulador)

Copilot decide quando chamar sua ferramenta com base na pergunta do usuário. Quando isso acontecer:

  1. Copilot envia uma solicitação de chamada de ferramenta com os parâmetros
  2. O SDK executa sua função de manipulador
  3. O resultado é enviado de volta para Copilot
  4. Copilot incorpora o resultado em sua resposta

E agora?

Agora que você tem as noções básicas, aqui estão os recursos mais poderosos a serem explorados:

Conectar-se a servidores MCP

Os servidores MCP (Protocolo de Contexto de Modelo) oferecem ferramentas pré-construídas. Conecte-se ao servidor MCP do GitHub para dar acesso Copilot a repositórios, problemas e solicitações de pull:

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

📖 ** Using MCP servers with the GitHub Copilot SDK** - Saiba mais sobre servidores locais versus remotos, todas as opções de configuração e solução de problemas.

Criar agentes personalizados

Defina personas de IA especializadas para tarefas 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.",
    }],
});

Dica

Você também pode definir agent: "pr-reviewer" na configuração da sessão para pré-selecionar esse agente desde o início. Consulte o Agentes personalizados e orquestração de subagentes para obter detalhes.

Personalizar a mensagem do sistema

Controle o comportamento e a personalidade da IA acrescentando instruções:

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

Para um controle mais refinado, use mode: "customize" para substituir seções individuais do prompt do sistema, preservando o restante:

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

IDs de seção disponíveis: identity, , tone, tool_efficiency, environment_context, code_change_rules, guidelines, safety, , tool_instructions, , custom_instructions, , runtime_instructions. last_instructions

Cada substituição dá suporte a quatro ações: replace, remove, append e prepend. Identificadores de seção desconhecidos são tratados de forma adequada — o conteúdo é anexado às instruções adicionais, e um aviso é emitido; remove em seções desconhecidas é ignorado silenciosamente.

Consulte os READMEs do SDK específicos do idioma para obter exemplos em TypeScript, Python, Go, Rust, Java e C#.

Conectando-se a um servidor da CLI externa

Por padrão, o SDK gerencia automaticamente o ciclo de vida do processo da CLI Copilot, iniciando e interrompendo a CLI conforme necessário. No entanto, você também pode executar a CLI no modo de servidor separadamente e fazer com que o SDK se conecte a ela. Isso pode ser útil para:

  • Depuração: mantenha a CLI em execução entre as reinicializações do SDK para inspecionar os logs
  • Compartilhamento de recursos: vários clientes do SDK podem se conectar ao mesmo servidor da CLI
  • Desenvolvimento: executar a CLI com configurações personalizadas ou em um ambiente diferente

Executando a CLI no modo de servidor

Inicie a CLI no modo de servidor usando o --headless sinalizador e, opcionalmente, especifique uma porta:

copilot --headless --port 4321

Se você não especificar uma porta, a CLI escolherá uma porta disponível aleatória.

Por padrão, o servidor sem periféricos aceita apenas conexões de loopback (127.0.0.1), portanto o SDK deve ser executado na mesma máquina. Para aceitar conexões de outros hosts (por exemplo, ao executar a CLI em um contêiner ou em um servidor separado), associe a um endereço que não seja de loopback com --host:

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

Aviso

Expor o servidor sem periféricos em um endereço diferente de loopback faz com que ele fique acessível a qualquer pessoa que tenha uma rota até esse endereço. Emparelhe-o com controles de rede (firewall, rede privada, proxy reverso) e autenticação apropriada para seu ambiente.

Conectando o SDK ao servidor externo

Depois que a CLI estiver em execução no modo de servidor, configure o cliente do SDK para se conectar a ele usando a opção "URL da CLI":

Idiomas 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: Quando cli_url / cliUrl /Go's UriConnection é fornecido ou o Rust usa Transport::External, o SDK não gerará ou gerenciará um processo da CLI - ele só se conectará ao servidor existente na URL especificada.

Telemetria e observabilidade

O SDK do Copilot dá suporte a OpenTelemetry para rastreamento distribuído. Forneça ao cliente uma configuração telemetry para permitir a exportação de rastreamentos do processo da CLI e a propagação automática de W3C Trace Context entre o SDK e a CLI.

Habilitando a telemetria

Passe uma configuração telemetry (ou Telemetry) ao criar o cliente. Essa é a aceitação— nenhum sinalizador "habilitado" separado é necessário.

Idiomas de código navigation

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

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

Dependência de par opcional: @opentelemetry/api

Opções de TelemetryConfig

OpçãoNode.jsPythonGoRustJava.NETDescription
Ponto de extremidade OTLPotlpEndpointotlp_endpointOTLPEndpointotlp_endpointotlpEndpointOtlpEndpointURL do ponto de extremidade OTLP HTTP
Caminho do arquivofilePathfile_pathFilePathfile_pathfilePathFilePathCaminho do arquivo para saída de rastreamento de linhas JSON
Tipo de exportadorexporterTypeexporter_typeExporterTypeexporter_typeexporterTypeExporterType
"otlp-http" ou "file"
Nome de origemsourceNamesource_nameSourceNamesource_namesourceNameSourceNameNome do escopo da instrumentação
Capturar conteúdocaptureContentcapture_contentCaptureContentcapture_contentcaptureContentCaptureContentSe o conteúdo da mensagem deve ser capturado

Exportação de arquivo

Para gravar rastros em um arquivo local em vez de um endpoint OTLP:

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

Propagação de contexto de traceamento

O contexto de rastreamento é propagado automaticamente— nenhuma instrumentação manual é necessária:

  •           **SDK → CLI**: os cabeçalhos `traceparent` e `tracestate` do span/atividade atuais são incluídos nas chamadas RPC `session.create`, `session.resume` e `session.send`.
    
  •           **CLI → SDK**: quando a CLI invoca manipuladores de ferramentas, o contexto de rastreamento do span da CLI é propagado para que o código da ferramenta seja executado sob o span pai correto.
    

📖 ** Instrumentação OpenTelemetry para o Copilot SDK** — opções de TelemetryConfig, propagação de contexto de rastreamento e dependências por idioma.

Saiba mais

Você fez isso! Você aprendeu os principais conceitos do SDK do GitHub Copilot:

  • ✅ Criando um cliente e uma sessão
  • ✅ Enviar mensagens e receber respostas
  • ✅ Streaming para saída em tempo real
  • ✅ Definindo ferramentas personalizadas que o Copilot pode invocar

Agora vá criar algo incrível! 🚀