เปิดตัว GitHub Copilot SDK สำหรับ Java ยกระดับการพัฒนา Enterprise AI แบบไร้ข้อจำกัดเฟรมเวิร์ก

เปิดตัว GitHub Copilot SDK สำหรับ Java ยกระดับการพัฒนา Enterprise AI แบบไร้ข้อจำกัดเฟรมเวิร์ก

นักพัฒนา Java ไม่จำเป็นต้องพึ่งพาแนวทางเฉพาะของเฟรมเวิร์ก Java อีกต่อไปในการขับเคลื่อน AI จากแอปพลิเคชันระดับองค์กร

แม้จะเป็นเรื่องจริงที่ Langchain4j ช่วยเพิ่มขีดความสามารถให้นักพัฒนาโดยการยกเลิกการยึดติดกับผู้ให้บริการ AI เฉพาะราย แต่คุณก็ยังต้องพึ่งพา Langchain4j อยู่ดี และสำหรับ Spring AI แน่นอนว่าคุณต้องพึ่งพาการตัดสินใจในการออกแบบโดย Spring หากไม่ใช่ตัว Spring เอง

ตอนนี้ GitHub Copilot SDK สำหรับ Java คือวิธีแรกที่ไม่ยึดติดกับเฟรมเวิร์ก (framework agnostic) อย่างแท้จริงในการขับเคลื่อน AI จาก Java และด้วยการรองรับ BYOK ทำให้ GitHub Copilot SDK สำหรับ Java ยังไม่ยึดติดกับผู้ให้บริการ AI (AI vendor neutral) อีกด้วย

💡 แม้จะเรียกว่า GitHub Copilot SDK แต่คุณสามารถใช้งานกับผู้ให้บริการโมเดลโดยตรงรายใดก็ได้ เช่น OpenAI, Azure, Anthropic หรือเอนด์พอยต์ที่เข้ากันได้กับ OpenAI โดยการส่ง provider/ProviderConfig พร้อมกับ baseUrl + apiKey (หรือ bearer token) ของคุณเอง โดยไม่จำเป็นต้องมีการสมัครสมาชิก Copilot

GitHub Copilot SDK สำหรับ Java เป็นไลบรารีฝั่งไคลเอนต์ที่ช่วยให้โค้ด Java ฝั่งเซิร์ฟเวอร์ของคุณสามารถสร้าง Copilot agent sessions, ลงทะเบียนเครื่องมือ (tools), ส่งพรอมต์ และรับการตอบกลับที่มีโครงสร้าง ทั้งหมดนี้ทำได้ผ่านการเขียนโปรแกรม โดยทำงานได้ในสภาพแวดล้อมเซิร์ฟเวอร์ รวมถึง Jakarta EE และ Spring

หากคุณสร้าง Enterprise Java มาเป็นระยะเวลาหนึ่ง SDK นี้จะให้ความรู้สึกที่คุ้นเคย เพราะทั้ง CompletableFuture, annotations, lambdas และ virtual threads ทั้งหมดถูกรวมไว้ที่นี่แล้ว

โพสต์นี้จะแสดงวิธีใช้งาน SDK, พาชมแอปพลิเคชันตัวอย่าง Jakarta EE 11 ที่สมบูรณ์ และทิ้งท้ายด้วยขั้นตอนถัดไปที่เป็นรูปธรรมเพื่อให้คุณได้ลองด้วยตัวเอง ผมเลือก Jakarta EE 11 สำหรับการสาธิตเพราะผมเป็นหัวหน้าผู้ประสานงานการปล่อยตัว (lead release coordinator) สำหรับเวอร์ชันนั้น ผมเชื่อในมาตรฐานเปิดว่าเป็นวิธีที่ดีที่สุดในการเพิ่มพลังให้นักพัฒนา สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Jakarta EE 11 ดูได้ที่ บทความ InfoQ นี้

แอปตัวอย่างนี้เป็นโครงสร้างตัวแทน (agent harness) โดยใช้ Jakarta EE 11 แต่แน่นอนว่านักพัฒนาสามารถสร้างโครงสร้างตัวแทนของตนเองโดยใช้เฟรมเวิร์กและไลบรารี Java ที่มีชื่อเสียงตามที่ต้องการได้

คัดลอกแอปตัวอย่างและลองด้วยตัวเอง >

จะรับ SDK ได้ที่ไหน

SDK นี้พร้อมใช้งานในรูปแบบ Maven dependency:

