
GA(General Availability)된 GitHub Copilot SDK (.NET)를 사용해 보았다
요약
GitHub Copilot SDK가 GA(General Availability)되어 .NET을 포함한 다양한 언어를 지원합니다. 이 SDK를 통해 앱이나 서비스에 Copilot의 에이전트 엔진을 통합하여 계획 수립, 도구 호출, 파일 편집 등의 기능을 구현할 수 있습니다.
핵심 포인트
- GitHub Copilot SDK GA 출시 및 .NET NuGet 패키지 지원
- 에이전트 기능(Planning, Tool Invocation, File Edits) 통합 가능
- Node.js, Python, Go, .NET, Rust, Java 등 폭넓은 언어 지원
- BYOK(Bring Your Own Key)를 통한 자체 모델 엔드포인트 지정 가능
서론
GitHub Copilot SDK가 2026-06-02에 GA(General Availability)되었습니다.
이것은 GitHub Copilot의 agentic engine을 앱이나 서비스, 개발 도구에 통합할 수 있도록 하는 SDK입니다. GA를 통해 안정적인 API와 production-ready support가 제공됩니다. 간단히 말하면, 계획을 세우거나, 도구를 호출하거나, 파일을 편집하거나, 여러 턴의 세션(multi-turn sessions)을 SDK에서 다룰 수 있게 됩니다.
지원 언어는 Node.js/TypeScript, Python, Go, .NET, Rust, Java로 폭넓게 갖춰져 있으며, .NET용으로는 GitHub.Copilot.SDK라는 NuGet 패키지가 공개되어 있습니다. 주요 기능으로는 planning, tool invocation, file edits, streaming, multi-turn sessions, MCP, BYOK, hook system 등이 있습니다. 여러 기능이 있어 재미있을 것 같네요.
SDK 리포지토리는 다음과 같습니다.
.NET 버전의 README는 다음과 같습니다.
전부 다루면 내용이 길어지므로, 이 기사에서는 샘플을 실행하며 직접 다뤄본 범위로 한정하여 소개하겠습니다.
최소 구성으로 Hello World
먼저 가장 단순한 부분부터 시도해 봅시다. net10.0 콘솔 앱에 다음 NuGet 패키지를 추가합니다.
GitHub.Copilot.SDK
1.0.1
작성한 코드는 다음과 같습니다.
using GitHub.Copilot;
using System.Text.Encodings.Web;
using System.Text.Json;
...
CopilotClient를 new 하여 CreateSessionAsync로 세션을 열고, SendAndWaitAsync로 메시지를 보내 완료를 기다리기만 하면 됩니다. new CopilotClient()는 GitHub Copilot CLI의 기본 인증 정보를 사용합니다. 기본적으로 SDK 측의 runtime이 사용되므로, 앱 측에서 GitHub Copilot CLI 명령어를 직접 호출할 필요는 없습니다. GitHub Copilot을 사용하기 위한 인증 정보가 갖춰져 있다면 동작합니다. 실행 결과는 다음과 같았습니다.
{
"data": {
"apiCallId": "msg_bdrk_0123456789abcdef...",
...
제대로 응답이 왔네요. 반환값을 JSON으로 직렬화(serialize)해 보면, content에는 응답 텍스트, model에는 사용한 모델명, outputTokens에는 토큰 수 등이 들어 있음을 알 수 있습니다.
BYOK도 시도하기
GitHub Copilot의 GitHub 측 모델을 사용할 뿐만 아니라, BYOK(Bring Your Own Key)로서 자체 모델 엔드포인트(endpoint)를 지정할 수도 있습니다. 공식 changelog에서도 BYOK를 언급하고 있지만, 구체적인 provider type이나 인증 정보 지정 방법은 GitHub Docs의 BYOK 문서에 정리되어 있습니다.
SDK의 BYOK 문서에서는 OpenAI는 `
공식 문서의 .NET quick start에서는 API key를 ApiKey에 전달하는 방식이지만, ProviderConfig의 레퍼런스에는 bearerToken / bearer_token도 있습니다. 문서에도 "베어러 토큰 인증 (apiKey보다 우선됩니다)"라고 적혀 있으므로, OpenAI 호환 엔드포인트 (endpoint)에 Bearer token으로 접속하고 싶다면 BearerToken을 사용하면 됩니다.
단, BearerToken은 정적인 문자열로 취급됩니다. SDK가 자동으로 업데이트해 주는 것이 아니므로, 토큰의 유효 기간이 만료되는 경우에는 새로운 토큰으로 세션을 다시 생성하는 설계가 필요합니다.
using Azure.Identity;
using GitHub.Copilot;
using System.Text.Encodings.Web;
...
실행 결과는 다음과 같았습니다.
{
"data": {
"apiCallId": "resp_0123456789abcdef...",
...
gpt-5.4로부터 제대로 응답이 왔습니다. BYOK를 사용하면 서버 사이드 (server-side)에서 동작하는 에이전트 (Agent)를 만들 때도 선택지에 들어올 것 같다는 생각이 듭니다.
이벤트를 구독하여 내부 동작 확인하기
SendAndWaitAsync는 심플하고 사용하기 편리하지만, 내부에서 어떤 이벤트가 흐르고 있는지 확인해 보겠습니다.
최종 답변만 받고 싶은 경우에는 Streaming = true가 필수 사항은 아닙니다. 이번에는 AssistantMessageDeltaEvent 등의 차분 (delta) 이벤트를 다루어 스트리밍 (streaming) 표시를 하고 싶으므로, 명시적으로 Streaming = true를 지정합니다. session.On<SessionEvent>()로 이벤트를 구독하면, 응답의 차분이나 각종 알림을 받을 수 있습니다.
사용하는 NuGet 패키지는 처음과 동일합니다.
GitHub.Copilot.SDK 1.0.1
using GitHub.Copilot;
using System.Text.Encodings.Web;
using System.Text.Json;
...
차분 이벤트까지 직접 확인하려면 SendAndWaitAsync 대신 SendAsync로 메시지를 보내고, SessionIdleEvent가 도착할 때까지 TaskCompletionSource로 기다리는 방식으로 구현하면 다루기 쉽습니다. 실행하면 다음과 같은 이벤트들이 흐릅니다.
GitHub.Copilot.SystemMessageEvent
GitHub.Copilot.SessionToolsUpdatedEvent
GitHub.Copilot.UserMessageEvent
...
흥미로운 점은 SessionUsageInfoEvent의 내용입니다. systemTokens가 7047, toolDefinitionsTokens가 7892로, 도구 정의 (tool definition) 설명만으로도 상당한 토큰을 소비하고 있습니다. GitHub Copilot CLI가 보유한 도구군 정의가 백그라운드에서 확실하게 쌓여 있다는 뜻이며, 과연 그렇구나 하는 느낌을 줍니다. 처음에 SystemMessageEvent와 SessionToolsUpdatedEvent가 오는 것도, Copilot이 세션 시작 시 시스템 메시지와 도구 목록을 셋업 (setup) 하기 때문입니다.
Copilot SDK를 통해 .NET 앱 만들기
다음으로, 파일 생성 및 편집, 셸 커맨드 (shell command) 실행이 필요한 작업을 요청해 보겠습니다. 그러한 조작을 수행하기 전에 Copilot이 앱 측에 권한을 요청하는 메커니즘이 마련되어 있으며, CreateSessionAsync의 OnPermissionRequest에서 제어할 수 있습니다.
사용하는 NuGet 패키지는 다음과 같습니다. Permission 관련 타입은 GitHub.Copilot.Rpc 네임스페이스 (namespace)에 있습니다.
GitHub.Copilot.SDK 1.0.1
using GitHub.Copilot;
using GitHub.Copilot.Rpc;
var WorkingDirectory = Path.Combine(Path.GetTempPath(), "copilot-sdk-lab");
...
PermissionDecision
주변이 experimental (실험적) API이므로 #pragma warning disable GHCP001이 필요합니다. ApproveOnce()뿐만 아니라 Reject() 등도 포함하여 permission decision (권한 결정) API 전체가 대상이라는 이미지입니다. 앞으로 안정화되면 좋겠네요.
참고로, 이번에는 샘플을 짧게 만들기 위해 shell/read/write를 모두 승인했습니다. 실제 앱에 통합할 경우에는 실행되는 명령, 읽기/쓰기 대상 경로, 쓰기 차분(diff)을 보고 판단하는 것이 좋습니다.
실행하면 다음과 같이 동작합니다.
Permission requested: shell ... dotnet new console -n HelloCopilot --output HelloCopilot
ToolExecutionStartEvent: powershell, {"command":"... dotnet new console ...","description":"Create new .NET console app","initial_wait":30}
...
...
Console.WriteLine("こんにちは GitHub Copilot SDK の世界へ!");
실행 결과
こんにちは GitHub Copilot SDK の世界へ!
.NET의 top-level statements (최상위 문) 구문을 사용한 한 줄짜리 심플한 콘솔 앱입니다. dotnet run으로 정상적으로 실행 및 표시되었습니다.
dotnet new console로 프로젝트를 생성 → view로 현재 내용 확인 → edit로 문자열을 수정 → dotnet run으로 실행하는 흐름입니다. 각 타이밍마다 shell/read/write/shell의 permission request (권한 요청)가 들어오며, 마지막에 Copilot이 코드와 실행 결과를 종합하여 보고해 주었습니다. 자연어로 요청했을 때 .NET 앱을 만들어서 실행해 주는 것은 솔직히 감동적입니다.
Microsoft Agent Framework에서 사용하기
마지막으로 Microsoft.Agents.AI.GitHub.Copilot 1.10.0-rc1 (집필 시점 기준 RC)을 추가하여, Agent Framework의 AIAgent 추상화 레이어 (abstraction layer)를 통해 동일한 작업을 시도해 봅니다. Agent Framework 연재와도 관련된 내용이지만, 이 기사에서는 Copilot SDK GA의 응용 사례로서 가볍게 소개합니다.
사용하는 NuGet 패키지는 다음과 같습니다.
GitHub.Copilot.SDK 1.0.1
Microsoft.Agents.AI.GitHub.Copilot 1.10.0-rc1 (RC)
using GitHub.Copilot;
using GitHub.Copilot.Rpc;
using Microsoft.Extensions.AI;
...
client.AsAIAgent(sessionConfig: ...)로 CopilotClient를 Agent Framework의 AIAgent로 변환하고, agent.CreateSessionAsync()로 세션을 생성합니다. agent.RunAsync()의 두 번째 인자로 동일한 세션을 전달함으로써, 첫 번째 요청 내용과 실행 이력을 바탕으로 두 번째 질문을 할 수 있습니다.
RunAsync의 반환값에는 최종 답변뿐만 아니라 세션 중에 발생한 이벤트도 ChatMessage.Contents의 RawRepresentation으로 포함되어 있습니다. RawRepresentation is SessionEvent로 캐스팅하면 타입에 따른 처리를 작성할 수 있습니다. 실행하면 다음과 같은 흐름이 됩니다 (이벤트 나열은 발췌).
참고로 Agent Framework의 GitHubCopilotAgent 구현에서는 sessionConfig가 지정되지 않았다면 new SessionConfig { Streaming = true }가 사용됩니다. 또한, 집필 시점에 사용 중인 Microsoft.Agents.AI.GitHub.Copilot 1.10.0-rc1 버전에서는 sessionConfig를 지정한 경우에도 어댑터(adapter) 내에서 Streaming = true로 설정됩니다. 이 부분은 SDK 단독으로 SendAndWaitAsync만 사용하는 경우와는 약간 뉘앙스가 다릅니다.
그렇기 때문에 Agent Framework를 경유하는 이벤트 열에는 AssistantStreamingDeltaEvent나 AssistantMessageDeltaEvent와 같은 스트리밍 계열의 이벤트도 섞이게 됩니다. 여기서는 전부 다 다루면 내용이 길어지므로, 흐름을 파악할 수 있는 범위 내에서만 발췌하였습니다.
Permission requested for shell command: ... dotnet new console ...
Permission requested for read: ...\HelloCopilot\Program.cs
Permission requested for write: HelloCopilot\Program.cs
...
```csharp
Console.WriteLine("こんにちは GitHub Copilot SDK の世界へ!");
🎉 실행 결과
こんにちは GitHub Copilot SDK の世界へ!
======================================
Permission requested for shell command: ... dotnet build
...
...
復元이 완료되었습니다 (0.3 초)
HelloCopilot net10.0 성공했습니다 (0.1 초)
→ bin\Debug\net10.0\HelloCopilot.dll
0.9 초 후에 성공했습니다 를 빌드
첫 번째 실행에서 앱을 만들고 실행한 후, 동일한 세션에서 "컴파일 결과를 알려줘"라고 요청하자, 이전에 만든 HelloCopilot 프로젝트에 대해 dotnet build를 실행하여 결과를 반환해 주었습니다. 세션의 문맥(context)이 제대로 유지되고 있네요.
요약
SDK로서 가볍게 구성되어 있어, 로컬에서 동작하는 에이전트(Agent) 개발의 첫 번째 후보로 삼아도 좋을 것 같습니다. CopilotClient를 생성하고 CreateSessionAsync를 호출하는 것만으로 빠르게 동작하는 점은 솔직히 경험 측면에서 매우 좋습니다.
도구 승인(tool approval) 관련 사항(PermissionDecision 관련 #pragma warning disable GHCP001)이 아직 실험적(experimental) 단계이므로, 이 부분이 향후 안정화된다면 매우 반가울 것 같습니다. 이 부분이 Agent Framework와 심리스(seamless)하게 연동될 수 있다면 더할 나위 없겠네요.
Agent Framework 연동에 대해서는, 이번에 Agent Framework 측이 RC 버전이었기 때문에, 이 또한 GA(General Availability)되어 더 자연스럽게 조합할 수 있게 된다면 훨씬 사용하기 편리해질 것입니다. BYOK(Bring Your Own Key)와 조합하면, GitHub Copilot의 에이전틱 엔진(agentic engine) 기반으로 서버 사이드 에이전트를 만들 때도 고려 대상이 될 수 있습니다. 개인적으로는 다양한 유스케이스(use case)에서 사용해 보고 싶습니다.
그럼, 즐거운 GitHub Copilot 라이프 되시길!
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기