> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fastino.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Use https://docs.fastino.ai/openapi.json as the source of truth for customer-facing routes. For GLiDE decision inference, call POST https://api.fastino.ai/v1/systemone with model fastino/glide. Do not infer undocumented routes. Read API keys from FASTINO_API_KEY and never embed credentials in code, logs, or reports.

# Inferencia de GLiNER con /v1/chat/completions

> Usa POST /v1/chat/completions para extracción, clasificación, registros y relaciones con GLiNER, no para decisiones de GLiDE.

```text theme={null}
POST https://api.fastino.ai/v1/chat/completions
```

Esta página documenta el contrato de **GLiNER** sobre el envoltorio compatible con OpenAI de `model` y `messages`:

* Añade un `schema` de nivel superior que describa la extracción, la clasificación, los registros estructurados o
  las relaciones.
* Analiza la cadena JSON de `choices[0].message.content`.

Los LLM decoder también usan `/v1/chat/completions`, pero omiten `schema` y devuelven texto generado
en lugar de un resultado de GLiNER.

<Warning>
  Este no es el endpoint de GLiDE. Para clasificación, enrutamiento o puntuación con GLiDE, usa
  [`POST /v1/systemone`](/es/inference/systemone) con `state` y `questions` tipadas.
</Warning>

## Autenticación

```bash theme={null}
export FASTINO_API_KEY="fast_sk_..."
```

```http theme={null}
Authorization: Bearer $FASTINO_API_KEY
Content-Type: application/json
```

También se acepta `X-API-Key: $FASTINO_API_KEY`. Usa un solo estilo de forma coherente.

<Warning>
  `POST /inference` se ha eliminado. No envíes sus campos heredados como `model_id`, `text`,
  `task`, `format_results` o `is_warmup`.
</Warning>

## Solicitud

<ParamField body="model" type="string" required>
  Un ID de modelo base con capacidad de inferencia o el UUID de un trabajo de entrenamiento
  de Fastino completado y desplegable.
</ParamField>

<ParamField body="messages" type="object[]" required>
  Una lista de mensajes no vacía. Para la inferencia GLiNER, coloca el texto a analizar en
  el `content` de un mensaje de usuario.
</ParamField>

<ParamField body="schema" type="object">
  Define tareas personalizadas del codificador. Proporciona un diccionario que contenga una
  o varias de las claves `entities`, `classifications`, `structures` o `relations`. Omítelo
  solo cuando el modelo seleccionado tenga una tarea predeterminada configurada.

  Una lista plana de etiquetas de entidad está obsoleta. Utiliza siempre la forma de diccionario.
</ParamField>

<ParamField body="threshold" type="number" default="0.5">
  Umbral de confianza de `0` a `1`. Los valores más bajos favorecen la exhaustividad; los más
  altos favorecen la precisión.
</ParamField>

<ParamField body="include_confidence" type="boolean" default="true">
  Incluye los valores de confianza en los resultados extraídos.
</ParamField>

<ParamField body="include_spans" type="boolean" default="true">
  Incluye los desplazamientos de caracteres semiabiertos (`start`, `end`) en los resultados
  de entidades.
</ParamField>

<ParamField body="store" type="boolean" default="true">
  Persiste la inferencia. Establécelo en `false` para no guardarla.
</ParamField>

## Esquema de entidades

Utiliza definiciones de entidades descriptivas cuando sea posible:

```json theme={null}
{
  "entities": [
    {
      "name": "organization",
      "description": "business or institution name"
    },
    {
      "name": "product",
      "description": "named commercial product"
    }
  ]
}
```

## Esquema de clasificación

```json theme={null}
{
  "classifications": [
    {
      "task": "sentiment",
      "labels": ["positive", "negative", "neutral"],
      "multi_label": false,
      "top_k": 1
    }
  ]
}
```

## Esquema de extracción estructurada

Los campos de estructura usan especificaciones `field::type::description`:

```json theme={null}
{
  "structures": {
    "product": [
      "name::str::product name",
      "price::str::listed price",
      "features::list::named features"
    ]
  }
}
```

## Esquema de relaciones

El esquema de relaciones más simple es una lista plana de nombres de relación:

```json theme={null}
{
  "relations": ["works_for", "lives_in"]
}
```

También puedes usar un diccionario para añadir descripciones o configuración por relación:

```json theme={null}
{
  "relations": {
    "works_for": {
      "description": "employment relationship",
      "threshold": 0.6
    }
  }
}
```

No envíes objetos de relación que contengan definiciones de head y tail.

## Esquema combinado

Ejecuta varias tareas sobre el mismo texto combinando claves:

