ブログに戻る

APIとSDKガイド

openai-java で Java の最初のリクエスト: ベース URL、キー、使用量

実行可能な Java 8+ プログラム: CheapTokens を指す openai-java、1 回のチャット補完、そして回答、finish_reason、トークン使用量を出力します。

投稿者: CheapTokens Team公開日 読了時間 5 分

openai-java を CheapTokens API に向ける Java コード
このページの内容
  1. 依存関係を追加する
  2. キーとベース URL をコードの外で設定する
  3. プログラム
  4. ビルダーで値を明示的に設定する
  5. 最初に出会う 3 つのエラー
  6. 1 リクエストのコスト

Java から CheapTokens を呼び出すには、公式の openai-java SDK を使い、3 つの点を変更します。ベース URL(https://api.cheaptokens.dev/v1)、API キー、そしてモデル id です。モデル id はプレーンな String として渡します。以下のプログラムはチャット補完を 1 回送信し、回答、finish_reason、トークン使用量を出力します。Java 8 以降が必要です。

チームにすでに OpenAI と通信する Spring サービスがあるなら、移行はこれだけです。新しいクライアントも、新しいリクエストクラスも不要です。

依存関係を追加する#

SDK の README(github.com/openai/openai-java、2026 年 11 月 4 日確認)には、バージョン 4.99.0、グループ com.openai、アーティファクト openai-java と記載されています。README にはリリース日が書かれていないため、これをコピーする前にリポジトリで最新バージョンを確認してください。

ビルドに openai-java を追加する

Maven

xml
<dependency>
  <groupId>com.openai</groupId>
  <artifactId>openai-java</artifactId>
  <version>4.99.0</version>
</dependency>

Gradle

kotlin
implementation("com.openai:openai-java:4.99.0")

フレームワーク非依存のアーティファクトは Java 8 以降で動作するため、古い企業の JDK でも問題ありません。

キーとベース URL をコードの外で設定する#

SDK は 2 つの環境変数 OPENAI_API_KEY と OPENAI_BASE_URL を読み取ります。OpenAIOkHttpClient.fromEnv() は両方を取得するため、キーがソースファイルに残ることはありません。(システムプロパティ openai.apiKey と openai.baseUrl も使用でき、環境変数より優先されます。)

bash
export OPENAI_API_KEY="your-cheaptokens-key"
export OPENAI_BASE_URL="https://api.cheaptokens.dev/v1"

SDK のデフォルトのベース URL は https://api.openai.com/v1 です。2 行目を省略すると、リクエストはそこへ送られ、CheapTokens のキーは認識されません。これが初回実行で 401 になる原因の 1 つです。キーの保管場所と git に含めない方法については、API キーを安全に保存する を参照してください。

ターミナルで 2 つの環境変数と実行コマンド
キーとベース URL はソースファイルではなく環境から取得する

プログラム#

FirstRequest.java を作成します:

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 FirstRequest {
  public static void main(String[] args) {
    OpenAIClient client = OpenAIOkHttpClient.fromEnv();

    ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
        .model("deepseek-ai/DeepSeek-V4-Flash-0731")
        .addUserMessage("Explain in two sentences what a token is.")
        .maxCompletionTokens(300L)
        .build();

    ChatCompletion completion = client.chat().completions().create(params);
    ChatCompletion.Choice choice = completion.choices().get(0);

    System.out.println(choice.message().content().orElse("(no text)"));
    System.out.println("finish_reason: " + choice.finishReason());
    completion.usage().ifPresent(u ->
        System.out.println("input " + u.promptTokens()
            + ", output " + u.completionTokens()));
  }
}

いくつかの行はもう一度見る価値があります。

  • .model("deepseek-ai/DeepSeek-V4-Flash-0731")。 SDK の README の例では ChatModel.GPT_5_2 のような型付き定数を使っていますが、ビルダーには model(String) のオーバーロードもあるため、任意の id が使えます。CheapTokens のドキュメントにある完全な id を使用してください。短い名前 deepseek-v4-flash-0731 はサイト上で価格が表示される際の名前で、API は deepseek-ai/ プレフィックス付きの完全な id を要求します。id がわからない場合は、GET /v1/models でモデルを一覧表示する を参照してください。
  • .maxCompletionTokens(300L)。 回答の長さの上限を long として指定します。DeepSeek-V4-Flash は 1 回答あたり最大 32,768 出力トークンを許可しているため、ここでの 300 はデモを短く保つための選択であり、モデルの制限ではありません。
  • content() は Optional です。 そのためプログラムには orElse があります。ツール呼び出しのみで構成された応答にはテキストがありません。
  • usage() も Optional です。 サーバーが送信した場合、ifPresent がそれを出力します。

ビルドの方法でコンパイルして実行します(mvn compile exec:java -Dexec.mainClass=FirstRequest、または Gradle の JavaExec タスク)。トークンの説明が出力され、次に stop を含む finish_reason: … の行、そして入力トークン数と出力トークン数の行が出力されるはずです。finish_reason が length と表示する場合、回答が 300 トークンの上限に達して切り詰められています。数値を増やしてください(その理由)。

usage() はプロンプト、補完、合計のトークン数を返します(promptTokens()、completionTokens()、totalTokens())。

ビルダーで値を明示的に設定する#

テストや複数のクライアントを持つサービスでは、明示的な値が必要になることがあります。同じクライアントを手動で構築します:

java
OpenAIClient client = OpenAIOkHttpClient.builder()
    .apiKey(System.getenv("OPENAI_API_KEY"))
    .baseUrl("https://api.cheaptokens.dev/v1")
    .build();

この行以降はすべて、パラメータと create 呼び出しを含め、上記とまったく同じままです。ここでもキーは環境から読み取ってください。.java ファイル内の文字列リテラルはリポジトリに残ってしまいます。

Java コード、openai-java、CheapTokens エンドポイントとモデル
コードは SDK と通信し、ベース URL だけが応答者を決める

最初に出会う 3 つのエラー#

ペアを合わせる

症状と原因を照合する

  • 401 Unauthorizedキーが空か間違っている、または OPENAI_BASE_URL が設定されていないためリクエストが api.openai.com に送られた
  • 404 Not Foundベース URL に /v1 がない、またはモデル id が存在しない
  • finish_reason が length を示すmaxCompletionTokens が回答に必要な量より少ない

空の環境変数は IDE で見落としがちです。ツールバーから起動した実行構成は、ターミナルでエクスポートした変数を継承しない場合があります。キーが「設定されている」のに 401 になる場合は、実行構成に変数を追加してください。これらのコードの詳細: API 401 または 404: キー、ベース URL、モデル id。

1 リクエストのコスト#

usage を出力しているため、スケールする前にリクエストの価格を見積もれます。サービスが約 200 入力トークンを送信し、300 を受け取るとします。現在の価格では、そのリクエストは DeepSeek-V4-Flash で $0.000033 かかります。入力と出力はまとめて課金され、合計では OpenRouter より安くなります。次の表は、当社のモデル全体で 1,000 リクエストの場合を繰り返しています:

モデル リクエストあたり 1,000 リクエスト OpenRouter、1,000 リクエスト
GLM-5.3-Flash $0.000016 $0.016 $0.0316
DeepSeek-V4-Flash $0.000033 $0.033 $0.056
MiniMax-M2.7 $0.000055 $0.055 $0.66

リクエストあたり 200 入力トークンと 300 出力トークン。100万トークンあたりの価格は現行のもので、当社の料金体系に合わせて変動します。OpenRouter 列は同じワークロードの参考価格を示しています。

次に、自分のトラフィックを当てはめてください。スライダーを最初に出力された usage 行の数値に合わせます:

コスト計算機

1 日 2,000 リクエストのサポートサービス

リクエストあたりの入力トークン数: 200 · リクエストあたりの出力トークン数: 300 · 1日あたりのリクエスト数: 2,000

モデル1日あたり1か月あたり
GLM-5.3-Flash$0.032$0.96
DeepSeek-V4-Flash$0.066$1.98
MiniMax-M2.7$0.11$3.30

回答あたりの余裕を増やしたい場合や、異なる形のワークロードには、DeepSeek-V4-Flash は 380K のコンテキストウィンドウと、1 日のどの時間でも同じ価格を提供します。GLM-5.3-Flash(zai-org/GLM-5.3-Flash)は同じプログラムでそのまま置き換えられます。id を変更するだけで、他は何も変わりません。すべてのモデルの現在の価格は 料金ページ にあり、ドキュメント では同じリクエストを他の言語で示しています。Go で行う場合は、openai-go 版 を参照してください。