FR ▾

Différences de l'API compatible OpenAI par rapport à OpenAI

Deux panneaux de connexion similaires comparés à un pied à coulisse, montrant les différences entre les APIs compatibles

Compatible signifie que les formes de requête et de réponse correspondent, pas que le service derrière est identique. Voici les différences de l'API compatible OpenAI par rapport à OpenAI qui posent souvent problème, ainsi que les lacunes spécifiques de celle-ci.

Dernière mise à jour

Résumé

  • La compatibilité couvre le format de transmission : disposition de l'URL, authentification Bearer, champs JSON et streaming SSE.
  • Les IDs de modèles, les limites, les détails des erreurs et les endpoints supplémentaires sont les parties qui diffèrent entre les fournisseurs.
  • Cette API propose un seul modèle (uncensored), uniquement du texte, sans embeddings, images, audio ni fine-tuning.
  • Testez les paramètres exacts dont vous dépendez avant de migrer, au lieu de supposer une parité.

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.

DomaineCette APICe qu'il faut vérifier sur n'importe quel fournisseur
IDs de modèlesUn seul ID : uncensoredSi votre ancien nom de modèle est accepté, mappé ou rejeté
Endpoints/v1/chat/completions, /v1/responses, /v1/modelsSi chaque endpoint appelé par votre code existe
ModalitésTexte uniquementSupport d'image, d'audio et de vidéo, si nécessaire
Embeddings, fine-tuningNon proposéVers où ces appels seront redirigés
Fenêtre de contexte100 000 tokens, prompt plus complétionSi la limite couvre uniquement l'entrée ou les deux
Concurrence et débitClé complète : 8 simultanés, 300 par minute. Clé d'essai : 2 simultanés, 60 par minuteComment les limites sont mesurées et comment un refus est signalé
Appel de fonctions, mode JSONPris en chargeCas limites comme les tool_calls en streaming
Comportement du contenuAjusté pour répondre sans refus de contenu pour un usage adulte légalCouches de modération qui modifient ce que le modèle retourne
FacturationCrédit prépayé, par token, pas d'abonnementMinima, 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.

  1. 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.
  2. Supprimez les appels aux endpoints qui n'existent pas du côté nouveau, et redirigez-les vers le fournisseur qui les possède.
  3. 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.
  4. Testez le streaming à travers chaque proxy et équilibreur de charge entre vos utilisateurs et l'API.
  5. Ajoutez une logique de réessai pour les 429 qui lit le code d'erreur et l'en-tête Retry-After.
  6. 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.

Questions fréquentes

Une API compatible OpenAI est-elle identique à OpenAI ?

Non. L'API accepte le même type de requêtes, mais le modèle, les limites, les endpoints et les politiques appartiennent au fournisseur qui l'exécute. Cette API n'est pas exploitée par OpenAI ni par aucun fournisseur de modèle.

Puis-je continuer à utiliser le SDK OpenAI ?

Oui. Modifiez l’URL de base pour https://api.apicompatible.com/v1, utilisez votre clé et spécifiez l’ID de modèle uncensored.

Cette API prend-elle en charge les embeddings ou le fine-tuning ?

Non. Il s'agit de texte uniquement, avec des chat completions, des responses et une liste de modèles. Utilisez un autre fournisseur pour les embeddings, les images ou le fine-tuning.

Comment savoir quelle limite vous avez atteinte lors d’une erreur 429 ?

Lisez le code d'erreur dans la réponse. `rate_limited` signifie trop de requêtes par minute, `concurrency` signifie trop de requêtes simultanées, et un en-tête `Retry-After` de 5 signifie une surcharge temporaire.

Obtenez votre clé en quelques secondes

Inscrivez-vous, copiez le token, mettez à jour l’URL de l’endpoint. C’est toute la configuration nécessaire.

Ouvrir un compte