<dependency>
    <groupId>com.github</groupId>
    <artifactId>copilot-sdk-java</artifactId>
    <version>1.0.7-preview.1</version>
</dependency>

สิ่งที่ต้องมีก่อน:

  • JDK 17 หรือ 25 (แนะนำ 25 — เพื่อปลดล็อก virtual threads และฟีเจอร์สมัยใหม่อื่นๆ)
  • Maven 3.9+
  • บัญชี GitHub พร้อมการสมัครสมาชิก Copilot ที่ใช้งานอยู่
  • ติดตั้ง Copilot CLI ในเครื่องที่เวอร์ชัน 1.0.71 หรือใหม่กว่า

พาชมแอปพลิเคชันตัวอย่าง

วิธีที่ดีที่สุดในการดู SDK ทำงานคือการรัน แอปพลิเคชันตัวอย่างนี้

รับโค้ด

git clone https://github.com/microsoft/Build26-BRK206-your-agent-anywhere-multiclient-multidevice-with-github-copilot-sdk.git
cd Build26-BRK206-your-agent-anywhere-multiclient-multidevice-with-github-copilot-sdk/src/java-agent-orchestrator
mvn clean package liberty:run
# เปิด http://localhost:9080/index.xhtml

การสาธิต Java สร้างขึ้นบน:

หน้าที่เทคโนโลยี
RuntimeOpen Liberty 26.0.0.5
PlatformJakarta EE 11 (Faces 4.1, CDI 4.1, WebSocket 2.2, Data 1.0, Persistence 3.2)
UIPrimeFaces 15.0.16
AI orchestrationCopilot SDK for Java 1.0.7-preview.1
DatabaseH2 in-memory (รายการอสังหาริมทรัพย์เริ่มต้น 10 รายการ)

แอปพลิเคชันทำอะไรได้บ้าง

แอปพลิเคชันนี้เป็นไพพ์ไลน์ตัวแทนจัดการลีดอสังหาริมทรัพย์ (real-estate lead-management agent pipeline) ลูกค้าส่งคำถามเข้ามา เช่น “ฉันกำลังมองหาบ้าน 3 ห้องนอนในลอนดอนราคาต่ำกว่า £800,000” และระบบจะสร้าง Copilot Agent ที่แยกอิสระบน virtual thread เพื่อประมวลผลผ่านไพพ์ไลน์:

Application flow diagram showing the pipeline stages: Customer Enquiry flows to QUEUED, then VALIDATING, which branches to either SEARCHING (if genuine) or REJECTED (if spam/off-topic). SEARCHING leads to WRITING_REPORT (if matches found) or NO MATCHES. WRITING_REPORT completes at DONE.

สถาปัตยกรรมนี้ใช้ Jakarta WebSocket เพื่อพุชการอัปเดตสถานะแบบเรียลไทม์จากเซิร์ฟเวอร์ไปยังเบราว์เซอร์ เพื่อให้คุณสามารถดูตัวแทนดำเนินการผ่านเฟสต่างๆ ในขณะที่โมเดลเรียกใช้เครื่องมือ:

Application architecture diagram showing Browser with Pipeline Dashboard connecting to Open Liberty server containing AppState, CopilotClient in EMPTY mode, virtual thread agents, and WebSocket push for real-time UI updates.

คุณสามารถส่งคำถามหลายรายการพร้อมกันเพื่อดูตัวแทน virtual-thread ที่ทำงานขนานกัน โดยแต่ละรายการจะประมวลผลอย่างอิสระด้วย Copilot session ของตนเอง

Screenshot of the sample application showing the pipeline dashboard with multiple enquiries being processed concurrently. Screenshot of the sample application showing detailed agent event log and property search results.

ฟีเจอร์ของ SDK ที่กำลังทำงาน

ลองมาดูฟีเจอร์หลักของ SDK ตามที่ปรากฏในโค้ดตัวอย่าง

การกำหนดเครื่องมือด้วย @CopilotTool

นี่คือ API หลัก หากคุณเคยเขียนเอนด์พอยต์ @GET ใน JAX-RS หรือ @MessageDriven bean สิ่งนี้จะให้ความรู้สึกที่คุ้นเคยในทันที:

@CopilotTool(value = "Sets the current phase of the agent. Use this to report progress.",
             name = "set_current_phase")
