纯 Java SDK —— 通过 HTTP、SSE、WebSocket 与本地 CLI 等独立通道对接 OpenClaw Gateway
当前分支:
feature/2.0.x版本:2.0.x.x.20260630-SNAPSHOTJDK 基线:8 项目状态:稳定(1.0.x 线)。尚未发布 Maven Central;制品通过 Aliyun Maven 仓库与 GitHub Releases 分发。
openclaw-java-sdk 是面向 Java 开发者的纯 Java 库,通过 OpenClaw Gateway 的全部外部通信面进行对接:HTTP Chat Completions / Embeddings / Responses / Webhook / Tools Invoke、用于双向流式的 WebSocket 控制面,以及本地 openclaw CLI。
- 不是 OpenClaw Gateway 本身,也不是 LLM 推理引擎。
- 无 Spring、Servlet 或 ORM 依赖。
- 不承诺未经兼容矩阵验证的 JDK 或框架组合。
| 场景 | 推荐入口 | 结果 |
|---|---|---|
| 纯 Java 对话(阻塞) | client.chatCompletion(...) |
OpenAI 兼容的 Chat Completions 响应 |
| 流式对话 / 工具调用 | client.chatCompletionStream(request) |
带增量 / 工具调用 / 完成回调的 SSE 流 |
| 嵌入向量生成 | client.createEmbeddings(request) |
Embeddings 响应 |
| Webhook 触发 Agent | client.hook(...) / client.wake(...) |
HTTP Webhook 调用 |
| 双向实时对话 | client.connect() + client.chatSend(...) |
WebSocket 流式回复 |
| 本地 CLI 操作 | client.cli().version() / gatewayHealth(...) |
本地 openclaw 子命令执行 |
| 能力 | 状态 | 说明 |
|---|---|---|
| HTTP Webhook | 可用 | hook() / wake();自定义映射 Webhook |
| Chat Completions | 可用 | chatCompletion(...) 阻塞 + chatCompletionStream(...) SSE |
| Models | 可用 | listModels() |
| Embeddings | 可用 | createEmbeddings(request) |
| Responses | 可用 | createResponse(request) |
| Tools Invoke | 可用 | toolInvoke(request) / toolsInvoke() |
| WebSocket 控制面 | 可用 | connect() / chatSend() / sessionsSend();帧协议位于 ws.protocol |
| 本地 CLI | 可用 | cli() 门面对 40+ 个 openclaw 子命令的类型化封装 |
| 启动自检 | 可用 | 构造时 HTTP 健康探测 + openclaw --version 探测(按子系统开关控制) |
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | 17+ | 1.0.x 线基线 |
| Maven | 3.0+ | Enforcer 下限 |
| OkHttp / okhttp-sse | 4.12.0 | HTTP 与 SSE 传输 |
| Java-WebSocket | — | WebSocket 传输 |
| Jackson databind | 2.17.x | JSON |
| commons-exec | — | CLI 子进程执行 |
| SLF4J | 2.0.18 | 日志门面 |
版本线矩阵:
| 版本线 | 分支 | JDK | 版本模式 | 用途 |
|---|---|---|---|---|
| 1.0.x | feature/2.0.x(当前分支) |
8 | 1.0.x.* |
存量项目、Boot 2.x Starter 线 |
| 2.0.x | feature/2.0.x |
17 | 2.0.x.* |
主流线(JDK 17) |
| 3.0.x | feature/3.0.x |
21 | 3.0.x.* |
新项目 |
依赖边界:SDK 仅依赖 OkHttp、Jackson、Java-WebSocket、commons-exec 与 SLF4J。无 Spring 依赖——Spring Boot 应用请使用配套的 openclaw-spring-boot-starter。
[ 业务应用 ]
|
| openclaw-java-sdk
v
+------------------------------------------+
| OpenClawClient(门面) |
| HTTP /v1/chat/completions、/v1/models |
| /v1/embeddings、/v1/responses、 |
| /tools/invoke、/hooks/* |
| SSE StreamingChatResponse |
| WS connect / chatSend / sessionsSend |
| CLI 本地 `openclaw` 子进程 |
+------------------------------------------+
|
v
[ OpenClaw Gateway ] -> [ LLM / Agent / 工具 ]
包结构:
| 包 | 职责 |
|---|---|
io.github.easy4j.openclaw |
门面 OpenClawClient 与配置类 |
io.github.easy4j.openclaw.api |
HTTP 子客户端(chat / embeddings / responses / webhook / tools) |
io.github.easy4j.openclaw.api.model |
DTO(ChatRequest、ChatResponse、Tools、HookRequest 等) |
io.github.easy4j.openclaw.api.sse |
SSE 流式(StreamingChatResponse、SseStreamReader、SseEventAccumulator) |
io.github.easy4j.openclaw.cli |
CLI 门面(OpenClawCli / OpenClawCliExecutor) |
io.github.easy4j.openclaw.cli.opts |
60+ 个 CLI 子命令的类型化参数 |
io.github.easy4j.openclaw.cli.availability |
CLI 可用性探测 |
io.github.easy4j.openclaw.exception |
异常层级 |
io.github.easy4j.openclaw.ws |
WebSocket 客户端与帧协议(params / results) |
Maven:
<dependency>
<groupId>io.github.easy4j</groupId>
<artifactId>openclaw-java-sdk</artifactId>
<version>2.0.x.x.20260630-SNAPSHOT</version>
</dependency>Gradle:
implementation 'io.github.easy4j:openclaw-java-sdk:2.0.x.x.20260630-SNAPSHOT'快照版本需要启用对应快照仓库(pom.xml 中 distributionManagement 指向 Aliyun Maven 仓库)。
import io.github.easy4j.openclaw.OpenClawClient;
import io.github.easy4j.openclaw.OpenClawClientConfig;
import io.github.easy4j.openclaw.api.model.ChatMessage;
import io.github.easy4j.openclaw.api.model.ChatResponse;
import java.util.List;
// 1. 配置
OpenClawClientConfig config = new OpenClawClientConfig();
config.getHttp().setGatewayBaseUrl("http://localhost:18789");
config.getHttp().setGatewayAuthToken("your-gateway-token");
// 2. 创建客户端(构造时执行启动自检)
OpenClawClient client = new OpenClawClient(config);
// 3. 对话
ChatResponse resp = client.chatCompletion(
"openclaw/default", "gpt-4o",
List.of(ChatMessage.ofUser("你好")));
System.out.println(resp.getChoices().get(0).getMessage().getContent());
// 4. 释放
client.close();预期结果:默认配置下 HTTP 子系统启用但 startupCheckEnabled=false,启动时不阻塞探测;调用返回 Agent 回复文本。启用启动自检后,INFO 日志出现 OpenClaw HTTP health check passed: ... / OpenClaw CLI ready: ...;探测失败时按配置抛 IllegalStateException(fail-fast)或仅输出 WARN(非 fail-fast)。
配置为对象式(本库无 Spring 配置属性)。三个配置类:
| 配置类 | 职责 |
|---|---|
OpenClawClientConfig |
聚合 http + cli 子配置 |
OpenClawHttpClientConfig |
Gateway HTTP/WS 相关 |
OpenClawCliConfig |
本地 CLI 相关 |
OpenClawHttpClientConfig 属性:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | true |
是否启用 HTTP 子系统 |
startupCheckEnabled |
boolean | false |
启动时探测 Gateway 健康端点 |
failFastOnUnavailable |
boolean | false |
探测失败时中断构造 |
gatewayBaseUrl |
String | http://localhost:18789 |
Gateway 根地址 |
gatewayAuthToken |
String | — | 控制面令牌 |
gatewayAuthPassword |
String | — | 控制面密码模式 |
hooksToken |
String | — | Webhook 鉴权令牌 |
hooksPath |
String | /hooks |
Webhook 基础路径 |
hooksUseXOpenclawTokenHeader |
boolean | false |
用 x-openclaw-token 头传 Hook 令牌 |
verifySsl |
boolean | true |
是否校验 HTTPS 证书 |
connectTimeoutMillis |
int | 15000 |
连接超时(毫秒) |
readTimeoutMillis |
int | 120000 |
读取超时(毫秒) |
OpenClawCliConfig 属性:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled |
boolean | true |
是否启用 CLI 子系统 |
startupCheckEnabled |
boolean | false |
启动时探测 openclaw --version |
failFastOnUnavailable |
boolean | false |
探测失败时中断构造 |
executable |
String | openclaw |
可执行文件名或绝对路径 |
timeout |
int | 300 |
CLI 命令超时(秒) |
probeTimeoutSeconds |
int | 5 |
启动探测超时(秒) |
workingDirectory |
String | — | 子进程工作目录 |
maxConcurrentExecutions |
int | 0 |
最大并发子进程数(0 = CPU 核心数) |
通过 OpenClawHeaders.Builder 设置自定义请求头:
| 头部 | 常量 | 用途 |
|---|---|---|
x-openclaw-model |
X_OPENCLAW_MODEL |
覆盖后端模型 |
x-openclaw-agent-id |
X_OPENCLAW_AGENT_ID |
Agent 覆盖 |
x-openclaw-session-key |
X_OPENCLAW_SESSION_KEY |
显式会话路由 |
x-openclaw-message-channel |
X_OPENCLAW_MESSAGE_CHANNEL |
入口通道上下文 |
x-openclaw-scopes |
X_OPENCLAW_SCOPES |
权限范围声明 |
认证优先级:Webhook(/hooks/*)使用 hooksToken;控制面(/v1/*、/tools/*、WebSocket)为 gatewayAuthToken → gatewayAuthPassword → hooksToken → 空。
ChatRequest req = ChatRequest.builder()
.agent("openclaw/default")
.messages(List.of(ChatMessage.ofUser("北京天气怎么样?")))
.tools(List.of(Tools.function("get_weather", "获取天气")
.param("city", "string", "城市名", true).build()))
.toolChoice("auto")
.build();
client.chatCompletionStream(req)
.onDelta(delta -> System.out.print(delta))
.onToolCall(toolCalls -> toolCalls.forEach(
tc -> System.out.println(tc.getFunction().getName())))
.onComplete(text -> System.out.println("\n[done]"))
.onError(Throwable::printStackTrace);HelloOk hello = client.connect();
client.chatSend("你好", new ChatStreamHandler() {
@Override public void onDelta(String text) { System.out.print(text); }
@Override public void onComplete(String fullText) { System.out.println(); }
@Override public void onError(String error) { System.err.println(error); }
});OpenClawCliResult result = client.cli().version(); // openclaw --version
System.out.println(result.getStdout());
client.cli().gatewayHealth( // openclaw gateway health
GatewayRpcOptions.builder().url("ws://127.0.0.1:18789").build());mvn clean verify- 单元测试覆盖配置默认值、CLI 参数与执行、WS 协议、HTTP 子客户端与构造器契约(
src/test下 23 个测试源文件:22 个测试类 + 1 个 mock CLI 辅助类)。 - JaCoCo 在
verify阶段执行prepare-agent、report与check,行覆盖率规则为 90%(haltOnFailure=false)。 - 发布打包(
mvn -Prelease deploy)附带 sources 与 javadoc 构件并执行 GPG 签名,对接 Sonatype Central Publishing;普通mvn deploy按版本后缀路由到 Aliyun Maven 仓库(见distributionManagement)。
| 分支 | 版本模式 | JDK | 维护策略 |
|---|---|---|---|
feature/1.0.x(当前分支) |
1.0.x.* |
8 | 仅接受兼容性修复与 JDK 8 安全的依赖升级 |
feature/2.0.x |
2.0.x.* |
17 | 主流开发线 |
feature/3.0.x |
3.0.x.* |
21 | 新项目 |
提交 Pull Request 前请执行 mvn clean verify,并说明兼容性、测试、文档与迁移影响。本项目采用 Apache License 2.0 许可证。