```json theme={null}
{
  "entities": [
    {
      "name": "organization",
      "description": "business or institution name"
    },
    {
      "name": "product",
      "description": "named commercial product"
    }
  ],
  "classifications": [
    {
      "task": "sentiment",
      "labels": ["positive", "negative", "neutral"],
      "multi_label": false,
      "top_k": 1
    }
  ]
}
```

El esquema identifica la operación automáticamente. No envíes `task` ni `task_type`.

## Ejemplo

```bash theme={null}
curl -X POST "https://api.fastino.ai/v1/chat/completions" \
  -H "Authorization: Bearer $FASTINO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "fastino/gliner2.5-multi-v1",
    "messages": [
      {
        "role": "user",
        "content": "Apple announced the MacBook Pro at WWDC in Cupertino."
      }
    ],
    "schema": {
      "entities": [
        {
          "name": "organization",
          "description": "business or institution name"
        },
        {
          "name": "product",
          "description": "named commercial product"
        },
        {
          "name": "event",
          "description": "named conference or event"
        },
        {
          "name": "location",
          "description": "city, region, or place"
        }
      ]
    },
    "threshold": 0.5
  }'
```

El valor de `model` debe soportar actualmente la inferencia alojada. Usa el catálogo de modelos
en vivo en lugar de asumir que todos los checkpoints de Hugging Face están disponibles:

```bash theme={null}
curl "https://api.fastino.ai/v1/base-models?supports_inference=true&task_type=encoder"
```

## Respuesta

El endpoint devuelve un envoltorio de chat completion. El resultado GLiNER se serializa como
una cadena JSON en `choices[0].message.content`:

```json theme={null}
{
  "id": "chatcmpl_...",
  "object": "chat.completion",
  "created": 1790123456,
  "model": "fastino/gliner2.5-multi-v1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "{\"entities\":[{\"organization\":[{\"text\":\"Apple\",\"confidence\":0.99,\"start\":0,\"end\":5}],\"product\":[{\"text\":\"MacBook Pro\",\"confidence\":0.98,\"start\":20,\"end\":31}],\"event\":[{\"text\":\"WWDC\",\"confidence\":0.97,\"start\":35,\"end\":39}],\"location\":[{\"text\":\"Cupertino\",\"confidence\":0.99,\"start\":43,\"end\":52}]}],\"classifications\":{},\"structures\":{},\"relations\":{}}"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 0,
    "completion_tokens": 0,
    "total_tokens": 0
  },
  "x_fastino": {
    "inference_id": "..."
  }
}
```

Analiza `choices[0].message.content` como JSON antes de leer los resultados de la tarea. Cuando
`store=true`, `x_fastino.inference_id` identifica la inferencia persistida.

## Entradas repetidas

El endpoint acepta una conversación por solicitud. No soporta la forma de lote `text: string[]`
del endpoint nativo eliminado. Envía solicitudes separadas de forma concurrente cuando proceses
varias entradas.

## Errores

| Estado | Causa probable | Acción |
| - | - | - |
| `400` | Solicitud o esquema no válidos | Corrige los campos de la solicitud o el esquema |
| `401` | Clave de API ausente, mal formada o no válida | Exporta una clave `fast_sk_...` válida |
| `402` | Créditos insuficientes, se requiere financiación o límite de gasto diario/mensual fijado por el propietario | Añade créditos o ajusta el límite de gasto |
| `403` | Método de pago, verificación de tarjeta, techo de crédito o denegación por política de la cuenta | Resuelve el requisito de facturación o de la cuenta |
| `404` | Modelo desconocido o no soportado | Usa un ID del catálogo con capacidad de inferencia o el UUID de un trabajo desplegable |
| `409` | El modelo ajustado existe pero no está desplegado | Espera al despliegue o repáralo |
| `422` | Validación de la solicitud fallida | Lee y corrige los detalles de validación a nivel de campo |
| `425` | El despliegue se está calentando | Reintenta tras el retraso indicado |
| `429` | Límite de tasa o de capacidad | Respeta `Retry-After` y reintenta con retroceso |
| `503` | Arranque en frío o problema temporal de capacidad del proveedor | Reintenta antes de tratarlo como terminal |

Consulta [Arranques en frío y reintentos](/es/inference#arranques-en-frío-y-reintentos) para ver el
patrón de reintentos compartido.

## Migración de solicitudes heredadas

| Campo eliminado de `/inference` | Campo actual |
| - | - |
| `model_id` | `model` |
| `text` | `messages: [{"role": "user", "content": "..."}]` |
| Lista plana de entidades en `schema` | Diccionario `schema` |
| `task` o `task_type` | Elimínalo; el esquema identifica la operación |
| `text: string[]` | Envía solicitudes separadas |
| `format_results` o `is_warmup` | Elimínalos |
| Cuerpo de resultado nativo | Analiza `choices[0].message.content` |