public String setCurrentPhase(
        @CopilotToolParam("The phase to transition to (VALIDATING, SEARCHING, "
                + "WRITING_REPORT, REJECTED_GARBAGE, REJECTED_NO_MATCHES, or DONE)")
        String phaseName) {
    phase = Phase.valueOf(phaseName.trim().toUpperCase(Locale.ROOT));
    notifyUi();
    return "Phase set to " + phase.getLabel();
}

การใช้ annotation @CopilotTool เป็นการประกาศเมธอดให้เป็นเครื่องมือที่โมเดลสามารถเรียกใช้ได้ ส่วน @CopilotToolParam จะอธิบายพารามิเตอร์เพื่อให้โมเดลเข้าใจข้อมูลที่ต้องส่ง โดย SDK จะจัดการการสร้าง JSON Schema การแยกวิเคราะห์อาร์กิวเมนต์ และการส่งงาน (dispatch) ทั้งหมดให้โดยอัตโนมัติ

สิ่งที่ต้องเตรียมในการสร้างสำหรับ @CopilotTool ปัจจุบัน API นี้เป็นฟีเจอร์ทดลอง (experimental) คุณจึงต้องกำหนดค่าใน Maven build ดังนี้:

  1. เปิดใช้งาน experimental APIs: ส่งค่า -Acopilot.experimental.allowed=true ไปยังคอมไพเลอร์ มิฉะนั้น annotation processor จะไม่สร้างข้อมูลเมตา
  2. ลงทะเบียน annotation processor: เพิ่ม SDK เป็น annotationProcessorPath เพื่อให้คอมไพเลอร์หาโปรเซสเซอร์เจอและสร้างคลาส $$CopilotToolMeta ในขั้นตอนคอมไพล์

ทั้งสองส่วนถูกกำหนดค่าไว้ใน maven-compiler-plugin เรียบร้อยแล้ว:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.15.0</version>
    <configuration>
        <compilerArgs>
            <arg>-Acopilot.experimental.allowed=true</arg>
        </compilerArgs>
        <annotationProcessorPaths>
            <path>
                <groupId>com.github</groupId>
                <artifactId>copilot-sdk-java</artifactId>
                <version>1.0.7-preview.1</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

หากต้องการลงทะเบียนเครื่องมือทั้งหมดจากอ็อบเจกต์ ให้ใช้คำสั่ง List<ToolDefinition> annotatedTools = ToolDefinition.fromObject(this);

เครื่องมือแบบ Inline lambda ด้วย ToolDefinition.from(...)

เมื่อต้องการกำหนดเครื่องมือที่จุดเรียกใช้งานโดยไม่ต้องมีเมธอดเฉพาะ ให้ใช้รูปแบบ lambda:

ToolDefinition reportIntentTool = ToolDefinition
        .from("report_intent",
              "Reports the current intent of the agent",
              Param.of(String.class, "intent", "Intent in max 4 words"),
              (String intent) -> {
                  currentIntent = intent;
                  addEvent(Instant.now(), "intent", "Intent updated", intent);
                  notifyUi();
                  return "ok";
              })
        .overridesBuiltInTool(true);

การใช้ .overridesBuiltInTool(true) ช่วยให้คุณแทนที่เครื่องมือที่มีมาให้ในตัว (built-in tool) เพื่อกำหนดพฤติกรรมเฉพาะตามที่คุณต้องการได้

การสแกนเครื่องมือข้ามคลาส

เครื่องมือไม่จำเป็นต้องอยู่ในคลาสเดียวกับตรรกะตัวแทน ตัวอย่างเช่น searchProperties ที่กำหนดไว้ใน CDI bean แยกต่างหาก ซึ่งสามารถลงทะเบียนผ่าน ToolDefinition.fromObject(propertyDatabase) เพื่อให้ตัวแทนเรียกใช้งานได้

@ApplicationScoped
public class PropertyDatabase {
 
@CopilotTool(value = "Searches the real estate listings database. "
                       + "Returns up to 10 matching properties.",
                 name = "search_properties")
    public List<Property> searchProperties(
            @CopilotToolParam("Property type substring (e.g. 'flat', 'house')") String type,
            @CopilotToolParam("City substring (e.g. 'London', 'Bristol')") String city,
            @CopilotToolParam("Minimum number of bedrooms (0 for no minimum)") int minBedrooms,
            @CopilotToolParam("Maximum price in GBP (0 for no maximum)") double maxPriceGbp) {
        // ... filter and return matching properties ...
    }
}

การปรับแต่งข้อความระบบ (System Message)

