curl --request POST \
--url https://direct.evolink.ai/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "Quel temps fait-il à Shanghai aujourd'hui ?"
}
]
}
],
"tools": [
{
"googleSearch": {}
}
]
}
EOF{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "Hello! I'm pleased to introduce myself.\n\nI'm a large language model, trained and developed by Google...",
"thought": true,
"thoughtSignature": "<Signature_A>"
}
]
},
"finishReason": "STOP",
"continuationToken": "<string>",
"index": 0,
"safetyRatings": [
{}
]
}
],
"promptFeedback": {
"safetyRatings": [
{}
]
},
"usageMetadata": {
"promptTokenCount": 4,
"candidatesTokenCount": 611,
"totalTokenCount": 2422,
"thoughtsTokenCount": 1807,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 4
}
],
"cachedContentTokenCount": 0
},
"modelVersion": "gemini-3.6-flash",
"responseId": "l-LoaPu0BPmo1dkP6ZPHiQc"
}{
"error": {
"code": 400,
"message": "Paramètres de requête invalides",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Quota insuffisant",
"type": "insufficient_quota_error",
"fallback_suggestion": "https://evolink.ai/dashboard/credits"
}
}{
"error": {
"code": 403,
"message": "Access denied for this model",
"type": "permission_error"
}
}{
"error": {
"code": 404,
"message": "Model not found",
"type": "not_found_error"
}
}{
"error": {
"code": 413,
"message": "Corps de la requête trop volumineux",
"type": "request_too_large_error",
"fallback_suggestion": "reduce file size"
}
}{
"error": {
"code": 429,
"message": "Limite de débit dépassée",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Erreur interne du serveur",
"type": "internal_server_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 502,
"message": "Upstream AI service unavailable",
"type": "upstream_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 503,
"message": "Service temporairement indisponible",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}API tous modèles Gemini - format API native
Sélectionnez le modèle de texte Gemini à appeler via {model} dans le chemin (voir le tableau de correspondance du paramètre model pour toutes les valeurs possibles).
- Utilise le format Google Native API, retourne le contenu de la conversation de manière synchrone
- Entrée texte brut / multimodale : entrée mixte texte + image / audio / vidéo
- Streaming : remplacez
generateContentparstreamGenerateContentdans le chemin (ajoutez?alt=ssepour obtenir du SSE)
Spécifications et différences des modèles
- Comportement de 3.8 : par rapport à 3.7, le modèle améliore l’ingénierie logicielle, les agents, le raisonnement multi-étapes et la précision multimodale ; il peut consommer davantage de tokens de raisonnement / sortie, surtout avec
high. Utilisezlowsi la latence est critique, la valeur par défautmediumpour un usage général ethighpour le code complexe, les longues vidéos ou le raisonnement multi-étapes. - Comportement de Gemini 4 Argon : le raisonnement est contrôlé uniquement par
thinkingConfig.thinkingLevel, avec les niveauxlow/medium/high; si le paramètre est omis, le modèle détermine la quantité de raisonnement.minimaln’est pas pris en charge (renvoie 400 ; utilisezlowà la place), nithinkingBudget(renvoie 400).temperature/topPhors de la plage valide renvoient 400. Lors des appels de fonctions sur plusieurs tours, lathoughtSignaturerenvoyée au tour précédent doit être retransmise sans modification, sinon une erreur 400 est renvoyée. L’entrée prend en charge le texte / les images / l’audio / la vidéo / les PDF. - Paramètres d’échantillonnage
temperature/topP/topK: identiques pour toute la série Gemini 3.x, les valeurs personnalisées n’affectent pas la sortie ;topKest ignoré et sans effet, ettemperature/topPrenvoient une erreur 400 si elles sont hors de la plage autorisée. - Contrôle du raisonnement : la série Gemini 3.x / 4 utilise
thinkingConfig.thinkingLevel(voir le paramètrethinkingLevelpour les niveaux pris en charge et la valeur par défaut de chaque modèle) ; la série Gemini 2.5 utilisethinkingConfig.thinkingBudget(entier,0=désactivé). Les deux sont mutuellement exclusifs.gemini-3.8-flash/gemini-3.7-flashet la série Pro ne prennent pas en chargeminimal; la valeur transmise est automatiquement rétrogradée enlow. - Appel de fonction : le
FunctionResponsede Gemini 3.x doit renvoyer l’idet lenamecorrespondant auFunctionCallassocié, sinon une erreur est générée. - Rôle du dernier tour : le
roledu dernier message ne peut pas êtremodel(Gemini 3.5+ génère une erreur). - Limite de tokens :
gemini-3.8-flash/gemini-3.7-flash/gemini-3.6-flash/gemini-3.5-flash-liteont un contexte de 1,048,576 et une sortie maximale de 65,536.gemini-4-argonpartage un contexte de 1,048,576 entre entrée, raisonnement et sortie ; chaque requête renvoie jusqu’à 65,536 tokens en streaming ou 32,768 sans streaming, raisonnement et réponse compris. Pour une sortie plus longue, utilisez la continuation ; le cumul du raisonnement et de la réponse est limité à l’espace restant après l’entrée. Voir « Continuation des sorties longues » sur cette page. Les autres modèles suivent leurs spécifications. - ID Gemini 2.5 : à partir du 2026-10-19,
gemini-2.5-pro/gemini-2.5-flash/gemini-2.5-flash-litesont traités pargemini-3.8-flash/gemini-3.5-flash-lite/gemini-3.1-flash-lite-previewet facturés à leurs tarifs ; la réponse indique le nouvel ID de modèle, et le comportement des paramètres suit le nouveau modèle.thinkingBudgetest converti en niveau (voir le paramètrethinkingBudget).
curl --request POST \
--url https://direct.evolink.ai/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "Quel temps fait-il à Shanghai aujourd'hui ?"
}
]
}
],
"tools": [
{
"googleSearch": {}
}
]
}
EOF{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "Hello! I'm pleased to introduce myself.\n\nI'm a large language model, trained and developed by Google...",
"thought": true,
"thoughtSignature": "<Signature_A>"
}
]
},
"finishReason": "STOP",
"continuationToken": "<string>",
"index": 0,
"safetyRatings": [
{}
]
}
],
"promptFeedback": {
"safetyRatings": [
{}
]
},
"usageMetadata": {
"promptTokenCount": 4,
"candidatesTokenCount": 611,
"totalTokenCount": 2422,
"thoughtsTokenCount": 1807,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 4
}
],
"cachedContentTokenCount": 0
},
"modelVersion": "gemini-3.6-flash",
"responseId": "l-LoaPu0BPmo1dkP6ZPHiQc"
}{
"error": {
"code": 400,
"message": "Paramètres de requête invalides",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Quota insuffisant",
"type": "insufficient_quota_error",
"fallback_suggestion": "https://evolink.ai/dashboard/credits"
}
}{
"error": {
"code": 403,
"message": "Access denied for this model",
"type": "permission_error"
}
}{
"error": {
"code": 404,
"message": "Model not found",
"type": "not_found_error"
}
}{
"error": {
"code": 413,
"message": "Corps de la requête trop volumineux",
"type": "request_too_large_error",
"fallback_suggestion": "reduce file size"
}
}{
"error": {
"code": 429,
"message": "Limite de débit dépassée",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Erreur interne du serveur",
"type": "internal_server_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 502,
"message": "Upstream AI service unavailable",
"type": "upstream_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 503,
"message": "Service temporairement indisponible",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}generateContent par streamGenerateContent dans l’URL. Gardez le corps de requête inchangé ; la réponse arrive par blocs. Ajoutez ?alt=sse pour demander le format SSE.https://direct.evolink.ai, qui offre une meilleure prise en charge des modèles de texte et des connexions persistantes. https://api.evolink.ai est le point d’accès principal pour les services multimodaux et sert d’adresse de secours pour les modèles de texte.Continuation des sorties longues (Gemini 4 Argon)
Une requêtegemini-4-argon renvoie au maximum 65,536 tokens en streaming ou 32,768 sans streaming, raisonnement et réponse compris. Pour une sortie plus longue, utilisez plusieurs requêtes de continuation. L’entrée, le raisonnement et la réponse partagent un contexte de 1,048,576 tokens : le cumul du raisonnement et de la réponse ne peut utiliser que l’espace restant après l’entrée. Seule l’API native prend en charge la continuation ; le format compatible OpenAI ne la prend pas en charge.
Streaming streamGenerateContent | Sans streaming generateContent | |
|---|---|---|
| Sortie maximale par requête | 65,536 | 32,768 |
| Emplacement du token de continuation à la fin | Dans le dernier bloc : candidates[0].continuationToken | candidates[0].continuationToken |
- Définissez
generationConfig.maxOutputTokensau-dessus de la limite par requête : plus de 65,536 en streaming ou de 32,768 sans streaming. Le paramètre accepte jusqu’à 1,048,576, mais la sortie reste limitée par le contexte partagé. Cette valeur est le budget cumulé de raisonnement et de réponse pour toutes les requêtes de continuation. - Si
candidates[0].finishReasonvautCONTINUATION, la génération n’est pas terminée. Le même candidat contient uncontinuationToken. - Renvoyez la requête d’origine avec les mêmes
contents,systemInstruction,toolsetgenerationConfig. Ajoutez uniquementcontinuationTokenà la racine, avec la dernière valeur reçue, sans la modifier. - Répétez l’étape 3 uniquement tant que
finishReasonvautCONTINUATION; arrêtez-vous pour toute autre raison.STOPindique une fin normale etMAX_TOKENSl’épuisement du budget cumulé. Chaque réponse contient seulement le nouveau contenu ; concaténez les réponses dans l’ordre.
- N’ajoutez pas la sortie partielle à
contentset n’envoyez pas de nouvelle consigne telle que « continue ». - Une requête peut consacrer toute sa génération au raisonnement et renvoyer un texte de réponse vide. Continuez si la raison de fin est
CONTINUATION. MAX_TOKENSpeut aussi renvoyer uncontinuationToken. Pour reprendre, augmentez manuellementmaxOutputTokenset renvoyez la requête d’origine avec le dernier token. Conserver le budget épuisé renvoie 400. Voir « Reprendre après épuisement du budget » ci-dessous.- Dans une conversation à plusieurs tours, attendez
STOPavant d’ajouter la réponse complète concaténée à l’historique sous la forme d’un seul messagemodel.
Exemples
Première requête :curl -X POST "https://direct.evolink.ai/v1beta/models/gemini-4-argon:generateContent" \
-H "Authorization: Bearer $EVOLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{ "role": "user", "parts": [{ "text": "Rédigez un document de conception complet pour un runtime asynchrone Rust, avec architecture, ordonnanceur, pilote I/O, temporisateurs et exemples de code complets." }] }
],
"generationConfig": {
"maxOutputTokens": 262144,
"thinkingConfig": { "thinkingLevel": "high" }
}
}'
{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "# Conception d’un runtime asynchrone Rust\n\n## 1. Architecture\n…"
}
]
},
"finishReason": "CONTINUATION",
"continuationToken": "<une longue chaîne opaque à conserver telle quelle>"
}
]
}
CONTINUATION, renvoyez la même requête en ajoutant continuationToken à la racine :
curl -X POST "https://direct.evolink.ai/v1beta/models/gemini-4-argon:generateContent" \
-H "Authorization: Bearer $EVOLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{ "role": "user", "parts": [{ "text": "Rédigez un document de conception complet pour un runtime asynchrone Rust, avec architecture, ordonnanceur, pilote I/O, temporisateurs et exemples de code complets." }] }
],
"generationConfig": {
"maxOutputTokens": 262144,
"thinkingConfig": { "thinkingLevel": "high" }
},
"continuationToken": "<continuationToken de la réponse précédente>"
}'
CONTINUATION et renvoie le résultat à la fin ou à l’épuisement du budget. Elle conserve le dernier token et n’augmente pas automatiquement le budget après MAX_TOKENS :
import os
from copy import deepcopy
import requests
URL = "https://direct.evolink.ai/v1beta/models/gemini-4-argon:generateContent"
HEADERS = {"Authorization": f"Bearer {os.environ['EVOLINK_API_KEY']}"}
def generate_with_continuation(body):
request_body = deepcopy(body)
pieces = []
while True:
# Délai de lecture du client : 1,200 secondes, sans garantie de connexion serveur pendant 20 minutes.
resp = requests.post(URL, headers=HEADERS, json=request_body, timeout=1200)
resp.raise_for_status()
candidates = resp.json().get("candidates", [])
if not candidates:
raise RuntimeError("Aucun candidat dans la réponse ; vérifiez promptFeedback.")
candidate = candidates[0]
for part in candidate.get("content", {}).get("parts", []):
if not part.get("thought"):
pieces.append(part.get("text", ""))
reason = candidate.get("finishReason")
token = candidate.get("continuationToken")
if reason == "CONTINUATION":
if not token:
raise RuntimeError("La réponse demande une continuation sans fournir de continuationToken.")
request_body["continuationToken"] = token # Conserver tous les autres champs
continue
return {
"text": "".join(pieces),
"finishReason": reason,
"continuationToken": token,
}
body = {
"contents": [
{"role": "user", "parts": [{"text": "Rédigez un document de conception complet pour un runtime asynchrone Rust, avec architecture, ordonnanceur, pilote I/O, temporisateurs et exemples de code complets."}]}
],
"generationConfig": {"maxOutputTokens": 262144, "thinkingConfig": {"thinkingLevel": "high"}},
}
result = generate_with_continuation(body)
print(result["text"])
print("finishReason:", result["finishReason"])
if result["finishReason"] == "MAX_TOKENS":
print("Budget de sortie cumulé épuisé. Si un token a été renvoyé, augmentez manuellement maxOutputTokens pour reprendre.")
Reprendre après épuisement du budget
Cet exemple réutilisegenerate_with_continuation, URL et HEADERS ci-dessus. Il génère une liste de nombres avec un petit budget, puis augmente explicitement le budget total de 64 à 2,048. Conservez les contents d’origine et les autres paramètres ; ajoutez le token et augmentez le budget pour reprendre au point de coupure.
body = {
"contents": [
{"role": "user", "parts": [{"text": "Output integers 1 through 100, one per line. Start immediately."}]}
],
"generationConfig": {"maxOutputTokens": 64, "thinkingConfig": {"thinkingLevel": "low"}},
}
first = generate_with_continuation(body)
print(first["text"], end="")
if first["finishReason"] == "MAX_TOKENS" and first["continuationToken"]:
body["continuationToken"] = first["continuationToken"]
body["generationConfig"]["maxOutputTokens"] = 2048 # Le client augmente explicitement le budget cumulé
resumed = generate_with_continuation(body)
print(resumed["text"], end="")
print("\nfinishReason:", resumed["finishReason"])
else:
print("\nfinishReason:", first["finishReason"])
finishReason : pour CONTINUATION, renvoyez le dernier token sans changer les paramètres ; pour MAX_TOKENS, augmentez manuellement le budget cumulé si vous souhaitez reprendre ; STOP indique une fin normale.
Facturation et erreurs
- Chaque requête est facturée séparément. Une continuation comptabilise de nouveau l’entrée d’origine et le contenu déjà généré comme entrée. Les parties servies par le cache implicite sont facturées au tarif du cache.
- Le
usageMetadatade chaque réponse couvre uniquement cette requête. Additionnez les usages des différentes requêtes pour obtenir le total. Dans un même flux, les valeurs sont cumulatives : utilisez uniquement le dernierusageMetadata, sans additionner les cumuls intermédiaires. - Pour l’API native, l’estimation de la réserve liée à la sortie utilise le minimum de
maxOutputTokenset 65,536, y compris sans streaming ; l’entrée est estimée séparément. La sortie sans streaming est réellement limitée à 32,768 par requête : un budget supérieur peut donc réserver plus qu’une estimation fondée sur cette limite réelle. La facturation finale utilise les données d’usage de la réponse. - Un token invalide renvoie 400. Un token de format correct mais de contenu invalide peut renvoyer
Invalid continuation token.; un format incorrect peut produire une autre erreur de paramètre. Les autres modèles ignorentcontinuationToken. - Reprendre après
MAX_TOKENSavec un token sans augmenter le budgetmaxOutputTokensépuisé renvoie également 400.
Autorisations
##Toutes les API nécessitent une authentification Bearer Token##
Obtenir une clé API :
Visitez la Page de gestion des clés API pour obtenir votre clé API
Ajouter à l'en-tête de requête :
Authorization: Bearer YOUR_API_KEY
Paramètres de chemin
Sélectionnez le modèle de texte Gemini à appeler :
| Modèle ID | Série | Positionnement |
|---|---|---|
gemini-4-argon | 4 Argon | Rapports longs et grands projets de code ; jusqu’à 65,536 tokens par requête en streaming / 32,768 sans streaming ; continuation native limitée par le contexte partagé |
gemini-3.8-flash | 3.8 Flash | Ingénierie logicielle / agents / raisonnement multi-étapes / précision multimodale améliorés |
gemini-3.7-flash | 3.7 Flash | Agentique de niveau Pro / Génération de code / Exécution en terminal |
gemini-3.6-flash | 3.6 Flash | Orchestration multi-étapes / Refactorisation de code / Raisonnement général |
gemini-3.5-flash | 3.5 Flash | Flash générique |
gemini-3.5-flash-lite | 3.5 Flash-Lite | Faible coût / Haut débit / Agent léger |
gemini-3.1-pro-preview | 3.1 Pro (Preview) | Raisonnement avancé |
gemini-3.1-pro-preview-customtools | 3.1 Pro · CustomTools | Raisonnement avancé + Outils personnalisés |
gemini-3.1-flash-lite-preview | 3.1 Flash-Lite (Preview) | Faible coût |
gemini-3-pro-preview | 3.0 Pro (Preview) | Raisonnement avancé |
gemini-3-flash-preview | 3.0 Flash (Preview) | Flash générique |
gemini-2.5-pro | 2.5 Pro | Ancien ID ; à partir du 2026-10-19, traité par gemini-3.8-flash et facturé à ses tarifs |
gemini-2.5-flash | 2.5 Flash | Ancien ID ; à partir du 2026-10-19, traité par gemini-3.5-flash-lite et facturé à ses tarifs |
gemini-2.5-flash-lite | 2.5 Flash-Lite | Ancien ID ; à partir du 2026-10-19, traité par gemini-3.1-flash-lite-preview et facturé à ses tarifs |
gemini-4-argon, gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.5-flash, gemini-3.5-flash-lite, gemini-3.1-pro-preview, gemini-3.1-pro-preview-customtools, gemini-3.1-flash-lite-preview, gemini-3-pro-preview, gemini-3-flash-preview, gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite "gemini-3.6-flash"
Corps
List of conversation contents, supports multi-turn dialogue and multimodal input
1Show child attributes
Show child attributes
System instruction (optional), mainly text content
Show child attributes
Show child attributes
Outils que le modèle peut appeler. Trois types sont pris en charge :
functionDeclarations: appels de fonctionscodeExecution: exécution de codegoogleSearch: recherche web avec Google Search. Utilisez{"googleSearch": {}}(camelCase ;google_searchrenvoie HTTP 400). Disponible pour tous les modèles de texte Gemini. La réponse contient les requêtes et les sources danscandidates[].groundingMetadata; la facturation se fait par appel.
[{ "googleSearch": {} }]
Tool calling configuration (optional)
Safety settings list (optional)
Generation configuration parameters (optional)
Show child attributes
Show child attributes
Token de continuation des sorties longues (gemini-4-argon uniquement). Placez le dernier candidates[0].continuationToken à la racine de la requête, sans le modifier. Conservez les contents, systemInstruction et tools d’origine ; n’ajoutez pas la sortie partielle.
CONTINUATION: conservez tous les paramètres de génération et renvoyez le token.MAX_TOKENS: un token peut aussi être renvoyé ; augmentez manuellement le budget cumulémaxOutputTokensavant de reprendre, sans modifier les autres paramètres. Le budget épuisé renvoie 400.- Un token invalide renvoie 400.
- Les autres modèles ignorent ce champ.
Voir Référence complète de l’API native, section « Continuation des sorties longues ».
Cached content name, in the form cachedContents/{cachedContent}
Réponse
Contenu généré avec succès
Description du format de réponse :
- Lors de l'utilisation du endpoint
generateContent, retourneGenerateContentResponse(retourne la réponse complète en une fois) - Lors de l'utilisation du endpoint
streamGenerateContent, retourneStreamGenerateContentResponse(réponse en streaming, retourne le contenu par morceaux)
- Réponse synchrone
- Réponse en flux