Ce que la compatibilité promet réellement
Une API compatible OpenAI accepte les mêmes requêtes HTTP que celles envoyées par les SDK OpenAI. Vous modifiez l'URL de base et la clé, et le client continue de fonctionner. Cette garantie repose sur la couche protocole : le chemin /v1/chat/completions, un jeton Bearer dans l'en-tête Authorization, un corps JSON avec model et messages, et une réponse avec choices et usage. Le streaming suit le même schéma d'événements envoyés par le serveur.
Elle ne promet pas le même modèle, le même comportement, les mêmes limites ou le même ensemble d'endpoints. L'entreprise derrière l'API originale décide de ce qu'elle propose, et chaque autre fournisseur décide indépendamment de ce qu'il copie. Considérez la compatibilité comme un moyen d'éviter de réécrire votre code client, et non comme une garantie que rien d'autre ne change.
Les différences, côte à côte
Le tableau liste les domaines qui varient entre les fournisseurs et ce qui est vrai pour cette API. La colonne de droite est un prompt pour vos propres tests lors de l'évaluation de tout service.
| Domaine | Cette API | Ce qu'il faut vérifier sur n'importe quel fournisseur |
|---|---|---|
| IDs de modèles | Un seul ID : uncensored | Si votre ancien nom de modèle est accepté, mappé ou rejeté |
| Endpoints | /v1/chat/completions, /v1/responses, /v1/models | Si chaque endpoint appelé par votre code existe |
| Modalités | Texte uniquement | Support d'image, d'audio et de vidéo, si nécessaire |
| Embeddings, fine-tuning | Non proposé | Vers où ces appels seront redirigés |
| Fenêtre de contexte | 100 000 tokens, prompt plus complétion | Si la limite couvre uniquement l'entrée ou les deux |
| Concurrence et débit | Clé complète : 8 simultanés, 300 par minute. Clé d'essai : 2 simultanés, 60 par minute | Comment les limites sont mesurées et comment un refus est signalé |
| Appel de fonctions, mode JSON | Pris en charge | Cas limites comme les tool_calls en streaming |
| Comportement du contenu | Ajusté pour répondre sans refus de contenu pour un usage adulte légal | Couches de modération qui modifient ce que le modèle retourne |
| Facturation | Crédit prépayé, par token, pas d'abonnement | Minima, expiration, niveaux d'abonnement |
La ligne tarifaire de cette API est de $0,15 par 1M de tokens d'entrée et de $0,50 par 1M de tokens de sortie. Pour tout autre service, consultez sa page de tarification actuelle plutôt que de vous fier à votre mémoire ou à un résumé tiers.
IDs de modèles et comportement
La plus grande différence pratique réside dans le modèle lui-même. Avec OpenAI, vous choisissez parmi un menu de modèles nommés. Ici, vous envoyez "model": "uncensored" et obtenez un seul modèle à poids ouverts exécuté par un fournisseur indépendant. Il ne s'agit pas de l'API officielle d'aucun vendeur de modèle, ni d'un routeur qui transfère les requêtes vers plusieurs fournisseurs.
Cela a deux conséquences. Premièrement, vous ne pouvez pas tester A/B les tailles de modèles en changeant une chaîne ; vous exécutez un seul modèle et ajustez les prompts et les échantillonnages autour de celui-ci. Deuxièmement, les prompts écrits pour un autre modèle peuvent nécessiter de petites modifications, car le respect des instructions, les habitudes de formatage et le comportement de refus diffèrent. Ce modèle est ajusté pour répondre sans refus de contenu pour une utilisation adulte légale, donc un prompt contenant de longs préambules de sécurité écrits pour un modèle plus strict peut souvent être raccourci.
Une limite stricte ne change pas : pas de contenu sexuel impliquant des mineurs.
Endpoints et fonctionnalités absents
La compatibilité est rarement complète sur toute la surface OpenAI. Ici, les lacunes sont volontaires : le service gère le texte et rien d'autre.
- Pas de génération d'images, d'audio ou de vidéo.
- Pas d'endpoint d'embeddings, donc un pipeline de récupération a besoin d'un fournisseur d'embeddings séparé.
- Pas de fine-tuning.
Ce qui est présent couvre la plupart des applications de chat : POST /v1/chat/completions, POST /v1/responses, le streaming, l'appel de fonctions avec tools et tool_choice, et le mode JSON via response_format. Les contrôles d'échantillonnage tels que temperature, top_p, stop, seed et les pénalités sont transmis au modèle.
Si votre application mélange des fonctionnalités, le pattern habituel est de conserver le fournisseur original pour les embeddings et les images, et d'envoyer uniquement la génération de texte que vous souhaitez sans censure vers la nouvelle URL de base. L'analyse des coûts et des compromis traite cette répartition.
Limites, erreurs et en-têtes
Les limites sont là où les migrations surprennent les gens, car elles décident du comportement de votre code sous charge. Cette API définit 8 requêtes simultanées et 300 requêtes par minute pour une clé complète, 2 et 60 pour une clé d'essai, et une taille maximale de corps de 8 Mo. Une requête qui dépasse répond HTTP 429. Le code d'erreur vous indique quelle limite vous avez atteinte : rate_limited pour les requêtes par minute, concurrency pour trop de requêtes à la fois. Une surcharge temporaire retourne également 429 et ajoute Retry-After: 5.
Lisez le code et l'en-tête, pas seulement le statut. Réessayer immédiatement une erreur concurrency aggrave les choses, tandis qu'une courte attente résout le problème. Une requête en streaming occupe son slot jusqu'à la fin du stream, donc la concurrence compte les streams ouverts, pas seulement les appels en cours.
Les réponses incluent X-Request-Id, X-Balance-USD, X-RateLimit-Limit-Requests et X-RateLimit-Limit-Concurrency. L'en-tête de solde est un supplément spécifique au fournisseur : le code SDK OpenAI l'ignore, mais vous pouvez le lire pour suivre les dépenses. Le solde est également disponible via GET /v1/balance et l'GET /v1/dashboard/billing/credit_grants de style OpenAI.
Liste de vérification de migration
Lorsque vous déplacez une application entre des fournisseurs, passez par la même courte liste à chaque fois. Cela détecte la plupart des surprises avant les utilisateurs.
- Remplacez l'URL de base, la clé et l'ID du modèle ensemble, et recherchez dans le dépôt les anciens noms de modèles cachés dans les fichiers de configuration.
- Supprimez les appels aux endpoints qui n'existent pas du côté nouveau, et redirigez-les vers le fournisseur qui les possède.
- Exécutez votre ensemble de prompts et comparez les sorties. Attendez-vous à un libellé et un formatage différents d'un modèle différent.
- Testez le streaming à travers chaque proxy et équilibreur de charge entre vos utilisateurs et l'API.
- Ajoutez une logique de réessai pour les 429 qui lit le code d'erreur et l'en-tête Retry-After.
- Journalisez l'utilisation des tokens par requête, afin que les surprises de coût apparaissent en jours, et non à la fin du mois.
Un test de compatibilité rapide
Ne faites pas confiance à une liste de fonctionnalités, y compris celle-ci. Exécutez les appels que votre application effectue et comparez les résultats. Un petit script qui teste les parties sur lesquelles vous comptez prend quelques minutes :
from openai import OpenAI
client = OpenAI(
base_url="https://api.apicompatible.com/v1",
api_key="YOUR_API_KEY",
)
# 1. Plain completion
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Reply with the word ready."}],
temperature=0,
seed=7,
)
print("plain:", r.choices[0].message.content)
# 2. JSON mode
j = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Return a JSON object with keys name and age for a fictional person."}],
response_format={"type": "json_object"},
)
print("json:", j.choices[0].message.content)
# 3. Streaming
chunks = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Count from one to five."}],
stream=True,
)
print("stream:", "".join(c.choices[0].delta.content or "" for c in chunks if c.choices))
Ajoutez un cas d'appel de fonctions si votre code utilise des fonctions, et un cas de longue fenêtre de contexte proche de la taille réelle de vos prompts. Les détails sur chaque paramètre figurent dans la documentation, et la page Clé API indique comment réclamer le crédit d'essai de $0,50, qui est largement suffisant pour ce type de vérification.
