Documentation API

Modèles et routage

Cinq identifiants de niveau, ou le nom d'un modèle précis. Ce que chaque choix vous apporte, ce qu'il vous coûte, et ce qui se passe quand un modèle quitte le catalogue.

Lister ce que votre clé peut appeler

curl
curl https://app.netaix.fr/v1/models \
  -H "Authorization: Bearer $NETAIX_API_KEY"
Réponse
{
  "object": "list",
  "data": [
    {
      "id": "netaix-auto",
      "object": "model",
      "created": 0,
      "owned_by": "netaix",
      "description": "Netaix smart router: picks the tier and the model from the request itself."
    },
    {
      "id": "netaix-fast", "object": "model", "created": 0,
      "owned_by": "netaix", "description": "Fastest, cheapest tier. ..."
    },
    {
      "id": "claude-sonnet-4-5", "object": "model",
      "created": 1793664000, "owned_by": "anthropic"
    }
  ]
}

La réponse commence par les cinq identifiants de niveau, puis liste les modèles du catalogue. Deux choses à savoir :

  • Le champ description est un ajout Netaix, présent sur les niveaux seulement. Un client écrit pour l'API d'OpenAI l'ignore sans broncher.
  • Cette liste est propre à votre clé. Elle tient compte de ce que votre organisation a ouvert, de ce qui est ouvert à votre compte, et de la liste de modèles éventuellement attachée à la clé. C'est la même source que celle qui autorise l'exécution : ce que cette route affiche est ce que la clé peut appeler.

Les cinq niveaux

Appeler un niveau plutôt qu'un modèle, c'est ce qui permet à votre code de ne pas changer quand le catalogue change. Vous dites ce dont la tâche a besoin, la passerelle choisit le modèle dans ce niveau.

IdentifiantPour quoi
netaix-autoLa passerelle lit la demande et choisit elle-même le niveau et le modèle.
netaix-fastRéponses courtes, classement, reformulations simples. Le moins cher.
netaix-balancedL'usage courant : explications, traduction, code, relecture.
netaix-powerfulDocuments longs, analyse, rédaction exigeante.
netaix-reasoningProblèmes en plusieurs étapes, démonstrations, logique, mathématiques.

Avec un niveau, le choix est borné à ce niveau : il n'est ni abaissé, ni relevé. Le reste des règles continue de s'appliquer, notamment l'exigence d'un modèle capable de lire une image quand une image est jointe.

Le modèle retenu est rendu dans le champ model de la réponse, aussi bien en bloc qu'en flux. C'est la seule façon de le lire, et elle est fiable.

Appeler un modèle par son nom

Rien ne vous y oblige, mais c'est possible : passez dans model un identifiant rendu par GET /v1/models.

Un modèle précis
{
  "model": "claude-sonnet-4-5",
  "messages": [{"role": "user", "content": "Bonjour"}]
}
Le compromis

Un nom de modèle vous donne un comportement stable et une facturation prévisible. En échange, votre code ne profite d'aucun nouveau modèle, et il casse le jour où celui-ci quitte le catalogue. Un niveau fait l'inverse. Pour une application en production, beaucoup choisissent le nom pour les traitements sensibles au format de sortie, et le niveau pour le reste.

Ce qui se passe quand un modèle est retiré

Un modèle retiré du catalogue, ou fermé par votre organisation, disparaît d'abord de GET /v1/models. Si votre code continue de le demander, la passerelle répond :

403
{
  "detail": {
    "error": {
      "message": "Model 'xxx' is not enabled for this workspace. Use GET /v1/models to list available models.",
      "type": "permission_error",
      "code": "model_not_allowed"
    }
  }
}

Il n'y a pas de remplacement automatique d'un modèle retiré par un autre : la passerelle préfère un refus lisible à une réponse rendue par un modèle que vous n'avez pas demandé. Deux façons de ne pas être surpris :

  • appeler un niveau, et non un nom, partout où le format de sortie n'est pas critique ;
  • si vous tenez à un nom, relire GET /v1/models au démarrage de votre application et prévoir un repli.

Les images

Les images s'envoient dans le contenu d'un message, sur POST /v1/chat/completions comme sur POST /v1/messages. La grammaire d'OpenAI (image_url) et celle d'Anthropic (image avec une source en base64) sont toutes deux acceptées et traduites, sur les deux routes. Quand une image est présente, seul un modèle capable de la lire est retenu.

Une image, grammaire OpenAI
{
  "model": "netaix-balanced",
  "messages": [{
    "role": "user",
    "content": [
      {"type": "text", "text": "Que montre ce schéma ?"},
      {"type": "image_url",
       "image_url": {"url": "https://exemple.test/schema.png"}}
    ]
  }]
}
LimiteValeurCode de refus
Images par message4too_many_images
Poids d'une image en base648 Moimage_too_large
FormatsPNG, JPEG, WebPunsupported_image_format
Adressehttps:// ou data:<type>;base64,invalid_image
Longueur d'une adresse2 048 caractèresinvalid_image

Tous ces refus sont des 422. Ils arrivent avant tout appel au modèle, donc sans consommation.

Ces mêmes bornes s'appliquent aux images envoyées sur POST /v1/messages dans la grammaire d'Anthropic : quatre images par message, 8 Mo, PNG, JPEG ou WebP. Une image portée par un résultat d'outil est reprise dans le message qui suit plutôt que perdue.