กลับไปที่บล็อก

API และ SDKคู่มือ

คำขอแรกใน Java ด้วย openai-java: base URL, key, usage

โปรแกรม Java 8+ ที่รันได้: openai-java ชี้ไปที่ CheapTokens, chat completion หนึ่งครั้ง และพิมพ์คำตอบ, finish_reason และ token usage

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 4 นาที

โค้ด Java ที่ชี้ openai-java ไปที่ API ของ CheapTokens
ในหน้านี้
  1. เพิ่ม dependency
  2. ตั้งค่า key และ base URL นอกโค้ด
  3. โปรแกรม
  4. ตั้งค่าอย่างชัดเจนด้วย builder
  5. สามข้อผิดพลาดที่คุณจะเจอเป็นอันดับแรก
  6. หนึ่งคำขอมีค่าใช้จ่ายเท่าไร

ในการเรียก CheapTokens จาก Java ให้ใช้ SDK อย่างเป็นทางการ openai-java และเปลี่ยนสามอย่าง: base URL (https://api.cheaptokens.dev/v1), API key และ model id ที่ส่งเป็น String ธรรมดา โปรแกรมด้านล่างส่ง chat completion หนึ่งครั้งและพิมพ์คำตอบ, finish_reason และ token usage ต้องใช้ Java 8 ขึ้นไป

หากทีมของคุณมี Spring service ที่คุยกับ OpenAI อยู่แล้ว นี่คือการย้ายทั้งหมด: ไม่มี client ใหม่ ไม่มี request class ใหม่

เพิ่ม dependency#

README ของ SDK (github.com/openai/openai-java ตรวจสอบเมื่อ 4 พฤศจิกายน 2026) แสดงเวอร์ชัน 4.99.0, group com.openai, artifact openai-java README ไม่ได้ระบุวันที่ release ดังนั้นให้ดูที่ repository สำหรับเวอร์ชันล่าสุดก่อนคัดลอก

เพิ่ม openai-java ใน build ของคุณ

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 ที่ไม่ผูกกับ framework ทำงานบน Java 8+ ดังนั้น JDK องค์กรรุ่นเก่าไม่ใช่อุปสรรค

ตั้งค่า key และ base URL นอกโค้ด#

SDK อ่าน environment variable สองตัว: OPENAI_API_KEY และ OPENAI_BASE_URL OpenAIOkHttpClient.fromEnv() รับทั้งสองตัว ดังนั้น key จะไม่ไปอยู่ในไฟล์ source ของคุณ (system property openai.apiKey และ openai.baseUrl ก็ใช้ได้และมีลำดับความสำคัญเหนือกว่า variable)

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

base URL เริ่มต้นของ SDK คือ https://api.openai.com/v1 หากข้ามบรรทัดที่สอง คำขอของคุณจะไปที่นั่นพร้อม key ของ CheapTokens ที่มันไม่รู้จัก นั่นคือวิธีหนึ่งที่จะได้ 401 ในการรันครั้งแรก สำหรับตำแหน่งที่เก็บ key และวิธีกันไม่ให้เข้า git ดู store an API key safely

environment variable สองตัวและคำสั่งรันใน terminal
Key และ base URL มาจาก environment ไม่ใช่จากไฟล์ source

โปรแกรม#

สร้าง 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"). ตัวอย่างใน README ของ SDK ใช้ค่าคงที่แบบมี type เช่น ChatModel.GPT_5_2 แต่ builder ก็มี overload แบบ model(String) ดังนั้น id ใดก็ได้ ใช้ id เต็มจากเอกสาร CheapTokens: ชื่อย่อ deepseek-v4-flash-0731 คือวิธีที่ราคาถูกติดป้ายบนเว็บไซต์; API ต้องการ id เต็มที่มี prefix deepseek-ai/ ไม่แน่ใจ id? List models with GET /v1/models
  • .maxCompletionTokens(300L). เพดานความยาวคำตอบ เป็น long DeepSeek-V4-Flash รองรับ output token สูงสุด 32,768 ต่อคำตอบ ดังนั้น 300 ที่นี่เป็นการเลือกเพื่อให้ demo สั้น ไม่ใช่ข้อจำกัดของโมเดล
  • content() เป็น Optional. นั่นคือเหตุผลที่โปรแกรมมี orElse คำตอบที่ประกอบด้วย tool call เท่านั้นจะไม่มีข้อความ
  • usage() ก็เป็น Optional เช่นกัน. ifPresent พิมพ์มันเมื่อ server ส่งมา

คอมไพล์และรันตามวิธีที่ build ของคุณทำ (mvn compile exec:java -Dexec.mainClass=FirstRequest หรือ task JavaExec ใน Gradle) คุณควรได้คำอธิบายของ token จากนั้นบรรทัด finish_reason: … ที่มี stop อยู่ แล้วจึงเป็นบรรทัดที่มีจำนวน input และ output token หาก finish_reason ระบุ length แสดงว่าคำตอบชนเพดาน 300 token และถูกตัด: เพิ่มจำนวนนั้น (why that happens)

usage() คืนจำนวน token ของ prompt, completion และ total (promptTokens(), completionTokens(), totalTokens())

ตั้งค่าอย่างชัดเจนด้วย builder#

การทดสอบ หรือ service ที่มีหลาย client บางครั้งต้องการค่าที่ชัดเจน client เดียวกัน สร้างด้วยมือ:

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

ทุกอย่างหลังจากบรรทัดนี้ ทั้ง params และการเรียก create ยังคงเหมือนเดิม แม้แต่ที่นี่ก็ให้อ่าน key จาก environment; string literal ในไฟล์ .java จะไปอยู่ใน repository ของคุณ

โค้ด Java, openai-java, endpoint ของ CheapTokens และโมเดล
โค้ดของคุณคุยกับ SDK; มีเพียง base URL ที่กำหนดว่าใครตอบ

สามข้อผิดพลาดที่คุณจะเจอเป็นอันดับแรก#

จับคู่

จับคู่อาการกับสาเหตุ

  • 401 Unauthorizedkey ว่างหรือผิด หรือคำขอไปที่ api.openai.com เพราะไม่ได้ตั้ง OPENAI_BASE_URL
  • 404 Not Foundbase URL ขาด /v1 หรือ model id ไม่มีอยู่
  • finish_reason ระบุ lengthmaxCompletionTokens ต่ำกว่าที่คำตอบต้องการ

environment variable ที่ว่างเปล่านั้นมองข้ามได้ง่ายใน IDE: run configuration ที่เริ่มจาก toolbar อาจไม่ได้รับ variable ที่คุณ export ใน terminal หาก key "ถูกตั้งแล้ว" แต่ยังได้ 401 ให้เพิ่ม variable ใน run configuration เพิ่มเติมเกี่ยวกับรหัสเหล่านี้: API 401 or 404: key, base URL, model id

หนึ่งคำขอมีค่าใช้จ่ายเท่าไร#

เพราะคุณพิมพ์ usage คุณจึงคำนวณราคาคำขอก่อนขยาย規模ได้ สมมติ service ของคุณส่ง input ประมาณ 200 token และได้กลับมา 300 ที่ราคาวันนี้ คำขอนั้นมีค่าใช้จ่าย $0.000033 บน DeepSeek-V4-Flash input และ output คิดเงินรวมกัน และโดยรวมแล้วถูกกว่า 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 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

ตอนนี้ใส่ทราฟฟิกของคุณเอง ลากสไลเดอร์ไปยังตัวเลขจากบรรทัด usage ที่พิมพ์ครั้งแรก:

เครื่องคำนวณค่าใช้จ่าย

บริการซัพพอร์ตที่มี 2,000 คำขอต่อวัน

โทเค็นอินพุตต่อคำขอ: 200 · โทเค็นเอาต์พุตต่อคำขอ: 300 · คำขอต่อวัน: 2,000

โมเดลต่อวันต่อเดือน
GLM-5.3-Flash$0.032$0.96
DeepSeek-V4-Flash$0.066$1.98
MiniMax-M2.7$0.11$3.30

หากต้องการพื้นที่ต่อคำตอบมากขึ้นหรือ workload รูปแบบอื่น DeepSeek-V4-Flash ให้ context window 380K และราคาเดียวทุกชั่วโมงของวัน; GLM-5.3-Flash (zai-org/GLM-5.3-Flash) เป็นตัวแทนที่ใช้แทนได้ทันทีในโปรแกรมเดียวกัน: เปลี่ยน id ไม่ต้องแก้อื่น ราคาปัจจุบันของทุกโมเดลอยู่ที่ pricing page และ docs แสดงคำขอเดียวกันในภาษาอื่น ทำสิ่งนี้ใน Go? ดู the openai-go version