> ## 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.

# Inférence GLiNER avec /v1/chat/completions

> Utilisez POST /v1/chat/completions pour l'extraction, la classification, les enregistrements et les relations GLiNER, et non pour les décisions GLiDE.

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

Cette page documente le contrat **GLiNER** sur l'enveloppe `model` et `messages`
compatible OpenAI :

* Ajoutez un `schema` de premier niveau décrivant l'extraction, la classification, les enregistrements structurés ou
  les relations.
* Analysez la chaîne JSON dans `choices[0].message.content`.

Les LLM décodeurs utilisent également `/v1/chat/completions`, mais omettent `schema` et renvoient du texte généré
au lieu d'un résultat GLiNER.

<Warning>
  Ce n'est pas l'endpoint GLiDE. Pour la classification, le routage ou la notation avec GLiDE, utilisez
  [`POST /v1/systemone`](/fr/inference/systemone) avec `state` et des `questions` typées.
</Warning>

## Authentification

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

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

`X-API-Key: $FASTINO_API_KEY` est également accepté. Utilisez un seul mode de manière cohérente.

<Warning>
  `POST /inference` a été supprimé. N'envoyez pas ses champs hérités tels que `model_id`,
  `text`, `task`, `format_results` ou `is_warmup`.
</Warning>

## Requête

<ParamField body="model" type="string" required>
  Un identifiant de modèle de base compatible avec l'inférence ou l'UUID d'une tâche
  d'entraînement Fastino terminée et déployable.
</ParamField>

<ParamField body="messages" type="object[]" required>
  Une liste de messages non vide. Pour l'inférence GLiNER, placez le texte à analyser dans le
  `content` d'un message utilisateur.
</ParamField>

<ParamField body="schema" type="object">
  Définit des tâches d'encodeur personnalisées. Fournissez un dictionnaire contenant une ou
  plusieurs des clés `entities`, `classifications`, `structures` ou `relations`. Ne l'omettez
  que lorsque le modèle sélectionné a une tâche par défaut configurée.

  Un tableau plat d'étiquettes d'entités est déprécié. Utilisez toujours la forme dictionnaire.
</ParamField>

<ParamField body="threshold" type="number" default="0.5">
  Seuil de confiance de `0` à `1`. Les valeurs plus basses favorisent le rappel ; les plus
  élevées favorisent la précision.
</ParamField>

<ParamField body="include_confidence" type="boolean" default="true">
  Inclut les valeurs de confiance dans les résultats extraits.
</ParamField>

<ParamField body="include_spans" type="boolean" default="true">
  Inclut les décalages de caractères en intervalle semi-ouvert (`start`, `end`) dans les
  résultats d'entités.
</ParamField>

<ParamField body="store" type="boolean" default="true">
  Persiste l'inférence. Définissez sur `false` pour ne pas la conserver.
</ParamField>

## Schéma d'entités

Utilisez des définitions d'entités descriptives lorsque c'est possible :

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

## Schéma de classification

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

## Schéma d'extraction structurée

Les champs de structure utilisent des spécifications `field::type::description` :

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

## Schéma de relations

Le schéma de relations le plus simple est une liste plate de noms de relations :

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

Vous pouvez également utiliser un dictionnaire pour ajouter des descriptions ou une
configuration par relation :

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

N'envoyez pas d'objets de relation contenant des définitions head et tail.

## Schéma combiné

Exécutez plusieurs tâches sur le même texte en combinant les clés :

```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
    }
  ]
}
```

Le schéma identifie l'opération automatiquement. N'envoyez pas `task` ni `task_type`.

## Exemple

```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
  }'
```

La valeur de `model` doit actuellement prendre en charge l'inférence hébergée. Utilisez le
catalogue de modèles en direct plutôt que de supposer que chaque checkpoint Hugging Face est
disponible :

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

## Réponse

Le endpoint renvoie une enveloppe de chat completion. Le résultat GLiNER est sérialisé sous
forme de chaîne JSON dans `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": "..."
  }
}
```

Analysez `choices[0].message.content` comme JSON avant de lire les résultats de la tâche.
Lorsque `store=true`, `x_fastino.inference_id` identifie l'inférence persistée.

## Entrées répétées

Le endpoint accepte une conversation par requête. Il ne prend pas en charge la forme de lot
`text: string[]` de l'endpoint natif supprimé. Envoyez des requêtes séparées en simultané
lors du traitement de plusieurs entrées.

## Erreurs

| Statut | Cause probable | Action |
| - | - | - |
| `400` | Requête ou schéma invalide | Corrigez les champs de la requête ou le schéma |
| `401` | Clé d'API manquante, mal formée ou invalide | Exportez une clé `fast_sk_...` valide |
| `402` | Crédits insuffisants, financement requis ou plafond de dépense quotidien/mensuel défini par le propriétaire | Ajoutez des crédits ou ajustez le plafond de dépense |
| `403` | Refus lié au moyen de paiement, à la vérification de la carte, au plafond de crédit ou à la politique du compte | Résolvez l'exigence de facturation ou de compte |
| `404` | Modèle inconnu ou non pris en charge | Utilisez un identifiant de catalogue compatible avec l'inférence ou l'UUID d'une tâche déployable |
| `409` | Le modèle affiné existe mais n'est pas déployé | Attendez le déploiement ou réparez-le |
| `422` | Échec de validation de la requête | Lisez et corrigez les détails de validation au niveau du champ |
| `425` | Le déploiement est en cours de préchauffage | Retentez après le délai indiqué |
| `429` | Limite de débit ou de capacité | Respectez `Retry-After` et retentez avec un backoff |
| `503` | Démarrage à froid ou problème temporaire de capacité du fournisseur | Retentez avant de considérer l'erreur comme définitive |

Consultez [Démarrages à froid et nouvelles tentatives](/fr/inference#démarrages-à-froid-et-nouvelles-tentatives) pour le schéma de nouvelles tentatives commun.

## Migration des requêtes héritées

| Champ `/inference` supprimé | Champ actuel |
| - | - |
| `model_id` | `model` |
| `text` | `messages: [{"role": "user", "content": "..."}]` |
| Liste plate d'entités dans `schema` | Dictionnaire `schema` |
| `task` ou `task_type` | À supprimer ; le schéma identifie l'opération |
| `text: string[]` | Envoyer des requêtes séparées |
| `format_results` ou `is_warmup` | À supprimer |
| Corps de résultat natif | Analyser `choices[0].message.content` |
