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.

Sur cette page
Pour appeler CheapTokens depuis Java, gardez le SDK officiel openai-java et modifiez trois choses : l'URL de base (https:/), 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
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>4.99.0</version>
</dependency>Gradle
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. 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.)
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:/. 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é.

Le programme#
Créez FirstRequest. :
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.
.. Les exemples du README du SDK utilisent des constantes typées commemodel("deepseek- ai/ DeepSeek- V4- Flash- 0731") ChatModel., mais le builder a aussi une surchargeGPT_ 5_ 2 model(String), donc n'importe quel id fonctionne. Utilisez l'id complet des docs CheapTokens : le nom courtdeepseek-est la façon dont les prix sont étiquetés sur le site ; l'API veut l'id complet avec le préfixev4- flash- 0731 deepseek-ai/. Un doute sur un id ? Lister les modèles avec GET /v1/models... Un plafond sur la longueur de la réponse, sous forme demaxCompletionTokens(300L) 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 unOptional. C'est pourquoi le programme aorElse. Une réponse faite uniquement d'appels d'outils n'a pas de texte.usage()est aussi unOptional.ifPresentl'affiche quand le serveur l'envoie.
Compilez et exécutez-le comme le fait votre build (mvn compile exec:java -, 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 :
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.

Trois erreurs que vous rencontrerez d'abord#
Associer les paires
Associez le symptôme à la cause
Touchez un élément à gauche, puis sa paire
- 401 Unauthorizedla clé est vide ou erronée, ou la requête est partie vers api.openai.com parce que
OPENAI_BASE_URLn'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 length
maxCompletionTokensest 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 | Entrée $/1M | Sortie $/1M | Par requête | 1 000 requêtes | OpenRouter, 1 000 requêtes |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000016 | $0.016 | $0.0316 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000033 | $0.033 | $0.056 |
| MiniMax-M2.7 | $0.05 | $0.15 | $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èle | Par jour | Par mois |
|---|---|---|
| GLM-5.3-Flash$0.02$0.04 | $0.032 | $0.96 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.066 | $1.98 |
| MiniMax-M2.7$0.05$0.15 | $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-) 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.



