资讯动态

GitHub Copilot SDK for Java 完整实战指南:从依赖接入到进程内模式、权限处理与工具开发

发布时间:2026/9/15 15:16:22 来源:尧图企业网站定制
GitHub Copilot SDK for Java 完整实战指南从依赖接入到进程内模式、权限处理与工具开发【免费下载链接】copilot-sdkMulti-platform SDK for integrating GitHub Copilot Agent into apps and services项目地址: https://gitcode.com/GitHub_Trending/co/copilot-sdk本指南围绕 java/README.md 展开系统讲解 Java 版 Copilot SDK 的接入方式、运行时连接策略、会话与消息模型、权限处理、工具开发、实验性 API 门禁以及 Auto 路由分层等核心能力。读完本文你将能够在自己的 Java 应用中通过 Maven/Gradle 引入该 SDK以编程方式控制 GitHub Copilot 运行时构建 AI 驱动的应用与 agent 工作流并完成自定义工具、权限拦截、会话恢复与内存配置等实战开发。一、SDK 定位与运行前提1.1 项目背景GitHub Copilot SDK for Java 提供了对 GitHub Copilot CLI 的编程控制能力使你可以在自己的 Java 应用中直接驱动 Copilot Agent构建 AI 赋能的业务应用与自动化工作流。该 SDK 与官方 Copilot SDK 家族TypeScript、Python、Go、.NET、Rust保持同步是同一套协议下的 Java 实现。1.2 环境要求Java 17 及以上官方推荐JDK 25。分发产物为多版本 JARMR-JAR使用maven.compiler.release17在 JDK 25 上编译。这意味着在 JDK 25 及更高版本运行时SDK 会自动为内部默认执行器启用虚拟线程Virtual Threads在 JDK 17/21 上则回退到普通线程。运行时二进制托管 stdio 与 TCP 连接默认会物化平台分类器classifier下的copilot-runtime[.exe]及相邻的runtime.node。可以通过显式指定cliPath或设置环境变量COPILOT_CLI_PATH来覆盖捆绑的运行时。从源码结构看CopilotClient 是整个 SDK 的入口类负责管理与 Copilot CLI 服务器的连接、创建与关闭会话其构造器接收 CopilotClientOptions 完成连接方式、日志级别、工作目录、环境变量等全局配置。二、安装与依赖引入2.1 Mavendependency groupIdcom.github/groupId artifactIdcopilot-sdk-java/artifactId version1.0.13/version /dependency2.2 Gradleimplementation com.github:copilot-sdk-java:1.0.132.3 Snapshot 开发版下一个开发版本的快照发布在 Maven Central Snapshots 仓库。需要显式添加快照仓库并依赖开发版本Mavenrepositories repository idcentral-snapshots/id urlhttps://central.sonatype.com/repository/maven-snapshots//url snapshotsenabledtrue/enabled/snapshots /repository /repositories dependency groupIdcom.github/groupId artifactIdcopilot-sdk-java/artifactId version1.0.14-SNAPSHOT/version /dependencyGradleimplementation com.github:copilot-sdk-java:1.0.14-SNAPSHOT注快照版本用于体验下一个版本的特性不建议在生产环境直接使用。三、运行时连接从子进程到进程内模式RuntimeConnection 是一个 sealed 抽象类定义了 SDK 与 Copilot 运行时之间的连接方式其四种实现对应四种连接策略工厂方法行为RuntimeConnection.forStdio()启动运行时子进程并通过 stdin/stdout 通信默认方式可用forStdio(path)指定可执行文件路径RuntimeConnection.forTcp()启动运行时子进程监听 TCP socket 并连接可通过.setPath(...)指定 copilot 路径RuntimeConnection.forUri(url)连接一个已运行的运行时url 支持port、host:port或完整 URLRuntimeConnection.forInProcess()进程内模式实验性通过 JNA 加载原生库基于 C ABI 通信不额外派生子进程3.1 进程内模式实验性进程内模式将 Copilot 运行时以原生库形式直接加载进当前 JVM 进程省去了进程管理与 IPC 开销简化部署。当前支持平台linux-x64glibc、linux-arm64glibc、win32-x64、win32-arm64、darwin-arm64。由于该模式是实验性的需要先通过下文「使用实验性 API」章节的机制显式 opt-in。额外依赖除了纯 Java SDK还需要按目标平台添加平台分类器classifier的原生运行时以及进程内模式必需的 JNAdependencies !-- Pure-Java SDK (~1.5 MB) -- dependency groupIdcom.github/groupId artifactIdcopilot-sdk-java/artifactId version${copilot.version}/version /dependency !-- Add the native runtime for the target platform -- dependency groupIdcom.github/groupId artifactIdcopilot-sdk-java-runtime/artifactId version${copilot.version}/version classifierlinux-x64/classifier /dependency !-- Use linux-arm64, win32-x64, win32-arm64, or darwin-arm64 on those target platforms -- !-- JNA (required for in-process mode) -- dependency groupIdnet.java.dev.jna/groupId artifactIdjna/artifactId version5.19.1/version /dependency /dependencies使用方式通过setConnection(RuntimeConnection.forInProcess())配置客户端CopilotClientOptions options new CopilotClientOptions() .setConnection(RuntimeConnection.forInProcess()); CopilotClient client new CopilotClient(options); client.start().get();在 SDK 源码中进程内连接由InProcessRuntimeConnection实现其底层通过com.github.copilot.ffi.FfiRuntimeHost加载平台原生库java/copilot-native/pom.xml 中对应的 Maven profilenative-linux-x64等负责按主机架构打包平台分类器 JAR。每个分类器 JAR 的native/classifier目录下包含runtime.node、platform.properties与copilot-runtime或copilot-runtime.exe不含旧的copilotSEA占位 JAR 保持 OS 中立、不含原生二进制。四、快速开始第一个 Copilot 会话以下完整示例演示「创建客户端 → 启动 → 创建会话 → 订阅事件 → 发送消息」的标准流程import com.github.copilot.CopilotClient; import com.github.copilot.generated.AssistantMessageEvent; import com.github.copilot.generated.SessionUsageInfoEvent; import com.github.copilot.rpc.MessageOptions; import com.github.copilot.rpc.PermissionHandler; import com.github.copilot.rpc.SessionConfig; public class CopilotSDK { public static void main(String[] args) throws Exception { var lastMessage new String[]{null}; // Create and start client try (var client new CopilotClient()) { client.start().get(); // Create a session var session client.createSession( new SessionConfig().setOnPermissionRequest(PermissionHandler.APPROVE_ALL).setModel(claude-sonnet-4.5)).get(); // Handle assistant message events session.on(AssistantMessageEvent.class, msg - { lastMessage[0] msg.getData().content(); System.out.println(lastMessage[0]); }); // Handle session usage info events session.on(SessionUsageInfoEvent.class, usage - { var data usage.getData(); System.out.println(\n--- Usage Metrics ---); System.out.println(Current tokens: data.currentTokens().intValue()); System.out.println(Token limit: data.tokenLimit().intValue()); System.out.println(Messages count: data.messagesLength().intValue()); }); // Send a message var completable session.sendAndWait(new MessageOptions().setPrompt(What is 22?)); // and wait for completion completable.get(); } boolean success lastMessage[0] ! null lastMessage[0].contains(4); System.exit(success ? 0 : -1); } }关键点解读CopilotClient实现了AutoCloseable在 try-with-resources 中会在close()时以 10 秒为上限优雅关闭运行时CopilotClient.java 中AUTOCLOSEABLE_TIMEOUT_SECONDS 10超时后强制终止。client.start()返回CompletableFuturecreateSession同样异步均需.get()等待完成。事件订阅通过session.on(ClassT, handler)完成生成的事件类型位于com.github.copilot.generated包。sendAndWait返回CompletableFuture等待整个回合完成后再继续而send则是 fire-and-forget。4.1 用 JBang 零配置运行如果你不想搭建完整 Java 工程可以直接使用 JBang包含会话空闲处理与用量事件等更多特性。直接在仓库中运行jbang https://github.com/github/copilot-sdk/blob/main/java/sdk/jbang-example.java本地执行文件首行的///usr/bin/env jbang声明使得文件本身可执行jbang java/sdk/jbang-example.java五、工作目录、MCP 工具与 AskUser 变体5.1 工作目录的两层设置CopilotClientOptions.setCwd(...)设置运行时进程的工作目录默认继承当前进程的工作目录SessionConfig.setWorkingDirectory(...)设置会话工作目录默认取运行时进程的工作目录。5.2 MCP 工具命名规则当通过setMcpServers(...)配置 MCP 工具时注意运行时工具名是server-key-tool-name的形式。不同 API 的引用形式不同配置位置工具名形式setAvailableTools(...)/setExcludedTools(...)优先使用源限定形式mcp:server-key-tool-nameCustomAgentConfig.setTools(...)直接使用server-key-tool-nameDefaultAgentConfig.setExcludedTools(...)直接使用server-key-tool-name5.3 AskUser 变体结构化 elicitationSessionConfig.setAskUserVariant(AskUserVariant.ELICITATION)在同时设置了 elicitation 处理器时会选用基于结构化表单的ask_user工具默认值为AskUserVariant.LEGACY。在冷恢复cold resume时需要通过ResumeSessionConfig重新提供该选项与处理器。六、消息来源MessageSource与多 Agent 消息路由MessageSource用于标记一条消息的来源区分用户输入、系统上下文与来自已标识 Agent 的消息。其定义位于 rpc/MessageSource.java核心实现MessageSource.USER序列化为user显式声明消息来自用户MessageSource.SYSTEM序列化为system用于应用生成的系统上下文MessageSource.agent(id)序列化为agent-id用于来自某已标识 Agent 的消息id 原样保留大小写与空白null 会被拒绝。import com.github.copilot.rpc.MessageOptions; import com.github.copilot.rpc.MessageSource; session.send(new MessageOptions() .setPrompt(The background build completed successfully.) .setSource(MessageSource.SYSTEM)).get(); session.sendAndWait(new MessageOptions() .setPrompt(The review found no blocking issues.) .setSource(MessageSource.agent(reviewer))).get();注意事项不设置source时SDK 会从请求中省略该字段保留运行时默认的用户输入行为也可以显式设置MessageSource.USER。消息来源与投递模式enqueue/immediate相互独立也不配置会话的系统提示词。sendAndWait接受与send相同的来源值。七、权限处理Permission Handling7.1 内置 APPROVE_ALL 处理器PermissionHandler.APPROVE_ALL在未启用托管设置managed settings时自动批准所有权限请求。其源码实现见 rpc/PermissionHandler.javaPermissionHandler APPROVE_ALL (request, invocation) - { if (invocation.isManagedSettingsEnabled()) { return CompletableFuture.failedFuture( new IllegalStateException(APPROVE_ALL cannot be used when managed settings are enabled)); } if (Boolean.TRUE.equals(request.getManagedApprovalRequired())) { return CompletableFuture.completedFuture(PermissionRequestResult.noResult()); } return CompletableFuture.completedFuture(PermissionRequestResult.approveOnce()); };要点当enableManagedSettings为 true 时APPROVE_ALL会以异常结束IllegalStateException即不允许在托管设置模式下盲批当getManagedApprovalRequired()为 true 时返回noResult()让其他连接的客户端或人工来回答该请求事件式权限分发中可以直接处理PermissionRequestedEvent并用PermissionRequest.fromJsonValue(event.getData().permissionRequest())将生成的事件值转换为带类型的元数据从而访问权限种类kind等信息。7.2 自定义权限处理器自定义处理器必须在应用基于 kind 的自动决策之前先检查托管审批import java.util.concurrent.CompletableFuture; import com.github.copilot.rpc.PermissionHandler; import com.github.copilot.rpc.PermissionRequestResult; PermissionHandler handler (request, invocation) - { if (Boolean.TRUE.equals(request.getManagedApprovalRequired())) { return CompletableFuture.completedFuture(PermissionRequestResult.noResult()); } return CompletableFuture.completedFuture(PermissionRequestResult.approveOnce()); };PermissionRequestResult支持多种决策类型如approveOnce()、REJECTED、APPROVED等枚举见PermissionRequestResultKind并提供了noResult()用于事件式分发中「放弃决策、交给他人」。八、基于注解的工具开发与 ToolInvocation 上下文8.1 CopilotTool 注解工具通过CopilotTool注解定义工具时参数类型为ToolInvocation的形参会被注入运行时上下文且不会暴露在工具 schema 中。ToolInvocation形参可以出现在 schema 可见参数之前、之间或之后位置不限import com.github.copilot.rpc.ToolInvocation; import com.github.copilot.tool.CopilotTool; import com.github.copilot.tool.CopilotToolParam; class ProgressTools { CopilotTool(Reports the current phase and session) public String reportProgress( CopilotToolParam(Current phase) String phase, ToolInvocation invocation) { return phase phase , sessionId invocation.getSessionId(); } }位置示例CopilotTool(Invocation first) public String report(ToolInvocation invocation, CopilotToolParam(Phase) String phase) { ... } CopilotTool(Invocation only) public String onlyContext(ToolInvocation invocation) { ... } CopilotTool(Invocation middle) public String report(CopilotToolParam(Phase) String phase, ToolInvocation invocation, CopilotToolParam(Limit) int limit) { ... }从 tool/CopilotTool.java 的注解定义看该注解还支持value()工具描述发送给模型name()工具名默认将方法名转换为 snake_caseoverridesBuiltInTool()是否覆盖内置工具skipPermission()是否跳过权限检查isTerminal()调用成功后是否结束本轮 agent 回合defer()工具延迟加载配置ToolDefermetadata()宿主自定义的命名空间元数据。九、内联 Lambda 工具定义实验性9.1 基本定义在会话构造处内联定义工具使用ToolDefinition.from(...)并显式提供参数元数据import com.github.copilot.rpc.ToolDefinition; import com.github.copilot.rpc.ToolDefer; import com.github.copilot.tool.Param; ToolDefinition search ToolDefinition .from( search_items, Searches indexed items by keyword, Param.of(String.class, keyword, Search keyword), keyword - Searching for: keyword) .skipPermission(true) .defer(ToolDefer.AUTO);9.2 参数元数据Param.of(...)Param.of(type, name, description)创建一个必填参数。对于带默认值的可选参数ParamInteger limit Param.of(Integer.class, limit, Max results, false, 10);即Param.of(type, name, description, required, defaultValue)其中false表示可选10为字符串形式的默认值。9.3 异步处理器使用fromAsync定义异步工具处理器import java.util.concurrent.CompletableFuture; ToolDefinition fetchData ToolDefinition.fromAsync( fetch_data, Fetches data from remote source, Param.of(String.class, url, Data source URL), url - CompletableFuture.supplyAsync(() - fetchRemote(url)) );9.4 ToolInvocation 上下文注入内联工具使用fromWithToolInvocation访问ToolInvocation运行时上下文ToolDefinition reportPhase ToolDefinition.fromWithToolInvocation( report_phase, Reports the current phase with invocation context, Param.of(String.class, phase, The current phase), (phase, invocation) - phase phase , toolCallId invocation.getToolCallId() );异步 上下文组合请使用fromAsyncWithToolInvocation。9.5 Fluent 选项修饰符链式调用 fluent 修饰符以设置工具选项.skipPermission(boolean)— 绕过权限提示.defer(ToolDefer)— 控制延迟执行AUTO、NEVER.overridesBuiltInTool(boolean)— 覆盖内置工具。设计背景与决策理由详见仓库内 docs/adr/adr-006-tool-definition-inline.mdADR-006。十、Auto 路由分层Auto Tier与运行中切换10.1 通过 CapiSessionOptions 配置使用CapiSessionOptions.setAutoTier(...)选择AutoTier.EFFICIENCY、AutoTier.BALANCE或AutoTier.INTELLIGENCE。该选项仅在模型为autoAuto 模式 V2时才有意义并且要求运行时版本支持capi.autoTierimport com.github.copilot.rpc.AutoTier; import com.github.copilot.rpc.CapiSessionOptions; import com.github.copilot.rpc.PermissionHandler; import com.github.copilot.rpc.SessionConfig; var config new SessionConfig() .setOnPermissionRequest(PermissionHandler.APPROVE_ALL) .setModel(auto) .setCapi(new CapiSessionOptions().setAutoTier(AutoTier.BALANCE));同一组选项也适用于ResumeSessionConfig.setCapi(...)并可与setEnableWebSocketResponses(false)组合。语义细节SDK 会省略未设置null的 tier创建时运行时选用自己的默认值恢复时保留持久化/当前 tier冷恢复cold resume时显式 tier 会覆盖持久化的 tier常驻恢复resident resume时不同的 tier 会请求一次「安全切换」在恢复成功之后应用无法改变已经在途in-flight的回合SDK 本身不选择默认值也不管理 tier 的持久化。生命周期规则详见 docs/features/session-persistence.md 中的 Auto tier persistence 小节。10.2 会话过程中切换 Auto tier不改动所选模型即可调整 Auto 路由偏好。注意运行时不会立即生效它会记录请求并等到后续使用auto模型的用户回合成功从 provider 获取可用模型后才提交因此pending状态只代表「被接受」不代表「已生效」。同一时刻只保留最近一次请求。通过以下方式观察结果成功时session.model_change事件失败时临时性的session.auto_tier_switch_failed事件任何时刻通过会话的model.getCurrentRPC 方法读取权威的 committed、pending、activating 偏好。var result session.setAutoTier(AutoTier.INTELLIGENCE).get(); if (result.status() ModelSwitchAutoTierStatus.PENDING) { // Accepted, but not yet in effect. } // Return to the providers default Auto routing. session.setAutoTier(null).get();setModel(SetModelOptions)也接受同样的偏好通过SetModelOptions.setAutoTier(...)可以在选择auto的同时原子地暂存 tier若要恢复 provider 默认路由应调用setResetAutoTier(true)——这两个选项互斥。十一、Session Store 与持久化 Memory11.1 Session StoreSessionConfig上的enableSessionStore启用跨会话存储用于跨会话的搜索与检索默认CopilotClientMode.COPILOT_CLI模式下未显式设置时应用运行时默认启用CopilotClientMode.EMPTY模式下默认关闭。11.2 持久化 Memory会话记忆会话可以按需启用持久记忆允许 Agent 跨回合读写记忆。记忆按会话配置同时适用于createSession与resumeSessionimport com.github.copilot.rpc.MemoryConfiguration; import com.github.copilot.rpc.PermissionHandler; import com.github.copilot.rpc.ResumeSessionConfig; import com.github.copilot.rpc.SessionConfig; // Enable memory for a new session var session client.createSession(new SessionConfig() .setOnPermissionRequest(PermissionHandler.APPROVE_ALL) .setModel(gpt-5) .setMemory(new MemoryConfiguration().setEnabled(true)) ).get(); // Disable memory for a new session var sessionNoMemory client.createSession(new SessionConfig() .setOnPermissionRequest(PermissionHandler.APPROVE_ALL) .setModel(gpt-5) .setMemory(new MemoryConfiguration().setEnabled(false)) ).get(); // Configure memory while resuming var resumed client.resumeSession(sessionId, new ResumeSessionConfig() .setOnPermissionRequest(PermissionHandler.APPROVE_ALL) .setMemory(new MemoryConfiguration().setEnabled(true)) ).get();当memory未设置时不发送任何记忆配置应用运行时默认在COPILOT_CLI模式下 SDK 保持memory未设置由运行时决定在EMPTY模式下默认关闭除非显式设置。十二、实验性 API 门禁CopilotExperimental 与 AllowCopilotExperimental12.1 编译期强制门禁部分 SDK API 使用CopilotExperimental标记如RuntimeConnection.forInProcess()、CopilotTool注解等。这些 API 可能在未来的版本中无通知地变更或移除。默认情况下代码引用实验性 API 会触发编译期错误error: Use of experimental API ExperimentalType in field type is not allowed. Add AllowCopilotExperimental or compiler option -Acopilot.experimental.allowedtrue to opt in.两种 opt-in 方式在消费的类、方法或构造器上标注AllowCopilotExperimental向 Java 编译器传递注解处理器参数-Acopilot.experimental.allowedtrue。12.2 代码内 opt-inimport com.github.copilot.AllowCopilotExperimental; import test.ExperimentalType; AllowCopilotExperimental public class Consumer { private ExperimentalType field; public ExperimentalType getIt() { return field; } AllowCopilotExperimental public ExperimentalType echo(ExperimentalType value) { return value; } }12.3 Maven 配置plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId configuration compilerArgs arg-Acopilot.experimental.allowedtrue/arg /compilerArgs /configuration /plugin12.4 Gradle 配置tasks.withType(JavaCompile) { options.compilerArgs [-Acopilot.experimental.allowedtrue] }12.5 处理器能捕获什么处理器CopilotExperimentalProcessor.java基于标准 JSR 269 注解处理 API检测声明declaration层面的实验性类型使用使用模式是否被捕获用实验性类型声明的字段✅实验性类型的方法参数✅实验性类型的方法返回类型✅extends/implements实验性类型✅throws实验性异常类型✅实验性泛型实参如ListExperimentalType✅12.6 已知局限由于处理器只检查声明而不检查方法体内部表达式以下模式不会被捕获使用模式是否被捕获变通方案方法体内的new ExperimentalType()无字段/参数声明❌使用编译器 flag 全量编译 opt-in内联调用ExperimentalType.staticMethod()❌同上方法引用ExperimentalType::method❌同上实验性类型的局部变量含var推断❌将使用移入处理器可见的声明中或使用编译器 flag转换为实验性类型cast❌使用编译器 flag实际上这些缺口影响很小对实验性 SDK 类型的有意义使用几乎总是出现在字段声明、方法签名或类型层级中——这些都会被捕获。唯一会漏网的是完全没有声明足迹的纯内联表达式如session.rpc().experimental.foo().join()。12.7 门禁的作用边界单个方法上的CopilotExperimental也会触发门禁即使类型本身稳定类型级注解存在时通过该类型的所有成员访问都被视为实验性AllowCopilotExperimental遵循相同的声明级边界标注类则对该类及其内部声明 opt-in标注方法/构造器则只对该可执行签名 opt-in。完整设计理由参见 docs/adr/adr-004-copilotexperimental.mdADR-004。十三、每会话 GitHub 凭据轮换对于需要轮换每会话 GitHub 凭据的场景使用SessionConfig.setGitHubTokenProvider(...)或ResumeSessionConfig上等价的 setter不要使用setGitHubToken(...)var config new SessionConfig() .setGitHubTokenProvider(args - acquireForHost(args.host()).thenApply(token - GitHubTokenProviderResult.token(token, 8 * 60 * 60))) .setOnPermissionRequest(PermissionHandler.APPROVE_ALL);语义要点剩余有效期remaining lifetime是必填的回调完成时必须为正数生产环境 GitHub token 通常有效 8 小时静态 token 与 token provider 二者互斥不能同时设置首次获取发生在会话创建或恢复期间取消、provider 错误或无效 token 响应会拒绝该操作而不是回退到环境认证空闲会话只在下次需要凭据的操作之前刷新没有后台刷新定时器。十四、开发环境搭建与构建验证14.1 基本构建开发需要JDK 25 或更高版本以及受支持的 Node.js 版本nodejs/README.md 的 Prerequisites 小节。以下步骤验证「用 JDK 25 构建的产物在 25 与 17 上都能运行」保持 MR-JAR 行为# Clone the repository git clone https://github.com/github/copilot-sdk.git cd copilot-sdk/java # Build and test with JDK 25 mvn test-compile jar:jar mvn verify -Dskip.test.harnesstrue # Set your paths for JDK 17 # Run the JDK 25 built jar with JDK 17 JVM for tests. Do not re-compile the jar. mvn jacoco:prepare-agentwire-up-coverage-instrumentation antrun:runprint-test-jdk-banner surefire:test failsafe:integration-test failsafe:verify jacoco:reportbuild-coverage-report-from-tests -Denforcer.skiptrue14.2 格式化与 lint在仓库根目录执行just format-java应用格式化、just lint-java检查格式与 Javadoc这两个 recipe 也包含在just format与just lint中。没有just时在java/下执行等价的 Maven 命令# Apply formatting mvn -pl sdk spotless:apply # Check formatting and Javadoc mvn -pl sdk spotless:check checkstyle:checkCI 对两项检查都有强制Spotless 在 CI 中显式运行单跑mvn verify不会检查格式。14.3 原生嵌入开发原生运行时相关 Maven 命令需在java目录下执行。原生打包除了 JDK 25 与 Maven 外还需要 Node.js因为copilot-native/scripts/fetch-native.mjs会从对应 GitHub release 获取固定的运行时包。Linux glibc 主机当设置copilot.native.libcglibc时Maven 会按架构激活native-linux-x64或native-linux-arm64profile。Windows x64 / Windows ARM64 / Apple Silicon macOS上会自动激活native-win32-x64、native-win32-arm64或native-darwin-arm64。对应 profile 会校验主机、运行原生脚本测试、在generate-resources阶段从对应github/copilot-clirelease 获取固定平台包、在package阶段打包分类器 JAR 并校验其原生内容。Linux x64 校验与完整进程内测试node copilot-native/scripts/validate-native-host.mjs linux-x64 mvn -pl copilot-native clean verify -Dcopilot.native.libcglibcinprocess测试 profile 会自动执行同样的校验与原生打包因此完整的进程内测试命令为mvn -Pinprocess clean verifymacOSApple Silicon与 Linux ARM64 分别node copilot-native/scripts/validate-native-host.mjs darwin-arm64 mvn -Pinprocess clean verifynode copilot-native/scripts/validate-native-host.mjs linux-arm64 mvn -Pinprocess clean verify -Dcopilot.native.libcglibcIntel macOS、Linux musl 等不支持的主机不要设置copilot.native.libcglibc。普通构建只产出 OS 中立的 primary、sources 与 Javadoc JAR不运行原生脚本测试、不下载/暂存原生文件、也不产出平台分类器 JAR。任何主机上若要只构建 OS 中立产物或覆盖 glibc opt-in可禁用原生下载与打包mvn -pl copilot-native clean package -DskipTests -Dcopilot.native.libcglibc -Dcopilot.native.skip.downloadtrue14.4 产物结构每个分类器 JAR 在native/classifier目录下包含runtime.node、platform.properties与copilot-runtime或copilot-runtime.exe不含旧的copilotSEA占位 JAR 保持 OS 中立、不含任何原生二进制。十五、社区生态与许可当前公开的第三方使用案例包括 JMeter Copilot Plugin基于 JMeter 的 AI 辅助负载测试插件。如果你也希望展示自己的项目可以通过 PR 方式向官方列表提交。本 SDK 采用 MIT 许可详见仓库根目录的 LICENSE。结语通过本指南你可以看到GitHub Copilot SDK for Java 提供了从「托管子进程」到「进程内原生库」的完整运行时接入矩阵并以流式 fluent API 覆盖会话创建、事件订阅、权限治理、工具开发、消息路由、Auto tier、持久记忆与实验性 API 门禁等 AI 应用开发所需的核心能力。建议下一步动手实践先用 sdk/jbang-example.java 跑通首个会话再逐步引入自定义CopilotTool工具与自定义权限处理器最后按需评估进程内模式与 Auto tier 在生产场景中的收益。【免费下载链接】copilot-sdkMulti-platform SDK for integrating GitHub Copilot Agent into apps and services项目地址: https://gitcode.com/GitHub_Trending/co/copilot-sdk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价