Créer une chat completion
POST/chat/completions
Reçoit une conversation et renvoie la réponse du modèle, au format chat completions d'OpenAI : les SDK officiels fonctionnent tels quels. Streaming, appel d'outils et modèles de raisonnement plus bas.
BientôtOuverture prochaine : ce qui suit décrit le service tel qu'il fonctionnera.
https://evanesca.app/api/v1/chat/completionsOuvre au lancementBearer $EVANESCA_API_KEYAuthorizationstringrequisBearer suivi de votre clé, qui commence par sk-eva-.
Content-Typestringrequisapplication/json : le corps est du JSON.
Corps de la requête
application/jsonmodelstringrequisUn identifiant du tableau des modèles, par exemple gemma-4-26b.
messagesarrayrequisLa conversation, en objets {role, content} au format OpenAI : system, user, assistant — et tool pour le résultat d'un outil.
streambooleantrue envoie la réponse en server-sent events (Streaming).
max_tokensintegerPlafond de tokens de la réponse. Sur un modèle de raisonnement, la réflexion compte dedans : omettez-le ou laissez au moins 1 000 tokens environ (pourquoi).
tools, tool_choicetableau · chaîne ou objetAppel de fonctions, au format OpenAI (quels modèles).
temperature, top_p, stop…diversLes paramètres d'échantillonnage d'OpenAI, transmis tels quels à l'opérateur.
Où l'appel tourne, ce qu'il coûte
Evanesca · au dossier
- Exécuté
- Mistral AI · Région UE de Mistral AI
mistral-large-4,mistral-small-4-119b - AKI.IO · Allemagne
deepseek-v4.1-flash,glm-5.3,gemma-4-26b - Scaleway · Paris, France
qwen3.8-27b,deepseek-v4-flash,glm-5.2,qwen3.6-35b,qwen3.5-397b,gpt-oss-120b,qwen3-coder-30b,qwen3-235b,mistral-small-3.2,llama-3.3-70b,pixtral-12b - Infomaniak · Suisse
apertus-v1.5-70b
- Mistral AI · Région UE de Mistral AI
- L'opérateur garde
Mistral AI conserve les entrées et sorties de l'API pendant trente jours glissants pour surveiller les abus (politique de confidentialité de Mistral).
AKI.IO annonce que prompts, entrées et réponses générées sont traités en mémoire volatile, sans être journalisés, stockés ni analysés (AKI.IO) ; sa politique de confidentialité garde 90 jours les données d'usage — identifiant de requête, modèle, statut, horodatages, tokens — pour la facturation et la maintenance (politique de confidentialité d'AKI.IO).
Scaleway peut conserver et lire les requêtes qui provoquent des erreurs ou paraissent abusives, jusqu'à 14 jours (page confidentialité de Scaleway).
OVHcloud annonce ne garder que les données nécessaires à la facturation, « zero data retention » (OVHcloud AI Endpoints).
Infomaniak annonce que les requêtes ne sont ni enregistrées ni utilisées pour entraîner des modèles (Infomaniak AI Tools).
- Coût
- Au token, au prix du modèle, TVA comprise : 0,168 € à 3,024 € par million de tokens d'entrée, 0,336 € à 9,24 € par million de tokens de sortie — le raisonnement compte en sortie. Une question rapide (300 tokens en entrée, 400 en sortie) sur gemma-4-26b : environ 0,0004 € (tous les prix).
- En-têtes de réponse
x-evanesca-operator: mistral | aki | scaleway | infomaniakx-evanesca-location: mistral-eu-region | germany | paris | switzerland
Ce qui arrive à l'opérateur
Evanesca transmet le corps de la requête à l'opérateur qui sert le modèle : les paramètres d'OpenAI se comportent comme OpenAI les documente, et un paramètre qu'un opérateur ne prend pas en charge est ignoré par lui. Deux exceptions gardent le routage et la facturation chez Evanesca : les champs qui demanderaient à un routeur de choisir un autre modèle ou un autre hébergeur — models, provider, plugins — sont retirés, et un max_tokens au-dessus du plafond de l'opérateur pour ce modèle est ramené à ce plafond au lieu d'échouer.
La réponse est un objet chat.completion standard. Son champ model porte le nom que l'opérateur donne au modèle qui a répondu ; son bloc usage est ce que votre crédit paie, au token près.
Streaming
Avec "stream": true, la réponse arrive en server-sent events : des lignes data: qui portent des fragments au format OpenAI, jusqu'à data: [DONE]. C'est le format d'OpenAI, donc les fonctions de streaming des SDK marchent telles quelles.
Evanesca demande toujours l'usage à l'opérateur dans le flux (stream_options.include_usage) : le dernier fragment avant [DONE] porte l'objet usage et un tableau choices vide. C'est lui qui permet de facturer un appel en streaming au token près — attendez-vous à le voir si vous lisez le flux vous-même.
Appel d'outils
Envoyez tools et tool_choice au format OpenAI : Evanesca les transmet tels quels à l'opérateur, et les appels d'outils reviennent dans message.tool_calls (ou en fragments si vous streamez). Qu'un modèle en émette dépend du modèle et de son opérateur : le catalogue l'indique modèle par modèle, d'après un vrai appel plutôt qu'une fiche de modèle.
Tous les modèles du tableau renvoient des appels d'outils.
Dans GET /models, tool_calling vaut true ou false là où il a été mesuré, et manque là où il ne l'a pas été : filtrez dessus avant de déployer un agent.
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Météo actuelle d'une ville",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
answer = client.chat.completions.create(
model="gemma-4-26b",
messages=[{"role": "user", "content": "Quel temps fait-il à Lyon ?"}],
tools=tools,
)
print(answer.choices[0].message.tool_calls)Modèles de raisonnement
Ces modèles réfléchissent avant de répondre : deepseek-v4.1-flash, glm-5.3, qwen3.8-27b, deepseek-v4-flash, glm-5.2, qwen3.6-35b, qwen3.5-397b, gpt-oss-120b. Cette réflexion est faite de tokens de complétion : elle est facturée en sortie, au prix de sortie du modèle, avant le moindre texte visible. Sur tout modèle, les tokens de raisonnement que l'opérateur rapporte comptent comme de la sortie.
Laissez-leur de la marge. Avec un max_tokens bas, tout le budget peut partir dans la réflexion, et la réponse revient sans contenu, avec finish_reason "length" : elle paraît vide, mais rien n'a échoué. Omettez max_tokens, ou laissez au moins 1 000 tokens environ.
La réflexion prend aussi du temps : sur un long prompt, un modèle comme deepseek-v4.1-flash peut travailler plusieurs minutes avant que la réponse soit complète. Relevez le délai d'attente de votre client HTTP (le nœud OpenAI Chat Model de n8n, par exemple, coupe à 60 secondes par défaut) ou streamez la réponse.
Erreurs
| Statut | type | Signification |
|---|---|---|
| 400 | invalid_ | Le corps n'est pas du JSON valide, ou model ou messages manque. |
| 401 | invalid_ | Pas de clé, une clé malformée, ou une clé révoquée. |
| 402 | insufficient_ | Votre crédit est à zéro ou en dessous. Rechargez pour continuer. |
| 404 | model_ | Identifiant inconnu, modèle qu'Evanesca ne sert pas, ou modèle d'embedding envoyé ici. GET /models liste les identifiants valides. |
| 502 | upstream_ | L'opérateur est injoignable, a renvoyé une réponse illisible, ou a refusé le compte d'Evanesca elle-même. Votre clé n'est pas en cause : réessayez. |
Les autres erreurs d'opérateur vous parviennent avec son statut et son corps, et Retry-After quand il en envoie un (erreurs).
curl https://evanesca.app/api/v1/chat/completions \
-H "Authorization: Bearer $EVANESCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemma-4-26b",
"messages": [{"role": "user", "content": "Bonjour"}]
}'import os
from openai import OpenAI
client = OpenAI(
base_url="https://evanesca.app/api/v1",
api_key=os.environ["EVANESCA_API_KEY"],
)
answer = client.chat.completions.create(
model="gemma-4-26b",
messages=[{"role": "user", "content": "Bonjour"}],
)
print(answer.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://evanesca.app/api/v1",
apiKey: process.env.EVANESCA_API_KEY,
});
const answer = await client.chat.completions.create({
model: "gemma-4-26b",
messages: [{ role: "user", content: "Bonjour" }],
});
console.log(answer.choices[0].message.content);package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{"model": "gemma-4-26b", "messages": [{"role": "user", "content": "Bonjour"}]}`)
req, err := http.NewRequest("POST", "https://evanesca.app/api/v1/chat/completions", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("EVANESCA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}{
"id": "chatcmpl-…",
"object": "chat.completion",
"model": "…",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "…" },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21 }
}{
"error": {
"message": "Insufficient credit balance. Add credit to your account to continue.",
"type": "insufficient_credit"
}
}