Назад до блогу

API та SDKПосібник

Перший запит у Java з openai-java: базова URL-адреса, ключ, використання

Готова до запуску програма на Java 8+: openai-java, націлений на CheapTokens, одне завершення чату, а також виведені відповідь, finish_reason і використання токенів.

Автор: CheapTokens TeamОпубліковано 4 хв читання

Код Java, що націлює openai-java на API CheapTokens
На цій сторінці
  1. Додайте залежність
  2. Задайте ключ і базову URL-адресу поза кодом
  3. Програма
  4. Задайте значення явно через білдер
  5. Три помилки, які ви зустрінете першими
  6. Скільки коштує один запит

Щоб викликати CheapTokens з Java, залиште офіційний SDK openai-java і змініть три речі: базову URL-адресу (https://api.cheaptokens.dev/v1), API-ключ і ідентифікатор моделі, переданий як звичайний String. Програма нижче надсилає одне завершення чату й виводить відповідь, finish_reason та використання токенів. Їй потрібна Java 8 або новіша.

Якщо у вашій команді вже є сервіс на Spring, що спілкується з OpenAI, це вся міграція: жодного нового клієнта, жодних нових класів запитів.

Додайте залежність#

README SDK (github.com/openai/openai-java, перевірено 4 листопада 2026) показує версію 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 читає дві змінні середовища: 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"

Типова базова URL-адреса SDK — https://api.openai.com/v1. Пропустіть другий рядок, і ваш запит піде туди з ключем CheapTokens, якого він не знає. Це один зі способів отримати 401 під час першого запуску. Про те, де зберігати ключ і як тримати його поза git, дивіться безпечне зберігання API-ключа.

Дві змінні середовища та команда запуску в терміналі
Ключ і базова 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"). Приклади в README SDK використовують типізовані константи, як-от ChatModel.GPT_5_2, але в білдера також є перевантаження model(String), тож підходить будь-який id. Використовуйте повний id з документації CheapTokens: коротка назва deepseek-v4-flash-0731 — це те, як ціни позначені на сайті; API потребує повного id з префіксом deepseek-ai/. Не впевнені щодо id? Отримайте список моделей через GET /v1/models.
  • .maxCompletionTokens(300L). Обмеження довжини відповіді як long. DeepSeek-V4-Flash дозволяє до 32 768 вихідних токенів на відповідь, тож 300 тут — це вибір, щоб демо було коротким, а не обмеження моделі.
  • content() — це Optional. Ось чому в програмі є orElse. Відповідь, що складається лише з викликів інструментів, не має тексту.
  • usage() теж Optional. ifPresent виводить його, коли сервер його надсилає.

Скомпілюйте й запустіть так, як це робить ваша збірка (mvn compile exec:java -Dexec.mainClass=FirstRequest або завдання JavaExec у Gradle). Ви маєте отримати пояснення токена, потім рядок finish_reason: … з stop у ньому, а потім рядок з кількістю вхідних і вихідних токенів. Якщо 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-адреса визначає, хто відповідає

Три помилки, які ви зустрінете першими#

З'єднайте пари

Зіставте симптом із причиною

  • 401 Unauthorizedключ порожній або неправильний, або запит пішов на api.openai.com, бо OPENAI_BASE_URL не задано
  • 404 Not Foundбазовій URL-адресі бракує /v1, або ідентифікатора моделі не існує
  • finish_reason каже lengthmaxCompletionTokens менше, ніж потрібно для відповіді

Порожню змінну середовища легко пропустити в IDE: конфігурація запуску, розпочата з панелі інструментів, може не успадковувати змінні, які ви експортували в терміналі. Якщо ключ «задано», але ви все одно отримуєте 401, додайте змінні до конфігурації запуску. Докладніше про ці коди: API 401 або 404: ключ, базова URL-адреса, id моделі.

Скільки коштує один запит#

Оскільки ви виводите usage, ви можете оцінити вартість запиту, перш ніж масштабувати його. Скажімо, ваш сервіс надсилає близько 200 вхідних токенів і отримує 300 у відповідь. За сьогоднішніми цінами такий запит коштує $0.000033 на DeepSeek-V4-Flash. Вхідні й вихідні токени оплачуються разом, і загалом це дешевше, ніж 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 вихідних токенів на запит. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець 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

Для більшого обсягу на відповідь або іншої форми навантаження DeepSeek-V4-Flash дає вікно контексту 380K і одну ціну в будь-яку годину доби; GLM-5.3-Flash (zai-org/GLM-5.3-Flash) — це замінна модель у тій самій програмі: змініть id, і більше нічого. Актуальні ціни для всіх моделей — на сторінці цін, а документація показує той самий запит іншими мовами. Робите це в Go? Дивіться версію для openai-go.