API de inferencia
Chatea con modelos de lenguaje desde tu código a través del proxy de AstrApp. Cada respuesta se cobra de tus créditos según los tokens que use.
Rutas
Con una API Key usa /chat. Las rutas de /inference leen con la sesión de la app y, con una API Key, responden 404.
Chat
curl -X POST https://app.astrapp.lat/api/v1/chat \
-H "Authorization: Bearer $ASTRAPP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{"role": "system", "content": "Eres el asistente de ventas de una tienda de muebles."},
{"role": "user", "content": "¿Hacen envíos a Monterrey?"}
],
"temperature": 0.7,
"max_tokens": 200
}'| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
model | string | Sí | Id de un modelo del proxy. Consulta los disponibles con GET /chat. |
messages | object[] | Sí | Al menos un mensaje, con role (system, user o assistant) y content. |
stream | boolean | No | true para recibir la respuesta por eventos. Por defecto false. |
temperature | number | No | De 0 a 2. Por defecto 0.7. |
max_tokens | number | No | De 1 a 32768. Por defecto 1024. |
top_p | number | No | De 0 a 1. Por defecto 1. |
{
"data": {
"message": {
"role": "assistant",
"content": "Sí, enviamos a todo México. ¿Me compartes tu código postal?"
},
"model": "gpt-4o-mini",
"provider": "litellm",
"latency_ms": 842,
"usage": {
"prompt_tokens": 38,
"completion_tokens": 17,
"total_tokens": 55
}
}
}El cuerpo se parece al de OpenAI, pero la respuesta no: el texto viene en data.message.content, no en choices. Un cuerpo inválido responde 400 y, si el proxy no está configurado, la ruta responde 503 con el código NOT_CONFIGURED.
En Python
import os
import requests
response = requests.post(
"https://app.astrapp.lat/api/v1/chat",
headers={"Authorization": f"Bearer {os.environ['ASTRAPP_API_KEY']}"},
json={
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "¿Hacen envíos a Monterrey?"}],
},
)
response.raise_for_status()
print(response.json()["data"]["message"]["content"])Modelos disponibles
curl https://app.astrapp.lat/api/v1/chat \
-H "Authorization: Bearer $ASTRAPP_API_KEY"Devuelve data.models, una lista con el id de cada modelo que acepta el proxy (el valor que mandas en model), y data.healthy con el estado del proxy. Si el proxy no está configurado, data.enabled llega en false y la lista vacía.
Streaming
Con "stream": true la respuesta llega como Server-Sent Events: un evento content por cada fragmento de texto, un evento done con el uso de tokens y, al final, [DONE].
curl -N -X POST https://app.astrapp.lat/api/v1/chat \
-H "Authorization: Bearer $ASTRAPP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "¿Hacen envíos a Monterrey?"}],
"stream": true
}'data: {"type":"content","delta":"Sí, "}
data: {"type":"content","delta":"enviamos a todo México."}
data: {"type":"done","usage":{"prompt_tokens":14,"completion_tokens":9},"latency_ms":612,"model":"gpt-4o-mini"}
data: [DONE]Si algo falla a medio camino, llega un evento {"type":"error","message":"…"} y el stream se cierra.
Cobro y límites
/chatusa siempre las llaves de AstrApp, no tu llave propia de proveedor. Por eso cada respuesta se descuenta de tus créditos: el costo de los tokens del proveedor más 25% de cargo de plataforma.- Un modelo sin tarifa propia se cobra con la tarifa de respaldo, más alta que la de casi cualquier modelo del catálogo.
- La ruta admite 30 peticiones por minuto.
Tus créditos y movimientos están en Facturación. Más sobre el saldo en Planes y precios.
Inferencia con modelos de un proyecto
Las rutas de /inference sirven un modelo registrado en un proyecto con estado de despliegue deployed.
Hoy no sirven para un adapter entrenado en AstrApp
Estas rutas buscan el modelo en la tabla de modelos del proyecto, y el entrenamiento en GPU no crea ahí un modelo desplegado: entrega un adapter LoRA, que ves en Archivos › Adaptadores LoRA y descargas desde Entrenar › Historial de entrenamientos (ver Adaptadores LoRA). Además leen con la sesión de la app, así que con una API Key responden 404.
| Campo | Ruta | Descripción |
|---|---|---|
messages | chat | Igual que en /chat. |
conversation_id | chat | UUID de una conversación para continuarla. |
input | predict | Texto, lista de textos u objeto. |
options.temperature | chat y predict | De 0 a 2. Por defecto 0.7. |
options.max_tokens | chat y predict | De 1 a 8192. Por defecto 512. |
options.top_p | chat y predict | De 0 a 1. Por defecto 0.7. |
Un modelo que no está desplegado responde 400 con El modelo no está desplegado. Ambas rutas cobran créditos por token igual que /chat y admiten 30 peticiones por minuto.