Skip to main content

Создайте своё первое приложение на базе Copilot

В этом уроке вы будете использовать Copilot SDK для создания помощника командной строки. Вы начнёте с основ, добавляете потоковые ответы, затем добавляете пользовательские инструменты — давая Copilot возможность вызывать ваш код.

Что вы создадите:

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!

Необходимые условия

Прежде чем начать, убедитесь, что у вас есть:

  • GitHub Copilot CLI установлен и аутентифицирован (Руководство по установке)
  • Ваш предпочтительный языковой режим выполнения:
    • Node.js 20+ или Python 3.11+ или Go 1.24+ или Rust 1.94+ или Java 17+ или .NET 8.0+

Убедитесь, что CLI работает:

copilot --version

Шаг 1: установка SDK

Языки кода navigation

TypeScript

Сначала создайте новый каталог и инициализуйте проект:

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

Затем установите SDK и TypeScript runner:

npm install @github/copilot-sdk tsx

Шаг 2: отправьте первое сообщение

Создайте новый файл и добавьте следующий код. Это самый простой способ использовать SDK — около 5 строк кода.

Языки кода navigation

TypeScript

Создайте 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);

Запустите его:

npx tsx index.ts

Вам стоит увидеть:

4

Поздравляем! Вы только что создали своё первое приложение на базе Copilot.

Шаг 3: добавляйте ответы на поток

Сейчас вы ждёте полного ответа, прежде чем что-либо увидеть. Давайте сделаем это интерактивным, транслируя ответы по мере их генерации.

Языки кода navigation

TypeScript

Обновление 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);

Запусти код ещё раз. Вы увидите, как ответ будет появляться слово за словом.

Методы подписки на события

SDK предоставляет методы подписки на события сессии:

МетодDescription
on(handler)Подписывайтесь на все события; Возвращает функцию отписки
on(eventType, handler)Оформите подписку на конкретный тип события (Node.js/TypeScript); Возвращает функцию отписки
subscribe()Подписывайтесь на все события (Rust); Фильтр по event_type

Языки кода 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();

Шаг 4: добавить кастомный инструмент

А теперь о сильной части. Давайте дадим Copilot возможность вызывать ваш код, определив кастомный инструмент. Мы создадим простой инструмент для поиска погоды.

Языки кода navigation

TypeScript

Обновление 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);

Запустите его, и вы увидите, как Copilot позвонит в ваш инструмент для получения погодных данных, а затем ответит с результатами!

Шаг 5: создайте интерактивного помощника

Давайте объединим всё это в полезного интерактивного помощника:

Языки кода 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();

Проведите с:

npx tsx weather-assistant.ts

Пример сеанса:

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

Вы создали ассистента с помощью кастомного инструмента, который Copilot может вызвать!

Как работают средства

Когда вы определяете инструмент, вы говорите Copilot:

  1. Что делает инструмент (описание)
  2. Какие параметры нужны (схема)
  3. Какой код запускать (обработчик)

Copilot решает, когда вызвать ваш инструмент, исходя из вопроса пользователя. Когда это происходит:

  1. Copilot отправляет запрос на вызов инструмента с параметрами
  2. SDK запускает функцию обработчика
  3. Результат отправляется обратно в Copilot
  4. Copilot включает результат в свой ответ

Что дальше?

Теперь, когда у вас есть основы, вот более мощные возможности для изучения:

Подключение к серверам MCP

Серверы MCP (Model Context Protocol) предоставляют готовые инструменты. Подключитесь к MCP-серверу GitHub, чтобы дать Copilot доступ к репозиториям, проблемам и pull requests:

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

📖 ** Using MCP servers with the GitHub Copilot SDK** — Узнайте о локальных и удалённых серверах, всех настройках и решении неполадок.

Создание настраиваемых агентов

Определите специализированные ИИ-персоны для конкретных задач:

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

Совет

Вы также можете настроить agent: "pr-reviewer" в конфигурации сессии предвыбор этого агента с самого начала. Подробности смотрите в АВТОЗАГОЛОВКЕ .

Настройка системного сообщения

Контролируйте поведение и личность ИИ, добавляя инструкции:

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

Для более тонкого управления используйте mode: "customize" переобозначение отдельных разделов системного запроса, сохраняя остальные:

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

Доступные идентификаторы разделов: identity, tone, tool_efficiency, environment_context, code_change_rules, , guidelines, safety``tool_instructions``custom_instructions``runtime_instructions``last_instructions.

