# Inférence compatible OpenAI

> /v1/chat/completions, /v1/embeddings et /v1/models au format d'OpenAI : un SDK existant change seulement son URL de base. Côté produit : IA et inférence…

Guide - Depuis la version 0.1.0 - Flexway v1.6.3 - https://flexway.io/docs/developer-inference/

> `/v1/chat/completions`, `/v1/embeddings` et `/v1/models` au format d'OpenAI : un SDK existant change seulement son URL de base.
>
> Côté produit : [IA et inférence](https://flexway.io/docs/product-ai-inference/) ; côté exploitation : [Servir l'inférence](https://flexway.io/docs/operations-inference/).

## Appeler

```python
from openai import OpenAI
client = OpenAI(base_url="https://api.example.com/v1", api_key=token)  # jeton OIDC, envoyé en Bearer
r = client.chat.completions.create(model="default", messages=[{"role": "user", "content": "Bonjour"}])
```

Une clé d'API Flexway passe par `Authorization: ApiKey`, donc par un en-tête par défaut du SDK
(`default_headers={"Authorization": f"ApiKey {key}"}`). Le **modèle** effectivement appelé est
choisi par la politique de l'exploitant parmi ceux qu'il déclare ; `stream: true` relaie les évènements
au fil de l'eau. Images en entrée et embeddings sont servis quand le backend choisi les sait faire.

## Ce que vous pouvez recevoir

Toutes les réponses de `/v1/*`, refus de la passerelle compris, sont dans l'**enveloppe d'OpenAI**
(`{"error": {"type", "code", "message"}}`).

| Statut | `code` | Quand |
| --- | --- | --- |
| `401` | `tenant_required` | Aucune identité, ou une identité sans tenant |
| `429` | `budget_exceeded` | Le budget du tenant, en tokens ou en euros, serait dépassé - avant tout appel |
| `403` | `sensitive_no_internal_backend` | Requête marquée sensible sans backend interne |
| `502` | `backend_unavailable` | Backend et replis en panne ; pendant un flux, un dernier évènement d'erreur |
| `400` | `capability_unavailable` | Le backend choisi ne sert pas une image ou des embeddings |

| En-tête de réponse | Sens |
| --- | --- |
| `Flexway-Budget: soft` | Votre tenant a dépassé le seuil souple : la réponse vient d'un backend moins cher |
| `Flexway-Degraded: backend-fallback` | Servie par un backend de repli |

Une requête **sensible** est marquée par l'en-tête que l'exploitant déclare (par exemple
`X-Sensitive: true`) : elle ne quitte jamais un backend interne.
