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 실행기를 설치합니다.

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는 세션 이벤트를 구독하는 메서드를 제공합니다.

MethodDescription
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(모델 컨텍스트 프로토콜) 서버는 미리 빌드된 도구를 제공합니다. GitHub MCP 서버에 연결하여 리포지토리, 문제 및 끌어오기 요청에 Copilot 액세스 권한을 부여합니다.

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

📖 ** Using MCP servers with the GitHub Copilot SDK** - 로컬 서버와 원격 서버, 모든 구성 옵션 및 문제 해결에 대해 알아봅니다.

사용자 지정 에이전트 만들기

특정 작업에 대한 특수한 AI 페르소나를 정의합니다.

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" 수도 있습니다. 자세한 내용은 사용자 정의 에이전트 및 하위 에이전트 오케스트레이션 을 참조하세요.

시스템 메시지 사용자 지정

지침을 추가하여 AI의 동작 및 성격을 제어합니다.

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

사용 가능한 섹션 ID: identity,, tone, tool_efficiency``environment_context, code_change_rules``guidelines, safety``tool_instructions, . custom_instructions``runtime_instructions``last_instructions

각 재정의는 네 가지 작업(replace, remove, append, prepend)을 지원합니다. 알 수 없는 섹션 ID는 문제없이 처리됩니다. 내용은 추가 지침에 덧붙여지고 경고가 발생합니다. 알 수 없는 섹션의 remove는 별도 경고 없이 무시됩니다.

TypeScript 예제는 언어별 SDK README를 참조하세요. Python, Go, Rust, JavaC#.

외부 CLI 서버에 연결

기본적으로 SDK는 필요에 따라 CLI를 시작하고 중지하여 Copilot CLI 프로세스 수명 주기를 자동으로 관리합니다. 그러나 서버 모드에서 별도로 CLI를 실행하고 SDK를 연결할 수도 있습니다. 이 기능은 다음과 같은 경우에 유용할 수 있습니다.

  • 디버깅: 로그를 검사하기 위해 SDK 다시 시작 간에 CLI를 계속 실행합니다.
  • 리소스 공유: 여러 SDK 클라이언트가 동일한 CLI 서버에 연결할 수 있습니다.
  • 개발: 사용자 지정 설정 또는 다른 환경에서 CLI 실행

서버 모드에서 CLI 실행

플래그를 사용하여 서버 모드에서 CLI를 --headless 시작하고 필요에 따라 포트를 지정합니다.

copilot --headless --port 4321

포트를 지정하지 않으면 CLI에서 사용 가능한 임의 포트를 선택합니다.

기본적으로 헤드리스 서버는 루프백(127.0.0.1)의 연결만 허용하므로 SDK는 동일한 컴퓨터에서 실행되어야 합니다. 다른 호스트(예: 컨테이너 또는 별도의 서버에서 CLI를 실행하는 경우)의 연결을 허용하려면 다음을 사용하여 루프백이 아닌 주소 --host에 바인딩합니다.

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

경고

비 루프백 주소에 헤드리스 서버를 노출하면 해당 주소로 라우팅할 수 있는 모든 사용자가 연결할 수 있습니다. 네트워크 컨트롤(방화벽, 프라이빗 네트워크, 역방향 프록시) 및 사용자 환경에 적합한 인증과 페어링합니다.

외부 서버에 SDK 연결

CLI가 서버 모드에서 실행되면 "cli url" 옵션을 사용하여 연결하도록 SDK 클라이언트를 구성합니다.

코드 언어 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 });
// ...

참고: /Go가 cli_url 제공되거나 Rust가 사용되는 / 경우cliUrl``UriConnection``Transport::ExternalSDK는 CLI 프로세스를 생성하거나 관리하지 않습니다. 지정된 URL의 기존 서버에만 연결됩니다.

원격 분석 및 관찰 가능성

Copilot SDK는 분산 추적을 위해 OpenTelemetry 지원합니다. telemetry CLI 프로세스에서 추적 내보내기 및 SDK와 CLI 간의 자동 W3C 추적 컨텍스트 전파를 사용하도록 클라이언트에 구성을 제공합니다.

원격 분석 사용

클라이언트를 생성할 때 telemetry(또는 Telemetry) 구성 객체를 전달하세요. 이는 옵트인입니다. 별도의 "사용" 플래그가 필요하지 않습니다.

코드 언어 navigation

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

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

선택적 피어 종속성: @opentelemetry/api

'TelemetryConfig' 설정 옵션

OptionNode.jsPythonGo러스트Java.NETDescription
OTLP 엔드포인트otlpEndpointotlp_endpointOTLPEndpointotlp_endpointotlpEndpointOtlpEndpointOTLP HTTP 엔드포인트 URL
파일 경로filePathfile_pathFilePathfile_pathfilePathFilePathJSON 줄 추적 출력에 대한 파일 경로
내보내기 형식exporterTypeexporter_typeExporterTypeexporter_typeexporterTypeExporterType
"otlp-http" 또는 "file"
원본 이름sourceNamesource_nameSourceNamesource_namesourceNameSourceName계측 범위 이름
콘텐츠 캡처captureContentcapture_contentCaptureContentcapture_contentcaptureContentCaptureContent메시지 콘텐츠를 캡처할지 여부

파일 내보내기

OTLP 엔드포인트 대신 로컬 파일에 추적을 쓰려면 다음을 수행합니다.

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

추적 컨텍스트 전파

추적 컨텍스트는 자동으로 전파되며 수동 계측이 필요하지 않습니다.

  • SDK → CLI: 현재 span/activity의 traceparenttracestate 헤더가 session.create, session.resume, 그리고 session.send RPC 호출에 포함됩니다.
  • CLI → SDK: CLI가 도구 처리기를 호출하면 CLI 범위의 추적 컨텍스트가 전파되므로 도구 코드가 올바른 부모 범위에서 실행됩니다.

📖 ** 코필로트 SDK용 OpenTelemetry 계측** - TelemetryConfig 옵션, 추적 컨텍스트 전파 및 언어별 종속성입니다.

자세히 알아보기

잘 했어요! GitHub Copilot SDK의 핵심 개념을 알아보았습니다.

  • ✅ 클라이언트 및 세션 만들기
  • ✅ 메시지 보내기 및 응답 받기
  • ✅ 실시간 출력을 위한 스트리밍
  • ✅ Copilot 호출할 수 있는 사용자 지정 도구 정의

이제 멋진 것을 만들어 보세요! 🚀