Каждое переопределение поддерживает четыре действия: replace, remove, appendи prepend. Неизвестные идентификаторы разделов обрабатываются изящно — к дополнительным инструкциям добавляется содержимое и появляется предупреждение; remove на неизвестных участках молча игнорируется.

См. языковые READMEs SDK для примеров в TypeScript, Python, Go, Rust, Java и C#.

Подключение к внешнему CLI-серверу

По умолчанию SDK автоматически управляет жизненным циклом процесса Copilot CLI, запуская и останавливая CLI по мере необходимости. Однако можно отдельно запустить CLI в серверном режиме и подключить к нему SDK. Это может быть полезно для:

  • Отладка: Оставляйте CLI включённым между перезагрузками SDK для проверки логов
  • Совместное использование ресурсов: несколько SDK-клиентов могут подключаться к одному и тому же CLI-серверу
  • Разработка: запускайте CLI с пользовательскими настройками или в другой среде

Запуск CLI в серверном режиме

Запустите CLI в серверном режиме с помощью --headless флага и, по желанию, укажите порт:

copilot --headless --port 4321

Если вы не указываете порт, CLI выберет случайный доступный порт.

По умолчанию безголовый сервер принимает соединения только через loopback (127.0.0.1), поэтому SDK должен работать на той же машине. Чтобы принять соединения от других хостов (например, при запуске CLI в контейнере или на отдельном сервере), привяжьте к адресу без обратной связи с --host:

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

Предупреждение

Открытие безголового сервера на не-лупбэк-адресе делает его доступным для любого, кто может маршрутизироваться по этому адресу. Сочетайте его с сетевыми контролями (файрвол, частная сеть, обратный прокси) и аутентификацией, подходящей для вашей среды.

Подключение SDK к внешнему серверу

Когда CLI заработает в серверном режиме, настройте SDK-клиент для подключения к нему через опцию «cli url»:

Языки кода 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 });
// ...

Примечание: Когда cli_url / cliUrl предоставляется UriConnection / Go, или использует Rust Transport::External, SDK не создаёт и не управляет CLI-процессом — он подключается только к существующему серверу по указанному URL.

Телеметрия и наблюдаемость

SDK Copilot поддерживает OpenTelemetry для распределённого трассировки. Предоставить клиенту telemetry конфигурацию для включения экспорта трасс из процесса CLI и автоматического распространения контекста W3C Trace между SDK и CLI.

Включение телеметрии

Передайте конфигурацию telemetry (или Telemetry) при создании клиента. Это опция для включения — отдельный флаг «включено» не требуется.

Языки кода navigation

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

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

Опциональная зависимость от пиров: @opentelemetry/api

Опции TelemetryConfig

ОпцияNode.jsPythonGoRustJava.NETDescription
Конечная точка OTLPotlpEndpointotlp_endpointOTLPEndpointotlp_endpointotlpEndpointOtlpEndpointURL конечной точки OTLP HTTP
Путь к файлуfilePathfile_pathFilePathfile_pathfilePathFilePathПуть файла для вывода JSON-lines trace
Тип экспортераexporterTypeexporter_typeExporterTypeexporter_typeexporterTypeExporterType
"otlp-http" или "file"
Имя источникаsourceNamesource_nameSourceNamesource_namesourceNameSourceNameНазвание области приборов
Захват контентаcaptureContentcapture_contentCaptureContentcapture_contentcaptureContentCaptureContentНужно ли фиксировать содержимое сообщений

Экспорт файлов

Чтобы записать трассы в локальный файл вместо конечной точки OTLP:

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

Распространение контекста следов

Trace context распространяется автоматически — не требуется ручное инструментирование:

  • SDK → CLI: traceparent и tracestate заголовки текущего диапазона/активности включены в session.create, session.resumeи session.send RPC-вызовы.
  • CLI → SDK: Когда CLI вызывает обработчики инструментов, контекст трассировки из span-а CLI распространяется, чтобы ваш инструмент работал под правильным родительским span.

📖 ** Инструментация OpenTelemetry для Copilot SDK**—Опции TelemetryConfig, распространение контекста трассировки и зависимости по языкам.

Узнать больше

Ты сделал это! Вы изучили основные концепции SDK GitHub Copilot:

  • ✅ Создание клиента и сессии
  • ✅ Отправка сообщений и получение ответов
  • ✅ Стриминг для выхода в реальном времени
  • ✅ Определение пользовательских инструментов, которые Copilot может вызывать

А теперь иди и построй что-то потрясающее! 🚀