SDK ให้คุณควบคุมข้อความระบบได้อย่างละเอียดผ่าน SystemMessageMode.CUSTOMIZE เพื่อแทนที่ส่วนเฉพาะ เช่น IDENTITY โดยที่ยังคงระบบความปลอดภัยเริ่มต้นไว้

SystemMessageConfig systemMessage = new SystemMessageConfig()
        .setMode(SystemMessageMode.CUSTOMIZE)
        .setSections(Map.of(SystemMessageSections.IDENTITY,
            new SectionOverride()
                .setAction(SectionOverrideAction.REPLACE)
                .setContent("""
                    You are part of a real estate recommendation system.
                    You will receive enquiries from customers, and you must
                    carry out the following workflow...
                    """)));

ลูปการทำงานของตัวแทน: sendAndWait(...)

คุณสามารถเริ่มลูปการทำงานที่สมบูรณ์ได้ด้วยบรรทัดเดียว โดยใช้ .sendAndWait(escapedEnquiry).get() ซึ่ง SDK จะจัดการเรื่องการให้เหตุผล การเรียกใช้เครื่องมือ และส่งการตอบกลับขั้นสุดท้ายให้โดยอัตโนมัติบน virtual thread

session = client.createSession(sessionConfig).get();
// ...
AssistantMessageEvent result = session.sendAndWait(escapedEnquiry).get();

การจัดการเหตุการณ์แบบเรียลไทม์ด้วย session.on(...)

คุณสามารถสร้าง UI ที่ตอบสนองได้รวดเร็วโดยการสมัครรับเหตุการณ์ของเซสชัน เพื่อดึงข้อมูลการเรียกใช้เครื่องมือหรือข้อความจากผู้ช่วยมาแสดงผลแบบเรียลไทม์ผ่าน WebSocket

sessionSubscription = session.on(event -> {
    captureSessionEvent(event);
    uiUpdateSocket.pushDetailUpdate(id);
});

Headless client และการจัดการสิทธิ์

ไคลเอนต์ถูกออกแบบมาเพื่อทำงานฝั่งเซิร์ฟเวอร์โดยตรง โดยไม่ต้องผ่าน IDE ผ่านโหมด CopilotClientMode.EMPTY และสามารถกำหนดนโยบายการขออนุญาตเรียกใช้เครื่องมือได้ผ่าน PermissionHandler ซึ่งในตัวอย่างนี้ใช้ APPROVE_ALL เพื่อความสะดวกในการพัฒนา

รูปแบบการรวมเข้ากับ Jakarta EE

SDK นี้ทำงานร่วมกับ Jakarta EE ได้อย่างเป็นธรรมชาติ โดยเฉพาะจุดเชื่อมต่อสำคัญอย่าง Executor ซึ่งใช้ร่วมกับ ManagedThreadFactory ของ Jakarta Concurrency เพื่อให้คอนเทนเนอร์จัดการเธรดและส่งต่อบริบท (CDI, JNDI) ได้อย่างถูกต้อง

การใช้ virtual="true" ใน server.xml ของ Open Liberty ช่วยให้เราสร้าง virtual threads ที่คอนเทนเนอร์จัดการได้ ซึ่งจะส่งต่อบริบทไปยังเครื่องมือต่างๆ ทำให้เมธอดอย่าง searchProperties() สามารถ @Inject และใช้งาน JPA repository ได้ทันที

สรุป

GitHub Copilot SDK สำหรับ Java มอบประสบการณ์ Java แท้ๆ (Java-native) ที่รองรับทั้ง virtual threads, การกำหนดเครื่องมือที่ยืดหยุ่น, และการควบคุมข้อความระบบอย่างแม่นยำ โดยสามารถทำงานร่วมกับ Jakarta EE และ Spring ได้อย่างไร้รอยต่อในรูปแบบ Headless

สำหรับผู้ที่สนใจ สามารถเริ่มต้นได้จากการลองใช้งาน BYOK กับผู้ให้บริการโมเดลที่คุณต้องการ หรือคัดลอกแอปตัวอย่างไปรันเพื่อดูพลังของ virtual threads ในการจัดการ AI agent หลายเซสชันพร้อมกัน

คัดลอกแอปตัวอย่างและลองด้วยตัวเอง >

Source: GitHub Blog
ดูแลงานแปลและเรียบเรียงโดย NatapolK

ความคิดเห็น (0)

เข้าสู่ระบบเพื่อร่วมแสดงความเห็น

สมัครสมาชิก

มาเป็นคนแรกที่แสดงความเห็นกันเลยโบร