Vos scripts, nos modèles.
Une clé, un endpoint compatible avec les clients OpenAI existants, et votre solde de Vena Tokens comme unique unité de facturation. Incluse aux paliers Pro et Expert.
Ce qu'il faut savoir avant d'écrire une ligne.
- Il faut un palier Pro ou Expert
- La clé est incluse à partir de Pro. Un compte gratuit ou Starter reçoit 403 PREMIUM_REQUIRED, à la création comme à l'appel.
- Les appels débitent VOTRE portefeuille
- Chaque appel consomme des Vena Tokens sur le solde du propriétaire de la clé, aux mêmes multiplicateurs que le chat. Rien n'est facturé séparément.
- Le secret ne s'affiche qu'une fois
- Nous n'en stockons que l'empreinte : nous sommes techniquement incapables de vous la réafficher. Perdue, une clé se remplace par une rotation.
- Une clé exposée est bornée, pas illimitée
- Cadence par clé, coupe-circuit sur le volume et sur la dépense. Au-delà, la clé se désactive seule et vous recevez un e-mail.
Un en-tête, et rien d'autre.
La clé se présente dans l'en-tête HTTP Authorization, en schéma Bearer. Aucun autre canal n'est accepté.
Authorization: Bearer vena_sk_VOTRE_CLEQuatre règles, et elles sont toutes de sécurité
- Jamais dans une URL. Un paramètre de requête se retrouve dans les journaux d'accès du serveur, dans ceux du proxy, dans l'en-tête Referer et dans l'historique du navigateur. Nous refusons ce mode d'authentification : il répond 401.
- Jamais dans du JavaScript de navigateur. L'API ne publie aucune configuration CORS, précisément pour empêcher cet usage : une clé dans une page web est une clé publiée.
- Une clé par environnement. 5 clés actives par compte : de quoi séparer production, recette et poste de développement, et couper l'une sans couper les autres.
- La révocation est immédiate. Elle prend effet à l'appel suivant, sans délai de propagation ni cache.
Deux routes, et c'est tout.
https://api.venalabs.example/api/ai/v1| Méthode | Chemin | Rôle | Portée requise |
|---|---|---|---|
| GET | /api/ai/v1/models | Le catalogue des modèles, avec la classe, le multiplicateur et les poids appliqués. Aucun coût : c'est la route qui sert à estimer avant d'appeler. | MODELS |
| POST | /api/ai/v1/chat/completions | Une complétion, streamée ou non selon le champ stream. C'est la seule route qui dépense. | CHAT |
Copiez, collez, exécutez.
Le format d'entrée est celui des clients OpenAI : la plupart des SDK existants fonctionnent en changeant l'URL de base et la clé.
curl https://api.venalabs.example/api/ai/v1/chat/completions \
-H "Authorization: Bearer vena_sk_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"model": "vena-eco",
"messages": [{"role": "user", "content": "Résume ce texte en trois points."}],
"max_tokens": 500
}'Deux comptabilités, servies ensemble.
Le bloc usage porte les tokens du MODÈLE (ceux que tout client OpenAI sait déjà lire) et, préfixés vena_, ce qui a réellement été prélevé sur votre portefeuille. Les deux nombres diffèrent d'un facteur 1 à 80 selon la classe : les confondre est ce qui produit une facture surprise.
{
"id": "3f2a1c8e-…",
"object": "chat.completion",
"model": "vena-eco",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "…" },
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 412,
"completion_tokens": 168,
"total_tokens": 580,
"vena_tokens_charged": 271,
"vena_model_class": "ECO",
"vena_multiplier": 1,
"vena_balance_after": 7999729,
"vena_usage_missing": false
}
}Les champs qui nous sont propres
- vena_tokens_charged — Vena Tokens réellement débités, multiplicateur appliqué. C'est le nombre qui compte.
- vena_model_class — la classe appliquée (ECO, STANDARD, ADVANCED, FRONTIER).
- vena_multiplier — le multiplicateur en vigueur au moment du devis.
- vena_balance_after — votre solde utilisable après ce débit, pour tenir un compteur sans second appel.
- vena_usage_missing — vrai si notre passerelle n'a pas pu confirmer la consommation et que le débit repose sur un repli. Ces mouvements sont identifiés et remboursables.
Champs d'entrée pris en compte
model, messages, max_tokens et stream. Tout autre champ est ignoré en silence : nous préférons l'ignorer que le déclarer sans l'honorer — régler une température qui ne changerait rien serait pire qu'une absence.
Des lignes data:, puis [DONE].
Avec stream à true, la réponse arrive en Server-Sent Events, au protocole des SDK OpenAI : des fragments data: sans nom d'événement, un fragment final portant finish_reason et le bloc usage complet, puis la sentinelle data: [DONE].
data: {"id":"3f2a…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant"}}]}
data: {"id":"3f2a…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Trois "}}]}
data: {"id":"3f2a…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"vena_tokens_charged":271,"vena_balance_after":7999729}}
data: [DONE]Un commentaire de maintien de connexion (: hb) est envoyé toutes les 200 ms. Les clients SSE l'ignorent ; il est indispensable derrière un proxy, qui coupe une connexion inactive au bout de 30 à 60 secondes.
Si vous coupez la connexion en cours de génération, vous êtes débité de ce que le modèle a réellement produit — pas de ce que vous avez reçu, pas de la réservation. Les deux autres bases de calcul sont fausses, l'une dans un sens, l'autre dans l'autre.
Estimez votre facture avant le premier appel.
Un appel ne coûte pas un nombre de tokens : il coûte un nombre de Vena Tokens, qui dépend de la classe du modèle. Voici tout ce qu'il faut pour le calculer vous-même.
La formule, en entier
coût = plafond_supérieur( (tokens_entrée × 0,25 + tokens_sortie × 1,0) × multiplicateur )
L'arrondi supérieur est appliqué une seule fois, en bout de formule. La sortie pèse quatre fois l'entrée, ce qui reflète le rapport des prix fournisseurs. Les tokens de raisonnement comptent en sortie ; ceux servis depuis un cache comptent en entrée.
Les multiplicateurs par classe
- ECO
- ×1
- STANDARD
- ×5
- ADVANCED
- ×25
- FRONTIER
- ×80
Modifiables par l'administration. Une modification s'applique au prochain devis, jamais rétroactivement : chaque mouvement de votre journal fige les poids et le multiplicateur qui lui ont été appliqués. La route /models sert toujours les valeurs en vigueur.
Un exemple concret
Un appel de 2 000 tokens d'entrée et 800 tokens de sortie coûte 1 300 Vena Tokens en classe Éco, 6 500 en Standard, 32 500 en Avancé et 104 000 en Frontier. Sur le quota mensuel Pro (8 M), cela représente environ 6 150 appels en Éco, ou 77 en Frontier.
Ordres de grandeur, arrondis, donnés à titre indicatif : votre consommation réelle dépend de la longueur de vos échanges. Seul le champ vena_tokens_charged de chaque réponse fait foi.
Dans quel ordre vos tokens sont consommés
Votre solde se compose de trois poches : les tokens gagnés en terminant des cours, le quota mensuel de votre abonnement, et les recharges achetées. La consommation se fait par date d'expiration croissante — la poche qui expire le plus tôt part la première.
Cet ordre est le seul qui ne vous soit jamais défavorable : on ne laisse jamais expirer des tokens qu'on aurait pu consommer.
Les recharges achetées sont valables 365 jours et les tokens gagnés en cours 90 jours. Le quota mensuel de l'abonnement expire à la fin de la période, sans report.
Plafonds par requête
Un appel d'abonné est plafonné à 8 000 tokens de sortie. Ce plafond borne le coût du pire appel : il vous protège d'une génération qui part en boucle, et nous d'une facture fournisseur imprévisible. Un max_tokens supérieur est accepté puis ramené à ce plafond.
Ce qui arrête une clé fuitée.
Votre solde borne la dépense totale, jamais le débit. Une clé publiée par erreur dans un dépôt Git respecterait parfaitement votre quota tout en le vidant en une nuit. Trois garde-fous s'en chargent.
Cadence par clé — 60 appels/minute
Au-delà, 429 RATE_LIMITED avec un en-tête Retry-After. La clé reste vivante : ralentir n'est pas condamner. Un client correct recule au premier refus.
Cadence par compte — 30 appels/minute
Elle s'applique à tout ce que le compte consomme, chat compris. Posséder cinq clés ne multiplie donc pas le débit autorisé : c'est ce plafond-là qui fait foi.
Coupe-circuit — la clé se désactive seule
Sur une fenêtre de 10 minutes, trois signaux sont surveillés et un seul suffit : le volume d'appels, l'entêtement après refus, et surtout la dépense. Au-delà, la clé passe en SUSPENDED, les appels suivants reçoivent 401, et vous recevez un e-mail nommant la clé concernée et le motif.
Une clé désactivée ne se réactive pas. Si son secret circule, le réactiver rouvrirait la porte : la réponse correcte est une rotation, qui produit un nouveau secret et tue l'ancien.
Ce que vous recevez, et pourquoi.
Les erreurs sont au format VenaLabs, pas au format OpenAI : {code, message, details}. C'est délibéré — un refus pour solde insuffisant doit se distinguer sans ambiguïté d'un incident quelconque, et le format OpenAI ne connaît pas cette notion.
| Statut | Code | Quand | Que faire |
|---|---|---|---|
| 400 | VALIDATION_ERROR | Corps de requête invalide. details porte un message par champ. | Corrigez le champ signalé. |
| 400 | MODEL_UNKNOWN | Modèle inexistant ou retiré du catalogue. | Relisez /models : c'est la seule liste qui fasse foi. |
| 401 | API_KEY_INVALID | Clé inconnue, révoquée, désactivée ou hors portée. Les quatre cas renvoient exactement la même réponse. | Vérifiez la clé, puis créez-en une nouvelle depuis vos réglages. |
| 402 | INSUFFICIENT_TOKENS | Le solde ne couvre pas le devis de cet appel. Rien n'est appelé, rien n'est débité. | Achetez une recharge, ou attendez le renouvellement de votre quota. |
| 402 | QUOTA_EXCEEDED | Un plafond d'offre est atteint. | Consultez details pour la limite concernée et la date de réinitialisation. |
| 403 | PREMIUM_REQUIRED | Le palier du compte n'ouvre plus l'API développeur. | Reprenez un abonnement Pro ou Expert. Les clés existantes redeviennent utilisables aussitôt. |
| 403 | MODEL_NOT_ALLOWED | La classe demandée n'est pas ouverte au palier du compte. | Changez de classe, ou changez de palier. |
| 413 | CONTEXT_TOO_LARGE | La conversation dépasse la fenêtre de contexte du modèle. | Raccourcissez l'historique, ou choisissez un modèle à plus grand contexte. |
| 429 | RATE_LIMITED | Cadence dépassée, ou coupe-circuit déclenché. details.keyDisabled vaut true dans le second cas. | Respectez Retry-After. Si la clé a été désactivée, faites une rotation. |
| 503 | AI_UNAVAILABLE | La passerelle d'inférence est momentanément indisponible. | Réessayez. Rien n'a été débité : un appel qui n'a pas abouti est intégralement rendu. |
Les limites, dites tout de suite.
- Un seul choix par appel : le champ n n'est pas supporté.
- Ni outils, ni appels de fonctions, ni sorties structurées : le champ tools est ignoré.
- Ni images, ni fichiers en entrée : messages ne prend que du texte.
- Ni température, ni top_p : ces réglages ne sont pas exposés tant qu'ils ne sont pas honorés.
- Les identifiants de modèles sont des identifiants VenaLabs. Ils ne nomment pas de fournisseur.