Cookieを使用しています. Cookieとブラウザストレージは、ログイン状態の維持と設定の保存に使われます。許可いただいた場合は、サイトの利用状況も計測します。はいつでも変更できます。詳しくはCookieポリシーをご覧ください。

Java

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);