Retour au blog

API & SDKGuide

Première requête en Java avec openai-java : URL de base, clé, usage

Un programme Java 8+ exécutable : openai-java pointé vers CheapTokens, une complétion de chat, et la réponse, finish_reason et l'usage des tokens affichés.

Par CheapTokens TeamPublié le 5 min de lecture

Code Java qui pointe openai-java vers l'API CheapTokens
Sur cette page
  1. Ajouter la dépendance
  2. Définir la clé et l'URL de base hors du code
  3. Le programme
  4. Définir les valeurs explicitement avec le builder
  5. Trois erreurs que vous rencontrerez d'abord
  6. Ce que coûte une requête

Pour appeler CheapTokens depuis Java, gardez le SDK officiel openai-java et modifiez trois choses : l'URL de base (https://api.cheaptokens.dev/v1), la clé API et l'id du modèle, passé comme un simple String. Le programme ci-dessous envoie une complétion de chat et affiche la réponse, le finish_reason et l'usage des tokens. Il nécessite Java 8 ou ultérieur.

Si votre équipe a déjà un service Spring qui parle à OpenAI, c'est toute la migration : pas de nouveau client, pas de nouvelles classes de requête.

Ajouter la dépendance#

Le README du SDK (github.com/openai/openai-java, consulté le 4 novembre 2026) indique la version 4.99.0, groupe com.openai, artefact openai-java. Le README n'affiche pas de date de publication, alors vérifiez la dernière version dans le dépôt avant de copier ceci.

Ajouter openai-java à votre 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")

Les artefacts indépendants du framework tournent sur Java 8+, donc un vieux JDK d'entreprise n'est pas un blocage.

Définir la clé et l'URL de base hors du code#

Le SDK lit deux variables d'environnement : OPENAI_API_KEY et OPENAI_BASE_URL. OpenAIOkHttpClient.fromEnv() récupère les deux, donc la clé n'atterrit jamais dans vos fichiers source. (Les propriétés système openai.apiKey et openai.baseUrl fonctionnent aussi et ont priorité sur les variables.)

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

L'URL de base par défaut du SDK est https://api.openai.com/v1. Omettez la seconde ligne et votre requête y part, avec une clé CheapTokens qu'il ne connaît pas. C'est une façon d'obtenir un 401 au premier lancement. Pour savoir où garder la clé et comment la tenir hors de git, voir stocker une clé API en sécurité.

Les deux variables d'environnement et une commande d'exécution dans un terminal
La clé et l'URL de base viennent de l'environnement, pas du fichier source

Le programme#

Créez 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()));
  }
}

Quelques lignes méritent un second regard.

  • .model("deepseek-ai/DeepSeek-V4-Flash-0731"). Les exemples du README du SDK utilisent des constantes typées comme ChatModel.GPT_5_2, mais le builder a aussi une surcharge model(String), donc n'importe quel id fonctionne. Utilisez l'id complet des docs CheapTokens : le nom court deepseek-v4-flash-0731 est la façon dont les prix sont étiquetés sur le site ; l'API veut l'id complet avec le préfixe deepseek-ai/. Un doute sur un id ? Lister les modèles avec GET /v1/models.
  • .maxCompletionTokens(300L). Un plafond sur la longueur de la réponse, sous forme de long. DeepSeek-V4-Flash autorise jusqu'à 32 768 tokens de sortie par réponse, donc 300 ici est un choix pour garder la démo courte, pas une limite du modèle.
  • content() est un Optional. C'est pourquoi le programme a orElse. Une réponse faite uniquement d'appels d'outils n'a pas de texte.
  • usage() est aussi un Optional. ifPresent l'affiche quand le serveur l'envoie.

Compilez et exécutez-le comme le fait votre build (mvn compile exec:java -Dexec.mainClass=FirstRequest, ou une tâche JavaExec dans Gradle). Vous devriez obtenir l'explication d'un token, puis une ligne finish_reason: … contenant stop, puis une ligne avec les comptes de tokens d'entrée et de sortie. Si finish_reason indique length, la réponse a atteint votre plafond de 300 tokens et a été coupée : augmentez le nombre (pourquoi cela arrive).

usage() renvoie les comptes de tokens du prompt, de la complétion et du total (promptTokens(), completionTokens(), totalTokens()).

Définir les valeurs explicitement avec le builder#

Les tests, ou un service avec plusieurs clients, ont parfois besoin de valeurs explicites. Le même client, construit à la main :

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

Tout ce qui suit cette ligne, les params et l'appel create, reste exactement comme ci-dessus. Continuez à lire la clé depuis l'environnement même ici ; un littéral de chaîne dans un fichier .java finit dans votre dépôt.

Code Java, openai-java, le point de terminaison CheapTokens et le modèle
Votre code parle au SDK ; seule l'URL de base décide qui répond

Trois erreurs que vous rencontrerez d'abord#

Associer les paires

Associez le symptôme à la cause

  • 401 Unauthorizedla clé est vide ou erronée, ou la requête est partie vers api.openai.com parce que OPENAI_BASE_URL n'est pas défini
  • 404 Not Foundl'URL de base n'a pas /v1, ou l'id du modèle n'existe pas
  • finish_reason indique lengthmaxCompletionTokens est inférieur à ce que la réponse nécessite

Une variable d'environnement vide est facile à manquer dans un IDE : une configuration d'exécution lancée depuis la barre d'outils peut ne pas hériter des variables exportées dans le terminal. Si la clé « est définie » mais que vous obtenez toujours 401, ajoutez les variables à la configuration d'exécution. Plus sur ces codes : API 401 ou 404 : clé, URL de base, id du modèle.

Ce que coûte une requête#

Comme vous affichez usage, vous pouvez chiffrer la requête avant de passer à l'échelle. Disons que votre service envoie environ 200 tokens d'entrée et en reçoit 300. Aux prix actuels, cette requête coûte $0.000033 sur DeepSeek-V4-Flash. L'entrée et la sortie sont facturées ensemble, et au total c'est moins cher qu'OpenRouter. Le tableau le répète pour 1 000 requêtes sur nos modèles :

Modèle Par requête 1 000 requêtes OpenRouter, 1 000 requêtes
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 tokens d'entrée et 300 tokens de sortie par requête. Les prix par million de tokens sont actuels et évoluent avec nos tarifs ; la colonne OpenRouter indique des prix de référence pour la même charge de travail.

Maintenant, branchez votre propre trafic. Faites glisser les curseurs vers les chiffres de votre première ligne usage affichée :

Calculateur de coût

Un service de support avec 2 000 requêtes par jour

Tokens d'entrée par requête: 200 · Tokens de sortie par requête: 300 · Requêtes par jour: 2 000

ModèlePar jourPar mois
GLM-5.3-Flash$0.032$0.96
DeepSeek-V4-Flash$0.066$1.98
MiniMax-M2.7$0.11$3.30

Pour plus de marge par réponse ou une autre forme de charge de travail, DeepSeek-V4-Flash vous donne une fenêtre de contexte de 380K et un prix unique à toute heure du jour ; GLM-5.3-Flash (zai-org/GLM-5.3-Flash) est un remplacement direct dans le même programme : changez l'id, rien d'autre. Les prix actuels de tous les modèles sont sur la page de tarification, et la documentation montre la même requête dans d'autres langages. Vous faites cela en Go ? Voir la version openai-go.