curl --request POST \
--url https://direct.evolink.ai/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "¿Qué tiempo hace hoy en Shanghái?"
}
]
}
],
"tools": [
{
"googleSearch": {}
}
]
}
'{
"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": "Parámetros de solicitud inválidos",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Cuota insuficiente",
"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": "Cuerpo de solicitud demasiado grande",
"type": "request_too_large_error",
"fallback_suggestion": "reduce file size"
}
}{
"error": {
"code": 429,
"message": "Semilla aleatoria, rango `[1, 2147483647]`\n\n**Nota:**\n- Usar el mismo valor de semilla puede mantener resultados de generación consistentes\n- Dejar vacío para semilla aleatoria",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Error interno del servidor",
"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": "Servicio temporalmente no disponible",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}Interfaz de todos los modelos Gemini - formato de API nativa
Selecciona el modelo de texto Gemini que deseas invocar mediante {model} en la ruta (consulta la tabla de referencia del parámetro model para ver todos los valores posibles).
- Usa el formato de API nativa de Google y devuelve el contenido de la conversación de forma síncrona
- Entrada de texto plano / multimodal: entrada mixta de texto + imagen / audio / video
- Streaming: reemplaza
generateContentporstreamGenerateContenten la ruta (puedes añadir?alt=ssepara obtener SSE)
Especificaciones y diferencias de los modelos
- Comportamiento de 3.8: en comparación con 3.7, mejora la ingeniería de software, los agentes, el razonamiento multipaso y la precisión multimodal; puede consumir más tokens de razonamiento / salida, especialmente con
high. Usalowcuando la latencia sea crítica, el valor predeterminadomediumpara uso general yhighpara código complejo, vídeos largos o razonamiento multipaso. - Comportamiento de Gemini 4 Argon: el razonamiento se controla únicamente mediante
thinkingConfig.thinkingLevel, con los niveleslow/medium/high; si se omite, el modelo decide cuánto razonar. No admiteminimal(devuelve 400; usalowen su lugar) nithinkingBudget(devuelve 400).temperature/topPfuera del rango válido devuelven 400. En llamadas a funciones de varios turnos, lathoughtSignaturedevuelta en el turno anterior debe reenviarse sin cambios; de lo contrario, se devuelve 400. La entrada admite texto / imágenes / audio / vídeo / PDF. - Parámetros de muestreo
temperature/topP/topK: consistente en toda la serie Gemini 3.x, los valores personalizados no afectan a la salida;topKse ignora y no surte efecto, ytemperature/topPdevuelven un 400 si están fuera del rango válido. - Control del razonamiento: la serie Gemini 3.x / 4 usa
thinkingConfig.thinkingLevel(consulta el parámetrothinkingLevelpara ver los niveles admitidos y el valor por defecto de cada modelo); la serie Gemini 2.5 usathinkingConfig.thinkingBudget(entero,0=desactivado). Ambos son mutuamente excluyentes.gemini-3.8-flash/gemini-3.7-flashy la serie Pro no admitenminimal; si se envía, se degrada automáticamente alow. - Llamadas a funciones: en Gemini 3.x, el
FunctionResponsedebe devolver elidy elnameque coincidan con elFunctionCallcorrespondiente; de lo contrario, se produce un error. - Rol del último turno: el
roledel último mensaje no puede sermodel(Gemini 3.5+ devuelve un error). - Límite de tokens:
gemini-3.8-flash/gemini-3.7-flash/gemini-3.6-flash/gemini-3.5-flash-litetienen un contexto de 1,048,576 y una salida máxima de 65,536.gemini-4-argoncomparte un contexto de 1,048,576 entre entrada, razonamiento y salida; cada solicitud devuelve hasta 65,536 tokens con streaming o 32,768 sin streaming, razonamiento y respuesta incluidos. Para salidas más largas, usa continuación; el razonamiento y la respuesta acumulados solo pueden usar el espacio restante después de la entrada. Consulta «Continuación de salidas largas» en esta página. Los demás modelos siguen sus especificaciones. - ID de Gemini 2.5: desde el 2026-10-19,
gemini-2.5-pro/gemini-2.5-flash/gemini-2.5-flash-litelos atiendengemini-3.8-flash/gemini-3.5-flash-lite/gemini-3.1-flash-lite-previewy se facturan a sus precios; la respuesta muestra el ID del modelo nuevo, y el comportamiento de los parámetros sigue al modelo nuevo.thinkingBudgetse convierte a un nivel (consulta el parámetrothinkingBudget).
curl --request POST \
--url https://direct.evolink.ai/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "¿Qué tiempo hace hoy en Shanghái?"
}
]
}
],
"tools": [
{
"googleSearch": {}
}
]
}
'{
"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": "Parámetros de solicitud inválidos",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Cuota insuficiente",
"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": "Cuerpo de solicitud demasiado grande",
"type": "request_too_large_error",
"fallback_suggestion": "reduce file size"
}
}{
"error": {
"code": 429,
"message": "Semilla aleatoria, rango `[1, 2147483647]`\n\n**Nota:**\n- Usar el mismo valor de semilla puede mantener resultados de generación consistentes\n- Dejar vacío para semilla aleatoria",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Error interno del servidor",
"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": "Servicio temporalmente no disponible",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}generateContent por streamGenerateContent en la URL. Mantén el cuerpo de la solicitud; las respuestas llegan por fragmentos. Añade ?alt=sse para solicitar el formato SSE.https://direct.evolink.ai, que ofrece mejor compatibilidad con modelos de texto y admite conexiones persistentes. https://api.evolink.ai es el endpoint principal para servicios multimodales y actúa como dirección de respaldo para los modelos de texto.Continuación de salidas largas (Gemini 4 Argon)
Una solicitud degemini-4-argon devuelve como máximo 65,536 tokens con streaming o 32,768 sin streaming; ambos límites incluyen razonamiento y respuesta. Para salidas más largas, usa varias solicitudes de continuación. La entrada, el razonamiento y la respuesta comparten un contexto de 1,048,576 tokens, por lo que el razonamiento y la respuesta acumulados solo pueden usar el espacio restante después de la entrada. Solo la API nativa admite continuación; el formato compatible con OpenAI no la admite.
Streaming streamGenerateContent | Sin streaming generateContent | |
|---|---|---|
| Salida máxima por solicitud | 65,536 | 32,768 |
| Ubicación del token de continuación al finalizar | En el último fragmento: candidates[0].continuationToken | candidates[0].continuationToken |
- Establece
generationConfig.maxOutputTokenspor encima del límite por solicitud: más de 65,536 con streaming o de 32,768 sin streaming. El parámetro acepta hasta 1,048,576, pero la salida real sigue limitada por el contexto compartido. Este valor es el presupuesto acumulado de razonamiento y respuesta para todas las solicitudes de continuación. - Si
candidates[0].finishReasonesCONTINUATION, la generación aún no ha terminado. El mismo candidato incluye uncontinuationToken. - Reenvía la solicitud original manteniendo los mismos
contents,systemInstruction,toolsygenerationConfig. Añade únicamentecontinuationTokenen el nivel superior, con el último valor recibido, sin modificarlo. - Repite el paso 3 solo mientras
finishReasonseaCONTINUATION; detente con cualquier otro motivo.STOPindica finalización normal yMAX_TOKENSque se agotó el presupuesto acumulado. Cada respuesta contiene solo el contenido nuevo; concatena las respuestas en orden.
- No añadas la salida parcial a
contentsni envíes una instrucción nueva como «continúa». - Una solicitud puede dedicar toda su generación al razonamiento y devolver un texto de respuesta vacío. Continúa si el motivo de finalización es
CONTINUATION. MAX_TOKENStambién puede incluir uncontinuationToken. Para reanudar, aumenta manualmentemaxOutputTokensy reenvía la solicitud original con el último token. Mantener el presupuesto agotado devuelve 400. Consulta «Reanudar tras agotar el presupuesto» más abajo.- En conversaciones de varios turnos, espera a
STOPy añade después la respuesta completa concatenada al historial como un único mensajemodel.
Ejemplos
Primera solicitud: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": "Escribe un documento de diseño completo para un runtime asíncrono de Rust, con arquitectura, planificador, controlador de I/O, temporizadores y ejemplos de código completos." }] }
],
"generationConfig": {
"maxOutputTokens": 262144,
"thinkingConfig": { "thinkingLevel": "high" }
}
}'
{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "# Diseño de un runtime asíncrono de Rust\n\n## 1. Arquitectura\n…"
}
]
},
"finishReason": "CONTINUATION",
"continuationToken": "<una cadena larga que debes conservar sin cambios>"
}
]
}
CONTINUATION, reenvía la misma solicitud añadiendo continuationToken en el nivel superior:
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": "Escribe un documento de diseño completo para un runtime asíncrono de Rust, con arquitectura, planificador, controlador de I/O, temporizadores y ejemplos de código completos." }] }
],
"generationConfig": {
"maxOutputTokens": 262144,
"thinkingConfig": { "thinkingLevel": "high" }
},
"continuationToken": "<continuationToken de la respuesta anterior>"
}'
CONTINUATION automáticamente y devuelve el resultado al finalizar o agotar el presupuesto. Conserva el último token y no aumenta automáticamente el presupuesto ante 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:
# Espera de lectura del cliente: 1,200 segundos; no garantiza una conexión de 20 minutos con el servidor.
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("La respuesta no contiene candidatos; revisa 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 respuesta solicita continuación, pero no incluye continuationToken.")
request_body["continuationToken"] = token # Mantener todos los demás campos sin cambios
continue
return {
"text": "".join(pieces),
"finishReason": reason,
"continuationToken": token,
}
body = {
"contents": [
{"role": "user", "parts": [{"text": "Escribe un documento de diseño completo para un runtime asíncrono de Rust, con arquitectura, planificador, controlador de I/O, temporizadores y ejemplos de código completos."}]}
],
"generationConfig": {"maxOutputTokens": 262144, "thinkingConfig": {"thinkingLevel": "high"}},
}
result = generate_with_continuation(body)
print(result["text"])
print("finishReason:", result["finishReason"])
if result["finishReason"] == "MAX_TOKENS":
print("Se agotó el presupuesto de salida acumulado. Si se devolvió un token, puedes aumentar manualmente maxOutputTokens para reanudar.")
Reanudar tras agotar el presupuesto
Este ejemplo reutilizagenerate_with_continuation, URL y HEADERS de arriba. Genera una lista de números con un presupuesto pequeño y luego aumenta explícitamente el presupuesto total de 64 a 2,048. Mantén los contents originales y los demás ajustes; añade el token y aumenta el presupuesto para reanudar desde el punto de corte.
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 # El cliente aumenta explícitamente el presupuesto acumulado
resumed = generate_with_continuation(body)
print(resumed["text"], end="")
print("\nfinishReason:", resumed["finishReason"])
else:
print("\nfinishReason:", first["finishReason"])
finishReason: ante CONTINUATION, reenvía el último token con los mismos ajustes; ante MAX_TOKENS, aumenta manualmente el presupuesto acumulado si quieres reanudar; STOP indica finalización normal.
Facturación y errores
- Cada solicitud se factura por separado. En cada continuación, la entrada original y todo el contenido ya generado vuelven a contarse como entrada. Las partes que acierten en la caché implícita se facturan a la tarifa de caché.
- El
usageMetadatade cada respuesta cubre solo esa solicitud. Suma el uso entre solicitudes para obtener el total. Dentro de un mismo stream, los valores son acumulados: usa solo el últimousageMetadata, sin sumar repetidamente los acumulados intermedios. - En la API nativa, la estimación de la reserva para la salida usa el menor valor entre
maxOutputTokensy 65,536, también sin streaming; la entrada se estima por separado. El límite real sin streaming es de 32,768 tokens por solicitud, así que un presupuesto superior puede reservar más que una estimación basada en ese límite real. El cargo final se calcula según el uso de la respuesta. - Los tokens no válidos devuelven 400. Un token con formato correcto pero contenido no válido puede devolver
Invalid continuation token.; un formato incorrecto puede producir otro error de parámetro. Los demás modelos ignorancontinuationToken. - Reanudar tras
MAX_TOKENScon un token sin aumentar el presupuestomaxOutputTokensagotado también devuelve 400.
Autorizaciones
##Todas las APIs requieren autenticación Bearer Token##
Obtener API Key:
Visita la Página de gestión de API Key para obtener tu API Key
Agregar al encabezado de la solicitud:
Authorization: Bearer YOUR_API_KEY
Parámetros de ruta
Selecciona el modelo de texto Gemini que deseas invocar:
| ID del modelo | Serie | Posicionamiento |
|---|---|---|
gemini-4-argon | 4 Argon | Informes largos y grandes tareas de código; hasta 65,536 tokens por solicitud con streaming / 32,768 sin streaming; continuación nativa limitada por el contexto compartido |
gemini-3.8-flash | 3.8 Flash | Ingeniería de software / agentes / razonamiento multipaso / precisión multimodal mejorados |
gemini-3.7-flash | 3.7 Flash | Agentic de nivel Pro / generación de código / ejecución en terminal |
gemini-3.6-flash | 3.6 Flash | Orquestación multipaso / refactorización de código / razonamiento general |
gemini-3.5-flash | 3.5 Flash | Flash general |
gemini-3.5-flash-lite | 3.5 Flash-Lite | Bajo costo / alto rendimiento / agente ligero |
gemini-3.1-pro-preview | 3.1 Pro (Preview) | Razonamiento avanzado |
gemini-3.1-pro-preview-customtools | 3.1 Pro · CustomTools | Razonamiento avanzado + herramientas personalizadas |
gemini-3.1-flash-lite-preview | 3.1 Flash-Lite (Preview) | Bajo costo |
gemini-3-pro-preview | 3.0 Pro (Preview) | Razonamiento avanzado |
gemini-3-flash-preview | 3.0 Flash (Preview) | Flash general |
gemini-2.5-pro | 2.5 Pro | ID anterior; desde el 2026-10-19 lo atiende gemini-3.8-flash y se factura a sus precios |
gemini-2.5-flash | 2.5 Flash | ID anterior; desde el 2026-10-19 lo atiende gemini-3.5-flash-lite y se factura a sus precios |
gemini-2.5-flash-lite | 2.5 Flash-Lite | ID anterior; desde el 2026-10-19 lo atiende gemini-3.1-flash-lite-preview y se factura a sus precios |
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"
Cuerpo
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
Herramientas que puede invocar el modelo. Se admiten tres tipos:
functionDeclarations: llamadas a funcionescodeExecution: ejecución de códigogoogleSearch: búsqueda web con Google Search. Envíe{"googleSearch": {}}(camelCase;google_searchdevuelve HTTP 400). Disponible en todos los modelos de texto Gemini. La respuesta incluye consultas y fuentes encandidates[].groundingMetadata; se factura por llamada.
[{ "googleSearch": {} }]
Tool calling configuration (optional)
Safety settings list (optional)
Generation configuration parameters (optional)
Show child attributes
Show child attributes
Token de continuación de salidas largas (solo gemini-4-argon). Copia el último candidates[0].continuationToken sin cambios en el nivel superior de la solicitud. Conserva los contents, systemInstruction y tools originales; no añadas la salida parcial.
CONTINUATION: mantén todos los ajustes de generación y reenvía el token.MAX_TOKENS: también puede devolver un token; aumenta manualmente el presupuesto acumuladomaxOutputTokensantes de reanudar, sin cambiar los demás ajustes. Mantener el presupuesto agotado devuelve 400.- Los tokens no válidos devuelven 400.
- Los demás modelos ignoran este campo.
Consulta Referencia completa de la API nativa, sección «Continuación de salidas largas».
Cached content name, in the form cachedContents/{cachedContent}
Respuesta
Contenido generado exitosamente
Descripción del formato de respuesta:
- Al usar el endpoint
generateContent, devuelveGenerateContentResponse(devuelve la respuesta completa de una vez) - Al usar el endpoint
streamGenerateContent, devuelveStreamGenerateContentResponse(respuesta en streaming, devuelve contenido en fragmentos)
- Respuesta sincrónica
- Respuesta en streaming