GitHub는 Copilot SDK for Java를 발표했습니다. 이는 Java 서버 애플리케이션이 프로그래밍 방식으로 Copilot 에이전트를 제어할 수 있도록 하는 클라이언트 라이브러리로, 에이전트 세션을 생성하고 도구를 등록하며 프롬프트를 보내고 구조화된 응답을 받을 수 있습니다. GitHub는 이 라이브러리가 Java 프레임워크에 독립적으로 설계되었으며 BYOK 옵션도 지원하므로 특정 AI 공급업체에 종속되지 않는다고 설명합니다.
이 라이브러리는 엔터프라이즈 애플리케이션의 Java 개발자를 대상으로 하며 Jakarta EE와 Spring을 비롯한 서버 환경에서 작동합니다. 특정 프레임워크에 종속된 접근 방식을 강제하는 대신 CompletableFuture, 어노테이션, 람다, 가상 스레드 등 Java 개발자에게 익숙한 API를 사용합니다.
가용성 및 요구 사항
이 라이브러리는 현재 Maven 의존성으로 제공되며 버전은 1.0.7-preview.1입니다. 사용하려면 다음이 필요합니다.
- JDK 17 또는 JDK 25. 가상 스레드와 기타 최신 기능을 활용하려면 JDK 25 사용이 권장됩니다.
- Maven 3.9 이상.
- 활성 Copilot 구독이 있는 GitHub 계정.
- 버전 1.0.71 이상의 Copilot CLI가 로컬에 설치되어 있어야 합니다.
GitHub의 게시물은 Jakarta EE 11을 기반으로 구축된 완전한 예제 애플리케이션을 소개하며, 실험을 위한 소스 코드도 제공합니다. 또한 회사는 개발자가 원하는 Java 프레임워크와 라이브러리를 사용해 자체 에이전트를 구축할 수 있다고 강조합니다.
부동산 요청 관리 예제 애플리케이션
이 예제는 부동산 부문의 잠재 고객을 관리하는 애플리케이션을 사용합니다. 고객이 런던에서 침실 3개인 주택을 80만 파운드 미만의 가격으로 찾아 달라는 요청과 같은 요구를 보내면, 시스템은 가상 스레드에서 격리된 Copilot 에이전트를 생성해 정의된 작업 흐름에 따라 요청을 처리합니다.
이 애플리케이션은 Jakarta WebSocket을 사용해 서버에서 브라우저로 실시간 상태 업데이트를 보내므로, 도구가 호출되는 동안 에이전트의 진행 상황을 확인할 수 있습니다. 또한 여러 요청을 동시에 보낼 수 있으며, 각 요청은 자체 Copilot 세션에서 독립적으로 처리됩니다.
도구 정의 및 관리
이 라이브러리는 모델이 호출할 수 있는 도구를 정의하기 위한 @CopilotTool 인터페이스를 제공합니다. 개발자는 일반적인 Java 메서드를 정의하고, 라이브러리가 JSON 스키마 생성, 인수 분석 및 호출 배포를 처리합니다. 각 인수를 설명하기 위해 @CopilotToolParam을 사용할 수 있으며, 이를 통해 모델이 요구되는 값을 알 수 있습니다.
이 어노테이션 인터페이스는 현재 실험 단계이므로 컴파일러 옵션 -Acopilot.experimental.allowed=true를 통해 실험적 SDK 인터페이스를 활성화해야 하며, Maven 설정에서 해당 라이브러리를 어노테이션 프로세서 경로에 등록해야 합니다. 프로세서는 컴파일 과정에서 도구 메타데이터를 생성합니다.
어노테이션 외에도 ToolDefinition.from(...)을 사용한 람다 방식으로 사용 위치에서 직접 도구를 정의할 수 있습니다. 이를 통해 전용 메서드 없이 도구를 생성할 수 있으며, overridesBuiltInTool(true) 옵션을 사용하면 내장 도구를 사용자 지정 동작으로 대체할 수 있습니다. 또한 에이전트 로직과 분리된 클래스에 도구를 배치한 다음 ToolDefinition.fromObject를 통해 등록할 수도 있습니다.
메시지 및 에이전트 작업 흐름
SDK는 SystemMessageMode.CUSTOMIZE를 통해 시스템 메시지를 사용자 지정할 수 있도록 하며, 특정 섹션만 대체하고 안전장치를 포함한 나머지 메시지는 유지할 수 있습니다. 또한 기본 시스템 메시지를 대체하지 않고 콘텐츠를 추가하는 APPEND 모드도 제공합니다.
에이전트의 전체 작업 흐름은 sendAndWait(...)를 통해 시작됩니다. 프롬프트가 전송되면 모델은 추론하고 등록된 도구를 여러 차례 호출한 뒤 최종 결과를 반환할 수 있으며, 라이브러리는 작업이 완료될 때까지 도구 결과를 모델에 전달합니다. 가상 스레드를 사용하면 결과를 기다리는 동안 기존 스레드를 점유하지 않고 get()을 통해 대기할 수 있습니다. 또한 session.on(...)을 사용하면 세션에서 발생하는 이벤트를 처리할 수 있습니다.