Skip to main content

Использование комплектного CLI с Copilot SDK

Упаковывайте Второй пилот CLI вместе с приложением, чтобы пользователям не пришлось что-либо устанавливать или настраивать отдельно.

Кто может использовать эту функцию?

GitHub Copilot SDK Доступна со всеми Copilot тарифными планами.

Примечание.

          Второй пилот SDK в настоящее время находится в Technical Preview. Функциональность и доступность могут меняться.

Отправляйте Второй пилот CLI их в составе приложения, чтобы пользователи могли начать без дополнительной настройки.

          **Лучше всего для:** Десктопные приложения, отдельные инструменты, приложения Electron и распространяемые утилиты CLI.

Принцип работы

Вместо того чтобы полагаться на глобально установленный CLI, вы включаете бинарный файл CLI в свой пакет приложений. SDK указывает на вашу комплектную копию через эту cliPath опцию. Ключевые характеристики:

  • Бинарный файл CLI поставляется вместе с вашим приложением — отдельная установка не требуется.
  • Вы контролируете точную версию CLI, которую использует ваше приложение.
  • Пользователи аутентифицируются через ваше приложение, переменные среды или BYOK.
  • Сессии управляются каждым пользователем на их машине.

Setup

Шаг 1: Включите CLI в свой проект

CLI распространяется как часть @github/copilot пакета npm.

npm install @github/copilot

Шаг 2: Направьте SDK на ваш комплектный CLI

Node.js / TypeScript

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

const client = new CopilotClient({
    // Point to the CLI binary in your app bundle
    cliPath: path.join(__dirname, "vendor", "copilot"),
});

const session = await client.createSession({ model: "gpt-4.1" });
const response = await session.sendAndWait({ prompt: "Hello!" });
console.log(response?.data.content);

await client.stop();

Python

from copilot import CopilotClient, PermissionHandler
from pathlib import Path

client = CopilotClient({
    "cli_path": str(Path(__file__).parent / "vendor" / "copilot"),
})
await client.start()

session = await client.create_session(on_permission_request=PermissionHandler.approve_all, model="gpt-4.1")
response = await session.send_and_wait({"prompt": "Hello!"})
print(response.data.content)

await client.stop()

Вперед

client := copilot.NewClient(&copilot.ClientOptions{
    CLIPath: "./vendor/copilot",
})
if err := client.Start(ctx); err != nil {
    log.Fatal(err)
}
defer client.Stop()

session, _ := client.CreateSession(ctx, &copilot.SessionConfig{Model: "gpt-4.1"})
response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: "Hello!"})
fmt.Println(*response.Data.Content)

.NET

var client = new CopilotClient(new CopilotClientOptions
{
    CliPath = Path.Combine(AppContext.BaseDirectory, "vendor", "copilot"),
});

await using var session = await client.CreateSessionAsync(
    new SessionConfig { Model = "gpt-4.1" });

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = "Hello!" });
Console.WriteLine(response?.Data.Content);

Стратегии аутентификации

При объединении CLI нужно решить, как ваши пользователи будут аутентифицироваться. Следующая диаграмма иллюстрирует распространённые закономерности.

Диаграмма, показывающая варианты стратегии аутентификации для комплектного развертывания CLI.

Вариант A: Авторизованные учетные данные пользователя (самое простое)

Пользователь входит в CLI один раз, и ваше приложение, входящее в комплект, использует эти учетные данные. Лишний код не требуется — это поведение по умолчанию.

const client = new CopilotClient({
    cliPath: path.join(__dirname, "vendor", "copilot"),
    // Default: uses signed-in user credentials
});

Вариант B: токен через переменную среды

Установите токен программно или попросите пользователей установить его перед запуском приложения:

const client = new CopilotClient({
    cliPath: path.join(__dirname, "vendor", "copilot"),
    env: {
        COPILOT_GITHUB_TOKEN: getUserToken(),
    },
});

Замените getUserToken() его логикой в вашем приложении, которая забирает токен OAuth GitHub пользователя.

Вариант C: BYOK (аутентификация не GitHub требуется)

Если вы сами управляете ключами провайдера модели, пользователям не нужны GitHub аккаунты:

const client = new CopilotClient({
    cliPath: path.join(__dirname, "vendor", "copilot"),
});

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

Управление сеансами

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

const client = new CopilotClient({
    cliPath: path.join(__dirname, "vendor", "copilot"),
});

// Create a session tied to the user's project
const sessionId = `project-${projectName}`;
const session = await client.createSession({
    sessionId,
    model: "gpt-4.1",
});

// Resume the session in a later run
const resumed = await client.resumeSession(sessionId);

Состояние сессии хранится по ~/.copilot/session-state/SESSION-ID/адресу , где SESSION-ID находится указанный вами идентификатор сессии.

Паттерны распределения

Десктопное приложение (Electron, Tauri)

Включите бинарный файл CLI в каталог ресурсов вашего приложения:

import { app } from "electron";
import path from "path";

const cliPath = path.join(
    app.isPackaged ? process.resourcesPath : __dirname,
    "copilot"
);

const client = new CopilotClient({ cliPath });

Инструмент CLI

Для распределяемых инструментов CLI определите путь относительно вашего бинарного файла:

import { fileURLToPath } from "url";
import path from "path";

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const cliPath = path.join(__dirname, "..", "vendor", "copilot");

const client = new CopilotClient({ cliPath });

Платформенно-специфичные бинарные файлы

При распространении для нескольких платформ указывайте правильный бинар для каждой цели:

my-app/
├── vendor/
│   ├── copilot-darwin-arm64    # macOS Apple Silicon
│   ├── copilot-darwin-x64      # macOS Intel
│   ├── copilot-linux-x64       # Linux x64
│   └── copilot-win-x64.exe     # Windows x64
└── src/
    └── index.ts
import os from "os";

function getCLIPath(): string {
    const platform = process.platform;   // "darwin", "linux", "win32"
    const arch = os.arch();              // "arm64", "x64"
    const ext = platform === "win32" ? ".exe" : "";
    const name = `copilot-${platform}-${arch}${ext}`;
    return path.join(__dirname, "vendor", name);
}

const client = new CopilotClient({
    cliPath: getCLIPath(),
});

Ограничения

ОграничениеСведения
          **Размер пучка** | Бинарный файл CLI увеличивает размер дистрибутива вашего приложения. |

| Обновления | Вы управляете обновлениями версий CLI в цикле релиза. | | Построение платформ | Для каждой ОС/архитектуры нужны отдельные бинарные файлы. | | Одиночный пользователь | Каждый комплектный экземпляр CLI обслуживает одного пользователя. |

Дальнейшие действия