Java SDK
Java 项目可以直接用两个官方 SDK:
- OpenAI 兼容:
com.openai:openai-java(官方) - Anthropic 原生:
com.anthropic:anthropic-java(官方)
例子基于 Context7 拉取的官方 README,最终参数与最新行为以官方仓库为准: openai/openai-java、anthropics/anthropic-sdk-java。
准备
bash
export SAKRYLLE_API_KEY="sk-xxxxxxxxxxxxxxxx"需要 JDK 8+。两个 SDK 都使用 OkHttp 作为 HTTP 客户端。
OpenAI 兼容
安装
Maven:
xml
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>1.0.0</version>
</dependency>Gradle(Kotlin DSL):
kotlin
dependencies {
implementation("com.openai:openai-java:1.0.0")
}最新版本号请到 Maven Central: com.openai:openai-java 查询,本页给出的版本号仅作示例,实际请以 Maven Central 为准。
最小可用调用
openai-java 支持用环境变量配置 base URL 与 API key:
bash
export OPENAI_API_KEY="$SAKRYLLE_API_KEY"
export OPENAI_BASE_URL="https://api.sakrylle.com/v1"java
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
public class Demo {
public static void main(String[] args) {
// 自动读取 OPENAI_API_KEY / OPENAI_BASE_URL 环境变量
OpenAIClient client = OpenAIOkHttpClient.fromEnv();
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("gpt-5.6-sol")
.addSystemMessage("你是一名简洁的助手。")
.addUserMessage("用一句话解释什么是向量数据库。")
.build();
ChatCompletion completion = client.chat().completions().create(params);
completion.choices().forEach(c -> System.out.println(c.message().content().orElse("")));
}
}如果不想用环境变量,可以显式构造 builder:
java
OpenAIClient client = OpenAIOkHttpClient.builder()
.apiKey(System.getenv("SAKRYLLE_API_KEY"))
.baseUrl("https://api.sakrylle.com/v1")
.build();流式响应
通过 createStreaming + ChatCompletionAccumulator 拼出最终消息:
java
import com.openai.helpers.ChatCompletionAccumulator;
ChatCompletionAccumulator acc = ChatCompletionAccumulator.create();
client.chat()
.completions()
.createStreaming(params)
.subscribe(chunk -> acc.accumulate(chunk).choices().stream()
.flatMap(choice -> choice.delta().content().stream())
.forEach(System.out::print))
.onCompleteFuture()
.join();
ChatCompletion finalCompletion = acc.chatCompletion();工具调用
addTool(Class<T>) 用 Java 类自动生成 JSON schema:
java
import com.openai.core.JsonValue;
import com.openai.models.FunctionDefinition;
import com.openai.models.chat.completions.ChatCompletionTool;
ChatCompletionTool weatherTool = ChatCompletionTool.builder()
.function(FunctionDefinition.builder()
.name("get_weather")
.description("查询给定城市的当前天气")
.parameters(JsonValue.from(Map.of(
"type", "object",
"properties", Map.of("city", Map.of("type", "string")),
"required", List.of("city"))))
.build())
.build();
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("gpt-5.6-sol")
.addTool(weatherTool)
.addUserMessage("北京今天天气怎么样?")
.build();Anthropic 原生
安装
Maven:
xml
<dependency>
<groupId>com.anthropic</groupId>
<artifactId>anthropic-java</artifactId>
<version>2.0.0</version>
</dependency>Gradle(Kotlin DSL):
kotlin
dependencies {
implementation("com.anthropic:anthropic-java:2.0.0")
}最小可用调用
java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.MessageCreateParams;
public class Demo {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.builder()
.apiKey(System.getenv("SAKRYLLE_API_KEY"))
.baseUrl("https://api.sakrylle.com")
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-haiku-4-5-20251001")
.maxTokens(1024L)
.addUserMessage("用一句话介绍 Claude。")
.build();
Message message = client.messages().create(params);
System.out.println(message.content());
}
}
baseUrl写到https://api.sakrylle.com,SDK 会自动拼/v1/messages。
流式响应
java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.core.http.StreamResponse;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.RawMessageStreamEvent;
AnthropicClient client = AnthropicOkHttpClient.builder()
.apiKey(System.getenv("SAKRYLLE_API_KEY"))
.baseUrl("https://api.sakrylle.com")
.build();
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-haiku-4-5-20251001")
.maxTokens(1024L)
.addUserMessage("写一首四行小诗。")
.build();
try (StreamResponse<RawMessageStreamEvent> stream = client.messages().createStreaming(params)) {
stream.stream()
.flatMap(event -> event.contentBlockDelta().stream())
.flatMap(delta -> delta.delta().text().stream())
.forEach(text -> System.out.print(text.text()));
}错误处理
com.openai.errors.* 与 com.anthropic.errors.* 都按 HTTP 状态码细分:
java
import com.openai.errors.OpenAIException;
import com.openai.errors.AuthenticationException;
import com.openai.errors.RateLimitException;
try {
client.chat().completions().create(params);
} catch (AuthenticationException e) {
System.err.println("Key 无效或被禁用");
} catch (RateLimitException e) {
System.err.println("限速,稍后重试");
} catch (OpenAIException e) {
System.err.println("上游错误:" + e.statusCode() + " " + e.getMessage());
}完整错误码表见 错误码。
