SDKガイド
Java
公式 openai-java ライブラリで api14 を使う手順です。クライアントビルダーの baseUrl 設定から、チャット、ストリーミング、ツール呼び出し、構造化出力、画像入力、追加パラメーター、再試行までを Java で示します。
公式の openai-java ライブラリを api14 で使います。クライアントビルダーで baseUrl を設定し、モデル ID(たとえば openai/gpt-5-mini)を通常の文字列として渡します。
インストール
Gradle:
implementation("com.openai:openai-java:4.+")
Maven:
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>LATEST</version>
</dependency>
その後、環境に API14_API_KEY=sk-api14-... を設定します。
設定
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl("https://api14.com/api/v1")
.apiKey(System.getenv("API14_API_KEY"))
.build();
OpenAIOkHttpClient.fromEnv() は代わりに OPENAI_BASE_URL と OPENAI_API_KEY を読み取るため、コードを変更せずに環境を切り替えられます。
export OPENAI_BASE_URL="https://api14.com/api/v1"
export OPENAI_API_KEY="sk-api14-..."
チャット
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("openai/gpt-5-mini")
.addUserMessage("Explain vector databases in two sentences.")
.build();
ChatCompletion completion = client.chat().completions().create(params);
completion.choices().get(0).message().content().ifPresent(System.out::println);
ストリーミング
import com.openai.core.http.StreamResponse;
import com.openai.models.chat.completions.ChatCompletionChunk;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("anthropic/claude-sonnet-4.5")
.addUserMessage("Write a haiku about APIs.")
.build();
try (StreamResponse<ChatCompletionChunk> stream = client.chat().completions().createStreaming(params)) {
stream.stream()
.flatMap(chunk -> chunk.choices().stream())
.flatMap(choice -> choice.delta().content().stream())
.forEach(System.out::print);
}
ストリーミングを参照してください。
ツール呼び出し
ツールをクラスとして記述します。SDK は JSON Schema を導出し、引数をそのクラスに解析します。
import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.openai.models.chat.completions.*;
import java.util.Collection;
@JsonClassDescription("Current weather for a city")
static class GetWeather {
public String city;
}
ChatCompletionCreateParams.Builder builder = ChatCompletionCreateParams.builder()
.model("openai/gpt-5-mini")
.addTool(GetWeather.class)
.addUserMessage("What's the weather in Istanbul?");
while (true) {
ChatCompletionMessage message = client.chat().completions().create(builder.build())
.choices().get(0).message();
builder.addMessage(message);
if (message.toolCalls().map(Collection::isEmpty).orElse(true)) {
message.content().ifPresent(System.out::println);
break;
}
for (ChatCompletionMessageToolCall call : message.toolCalls().get()) {
GetWeather args = call.asFunction().function().arguments(GetWeather.class);
builder.addMessage(ChatCompletionToolMessageParam.builder()
.toolCallId(call.asFunction().id())
.contentAsJson(getWeather(args.city)) // 自分の関数
.build());
}
}
ビルダーは会話全体を保持します。ループのたびに、ツール呼び出しを含むアシスタントのメッセージと、呼び出しごとに 1 つのツールメッセージを追加し、すべてを再送します。ツールクラスのフィールドがスキーマのプロパティになります。フィールドに @JsonPropertyDescription を付けると、その意味をモデルに伝えられます。本番コードでは、ツールを呼び出し続けるモデルが無限にループしないように、反復回数に上限を設けてください。ツール呼び出しを参照してください。
構造化出力
responseFormat にクラスを渡すと、SDK はそこから厳密な JSON Schema を生成し、各選択肢のコンテンツをインスタンスに解析します。supported_parameters に structured_outputs または response_format を含むモデルを使ってください。
static class Person {
public String name;
public int born;
public String city;
}
StructuredChatCompletionCreateParams<Person> params = ChatCompletionCreateParams.builder()
.model("openai/gpt-5-mini")
.responseFormat(Person.class)
.addUserMessage("Extract: Ada Lovelace, born 1815 in London.")
.build();
client.chat().completions().create(params).choices().stream()
.flatMap(choice -> choice.message().content().stream())
.forEach(person -> System.out.println(person.name + " " + person.born));
構造化出力を参照してください。
画像入力
import java.util.List;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("google/gemini-2.5-flash")
.addUserMessageOfArrayOfContentParts(List.of(
ChatCompletionContentPart.ofText(ChatCompletionContentPartText.builder()
.text("What is in this picture?").build()),
ChatCompletionContentPart.ofImageUrl(ChatCompletionContentPartImage.builder()
.imageUrl(ChatCompletionContentPartImage.ImageUrl.builder()
.url("https://example.com/photo.jpg") // または data:image/png;base64,... の URL
.build())
.build())))
.build();
画像とファイル入力を参照してください。
追加パラメーター
型付きのセッターがないゲートウェイのフィールド(reasoning、provider、models)は、putAdditionalBodyProperty で渡します。
import com.openai.core.JsonValue;
import java.util.Map;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("anthropic/claude-sonnet-4.5")
.addUserMessage("Prove there are infinitely many primes.")
.putAdditionalBodyProperty("reasoning", JsonValue.from(Map.of("effort", "high")))
.build();
エラー
2xx 以外のレスポンスは OpenAIServiceException のサブクラスをスローし、ステータスとヘッダーを参照できます。
import com.openai.errors.OpenAIServiceException;
try {
client.chat().completions().create(params);
} catch (OpenAIServiceException e) {
if (e.statusCode() == 402) {
System.err.println("Balance too low, add funds (insufficient_balance)");
} else if (e.statusCode() == 429) {
System.err.println("Rate limited, retry after " + e.headers().values("Retry-After") + "s");
} else {
throw e;
}
}
エラーを参照してください。
タイムアウトと再試行
クライアントは、接続エラー、408、409、429、5xx を指数バックオフでデフォルトで 2 回再試行します。回数とタイムアウトは、ビルダーまたはリクエストごとに設定します。
import com.openai.core.RequestOptions;
import java.time.Duration;
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl("https://api14.com/api/v1")
.apiKey(System.getenv("API14_API_KEY"))
.maxRetries(4)
.timeout(Duration.ofSeconds(60))
.build();
client.chat().completions().create(params,
RequestOptions.builder().timeout(Duration.ofMinutes(5)).build());
ビルダーのタイムアウトは、各試行に適用されます。長い推論リクエストは数分かかることがあるため、リクエストごとのタイムアウトを長くするか、ストリーミングしてください。daily_limit_reached や insufficient_balance は、再試行しても解決しません。RateLimitException を捕捉し、次の試行を予約する前にエラーコードを確認してください。レート制限を参照してください。
すべての機能
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
});
const result = await client.chat.completions.create({
"model": "openai/gpt-5-mini",
"messages": [
{
"role": "user",
"content": "Explain vector databases in two sentences."
}
]
});
console.log(result.choices[0].message.content);