Kembali ke blog

API & SDKPanduan

Request pertama di Java dengan openai-java: base URL, key, usage

Program Java 8+ yang dapat dijalankan: openai-java diarahkan ke CheapTokens, satu chat completion, dan jawaban, finish_reason serta penggunaan token dicetak.

Oleh CheapTokens TeamDiterbitkan 4 menit baca

Kode Java yang mengarahkan openai-java ke API CheapTokens
Di halaman ini
  1. Tambahkan dependensi
  2. Atur key dan base URL di luar kode
  3. Programnya
  4. Atur nilai secara eksplisit dengan builder
  5. Tiga error yang pertama kali Anda temui
  6. Berapa biaya satu request

Untuk memanggil CheapTokens dari Java, tetap gunakan SDK resmi openai-java dan ubah tiga hal: base URL (https://api.cheaptokens.dev/v1), API key, dan id model, yang diteruskan sebagai String biasa. Program di bawah mengirim satu chat completion dan mencetak jawaban, finish_reason, dan penggunaan token. Program ini membutuhkan Java 8 atau lebih baru.

Jika tim Anda sudah memiliki layanan Spring yang berkomunikasi dengan OpenAI, inilah keseluruhan migrasinya: tidak ada klien baru, tidak ada kelas request baru.

Tambahkan dependensi#

README SDK (github.com/openai/openai-java, diperiksa 4 November 2026) menunjukkan versi 4.99.0, group com.openai, artifact openai-java. README tidak mencantumkan tanggal rilis, jadi periksa repositori untuk versi terbaru sebelum Anda menyalin ini.

Tambahkan openai-java ke build Anda

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

Artifact yang netral terhadap framework berjalan di Java 8+, jadi JDK korporat yang lebih lama bukan penghalang.

Atur key dan base URL di luar kode#

SDK membaca dua variabel lingkungan: OPENAI_API_KEY dan OPENAI_BASE_URL. OpenAIOkHttpClient.fromEnv() mengambil keduanya, sehingga key tidak pernah masuk ke file sumber Anda. (Properti sistem openai.apiKey dan openai.baseUrl juga berfungsi dan diprioritaskan di atas variabel tersebut.)

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

Base URL default SDK adalah https://api.openai.com/v1. Lewati baris kedua dan request Anda akan dikirim ke sana, dengan key CheapTokens yang tidak dikenalnya. Itu salah satu cara mendapatkan 401 pada percobaan pertama. Untuk tempat menyimpan key dan cara menjaganya agar tidak masuk ke git, lihat menyimpan API key dengan aman.

Dua variabel lingkungan dan perintah run di terminal
Key dan base URL berasal dari lingkungan, bukan dari file sumber

Programnya#

Buat 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()));
  }
}

Beberapa baris perlu diperhatikan lebih teliti.

  • .model("deepseek-ai/DeepSeek-V4-Flash-0731"). Contoh di README SDK menggunakan konstanta bertipe seperti ChatModel.GPT_5_2, tetapi builder juga memiliki overload model(String), jadi id apa pun bisa dipakai. Gunakan id lengkap dari dokumentasi CheapTokens: nama pendek deepseek-v4-flash-0731 adalah cara harga dilabeli di situs; API membutuhkan id lengkap dengan prefiks deepseek-ai/. Tidak yakin dengan sebuah id? Daftar model dengan GET /v1/models.
  • .maxCompletionTokens(300L). Batas atas panjang jawaban, sebagai long. DeepSeek-V4-Flash mengizinkan hingga 32.768 token output per jawaban, jadi 300 di sini adalah pilihan untuk menjaga demo tetap singkat, bukan batas dari model.
  • content() adalah Optional. Itulah sebabnya program memiliki orElse. Balasan yang hanya berisi tool call tidak memiliki teks.
  • usage() juga Optional. ifPresent mencetaknya saat server mengirimkannya.

Kompilasi dan jalankan dengan cara build Anda (mvn compile exec:java -Dexec.mainClass=FirstRequest, atau task JavaExec di Gradle). Anda seharusnya mendapatkan penjelasan tentang token, lalu baris finish_reason: … dengan stop di dalamnya, lalu baris dengan jumlah token input dan output. Jika finish_reason menyebutkan length, jawaban mencapai batas 300 token Anda dan terpotong: naikkan angkanya (mengapa itu terjadi).

usage() mengembalikan jumlah token prompt, completion, dan total (promptTokens(), completionTokens(), totalTokens()).

Atur nilai secara eksplisit dengan builder#

Test, atau layanan dengan beberapa klien, terkadang membutuhkan nilai eksplisit. Klien yang sama, dibangun secara manual:

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

Semua setelah baris ini, params dan pemanggilan create, tetap persis seperti di atas. Tetap baca key dari lingkungan bahkan di sini; literal string di file .java akan berakhir di repositori Anda.

Kode Java, openai-java, endpoint CheapTokens dan modelnya
Kode Anda berbicara dengan SDK; hanya base URL yang menentukan siapa yang menjawab

Tiga error yang pertama kali Anda temui#

Cocokkan pasangan

Cocokkan gejala dengan penyebabnya

  • 401 Unauthorizedkey kosong atau salah, atau request dikirim ke api.openai.com karena OPENAI_BASE_URL tidak diatur
  • 404 Not Foundbase URL tidak memiliki /v1, atau id model tidak ada
  • finish_reason menyebutkan lengthmaxCompletionTokens lebih rendah dari yang dibutuhkan jawaban

Variabel lingkungan yang kosong mudah terlewat di IDE: konfigurasi run yang dimulai dari toolbar mungkin tidak mewarisi variabel yang Anda ekspor di terminal. Jika key "sudah diatur" tetapi Anda masih mendapat 401, tambahkan variabel ke konfigurasi run. Lebih lanjut tentang kode ini: API 401 atau 404: key, base URL, id model.

Berapa biaya satu request#

Karena Anda mencetak usage, Anda dapat menghitung biaya request sebelum menskalakannya. Katakanlah layanan Anda mengirim sekitar 200 token input dan menerima 300 kembali. Dengan harga saat ini, request tersebut berbiaya $0.000033 pada DeepSeek-V4-Flash. Input dan output ditagih bersama, dan secara total itu lebih murah daripada OpenRouter. Tabel mengulanginya untuk 1.000 request di seluruh model kami:

Model Per permintaan 1.000 permintaan OpenRouter, 1.000 permintaan
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 token input dan 300 token output per permintaan. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.

Sekarang masukkan trafik Anda sendiri. Geser slider ke angka dari baris usage pertama yang Anda cetak:

Kalkulator biaya

Layanan dukungan dengan 2.000 request per hari

Token input per permintaan: 200 · Token output per permintaan: 300 · Permintaan per hari: 2.000

ModelPer hariPer bulan
GLM-5.3-Flash$0.032$0.96
DeepSeek-V4-Flash$0.066$1.98
MiniMax-M2.7$0.11$3.30

Untuk ruang lebih per jawaban atau bentuk beban kerja yang berbeda, DeepSeek-V4-Flash memberi Anda jendela konteks 380K dan satu harga pada jam berapa pun; GLM-5.3-Flash (zai-org/GLM-5.3-Flash) adalah pengganti langsung dalam program yang sama: ubah id-nya, tidak ada yang lain. Harga terkini untuk semua model ada di halaman harga, dan dokumentasi menunjukkan request yang sama dalam bahasa lain. Melakukan ini di Go? Lihat versi openai-go.