FR ▾
Obtenir une clé API

Que signifie OpenAI-compatible pour une API ?

Une API est dite openai-compatible lorsque vous pouvez pointer un SDK OpenAI vers son URL, échanger la clé, et votre code existant continue de fonctionner. L'étiquette décrit le format filaire, rien de plus.

Mis à jour le

Deux machines différentes reliées par un connecteur standard, illustrant un format d'API partagé

Points clés

  • L'étiquette couvre les chemins d'URL, les structures de requête et de réponse JSON, l'authentification Bearer et le streaming SSE.
  • Elle ne dit rien sur le modèle qui répond, son comportement ou son coût.
  • Le changement implique généralement la modification de deux valeurs : l'URL de base et la clé API.
  • Testez le streaming, les outils, le mode JSON et les codes d'erreur avant de vous fier à un fournisseur.

La réponse courte

Lorsqu'un fournisseur dit que son API est openai-compatible, cela signifie qu'elle accepte les mêmes requêtes HTTP que les bibliothèques clientes OpenAI et renvoie des réponses dans la même forme. Vous gardez votre code, changez l'URL de base et la clé, et l'appel va vers un autre serveur.

C'est toute la promesse. C'est une déclaration sur l'interface, comme dire que deux chargeurs utilisent la même prise. Cela ne vous dit pas ce qui se trouve à l'autre bout du câble. Le modèle, ses règles de sécurité, son prix et ses limites sont tous décidés par le fournisseur et diffèrent beaucoup.

Ce que l'étiquette couvre réellement

En pratique, la compatibilité OpenAI est une courte liste de choses concrètes. Si un fournisseur prend en charge tout cela, la plupart du code client s'exécute sans modification.

  • Chemins. Les requêtes de chat vont à POST /v1/chat/completions et la liste des modèles vient de GET /v1/models.
  • Authentification. La clé voyage dans un en-tête Authorization: Bearer.
  • Corps de la requête. Une chaîne model, un tableau messages d'objets avec role et content, et des champs d'échantillonnage optionnels tels que temperature, top_p, stop et seed.
  • Corps de la réponse. Un tableau choices avec le message de l'assistant, un finish_reason, et un objet usage avec des comptes de tokens.
  • Streaming. Avec stream: true, le serveur envoie des Server-Sent Events, chacun transportant un petit delta JSON, se terminant par un marqueur final.
  • Fonctionnalités optionnelles. Appel de fonctions, mode JSON et champs similaires, où le fournisseur choisit de les prendre en charge.

Parce que tant d'outils ont été écrits contre ce format, il est devenu une cible commune. Les éditeurs, les frameworks d'agents, les interfaces de jeu de rôle et les scripts simples vous permettent tous de saisir une URL de base personnalisée, et c'est tout ce dont ils ont besoin.

Pourquoi un format est devenu la cible commune

Le format de chat completions s'est répandu car il était simple et est arrivé tôt. Un auteur d'outils qui le prend en charge une fois peut atteindre de nombreux backends, et un auteur de backend qui le prend en charge une fois peut atteindre de nombreux outils. C'est une bonne affaire pour les deux parties, donc le format a persisté, même parmi les services qui n'ont rien à voir avec l'entreprise qui l'a conçu.

Pour vous en tant que développeur, cela a une signification pratique. Votre code n'a pas besoin d'une intégration différente pour chaque fournisseur. Vous pouvez déplacer un prototype entre des endpoints en un après-midi, comparer deux modèles sur les mêmes prompts, ou garder un deuxième fournisseur comme solution de repli lorsque le premier est lent. Le coût de changer d'avis est faible, et cela facilite l'essai d'un nouveau service sans s'y engager.

L'autre côté de la médaille est que la surface partagée cache de réelles différences. Parce que changer est si facile, il est tentant de supposer que tout derrière l'URL est équivalent. Ce n'est pas le cas, et les sections ci-dessous montrent où les écarts apparaissent généralement.

Ce qu'il ne vous dit pas

Voici où les gens sont surpris. L'étiquette laisse de côté tout ce qui détermine si l'API est utile pour votre travail.

Le modèle derrière

Un endpoint compatible peut servir n'importe quel modèle. Certains servent des modèles à poids ouverts, d'autres routent vers plusieurs fournisseurs, d'autres enveloppent un modèle propriétaire. La compatibilité ne signifie pas que le service est exécuté par OpenAI, et cela ne signifie pas que le modèle se comporte comme l'un des leurs. Le nom de modèle que vous passez dans model est juste une chaîne définie par le fournisseur.

Comportement de refus

Les règles de contenu appartiennent au modèle et au fournisseur, pas au protocole. Deux APIs compatibles peuvent répondre au même prompt de manière opposée. Si votre cas d'utilisation est la fiction, le jeu de rôle ou d'autres contenus adultes licites, vérifiez ce que dit le fournisseur sur les refus avant de tout connecter.

Profondeur des fonctionnalités

Certains fournisseurs implémentent uniquement le chat. D'autres ajoutent des outils, le mode JSON, les probabilités log ou des endpoints supplémentaires. Un client qui envoie un champ que le serveur ignore n'échouera pas toujours bruyamment, donc un désaccord silencieux est possible.

Limites, tarification et erreurs

Les limites de débit, la longueur de la fenêtre de contexte, la taille maximale du corps et le prix par token sont tous des choix du fournisseur. Les corps d'erreur diffèrent également dans les détails même lorsque les codes de statut HTTP correspondent, donc la logique de nouvelle tentative doit se baser sur les codes de statut et les en-têtes plutôt que sur le texte du message.

Un test de compatibilité rapide

Vous pouvez vérifier un fournisseur en quelques minutes avec trois requêtes. Remplacez la clé par la vôtre. Cet exemple utilise l'URL de base de ce site.

curl https://api.kimicode.top/v1/models \
  -H "Authorization: Bearer YOUR_API_KEY"

curl https://api.kimicode.top/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [{"role": "user", "content": "Reply with the word ready."}]
  }'

Le premier appel confirme la clé et liste les identifiants de modèle. Le second vérifie la structure du chat. Ensuite, testez les parties dont votre application dépend : ajoutez "stream": true et observez les blocs incrémentaux, passez un tableau tools si vous utilisez l'appel de fonctions, et définissez response_format à {"type":"json_object"} si vous avez besoin d'une sortie analysable.

Déclenchez également une erreur intentionnellement, comme une mauvaise clé. Vous voulez voir un statut HTTP propre et un corps d'erreur JSON que votre client peut gérer.

Le même appel en Node

Le SDK JavaScript prend les mêmes deux valeurs. Voici un appel en streaming, qui est la forme que la plupart des interfaces de chat utilisent.

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.kimicode.top/v1",
  apiKey: process.env.API_KEY,
});

const stream = await client.chat.completions.create({
  model: "uncensored",
  stream: true,
  messages: [{ role: "user", content: "Name three uses of SSE." }],
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

Si cela imprime du texte mot par mot, le flux de streaming fonctionne de bout en bout. La même boucle fonctionne contre n'importe quel fournisseur compatible, qui est l'objectif principal du format.

À quoi ressemble le basculement dans le code

Avec le SDK Python officiel, il suffit de modifier deux arguments du constructeur. Le reste de votre programme reste tel quel.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.kimicode.top/v1",
    api_key="YOUR_API_KEY",
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Summarize SSE in one sentence."}],
)
print(resp.choices[0].message.content)

Le SDK Node est la même idée avec les options baseURL et apiKey. De nombreux outils lisent OPENAI_BASE_URL et OPENAI_API_KEY depuis l'environnement, donc vous pouvez parfois changer sans toucher au code du tout.

N'oubliez pas de changer la chaîne de modèle aussi. Une requête qui nomme un modèle que le nouveau serveur n'héberge pas échouera, et c'est la première erreur la plus courante.

Où s'insère l'API de ce site

Ce service est une API hébergée, texte uniquement, qui suit le format OpenAI. Il exécute un modèle à poids ouverts, opéré par un fournisseur indépendant et optimisé pour répondre sans filtres de contenu pour une utilisation adulte légale. Ce n'est pas l'API officielle d'aucun fournisseur de modèle et il ne route pas entre les fournisseurs. L'ID de modèle est uncensored.

Il prend en charge le streaming sur SSE avec l'utilisation signalée à la fin, l'appel de fonctions, le mode JSON, et transmet temperature, top_p, stop, seed et les pénalités. La fenêtre de contexte est de 100 000 tokens pour le prompt et la complétion ensemble. Il ne génère pas d'images ou d'audio, et il n'offre pas d'embeddings ou de fine-tuning. Une règle est fixe : pas de contenu sexuel impliquant des mineurs.

La facturation est prépayée et mesurée : $0,15 par 1M de tokens d'entrée et $0,50 par 1M de tokens de sortie, sans abonnement. Vous pouvez voir les chiffres sur la page de tarification, et la documentation passe en revue une première requête. Si vous voulez l'essayer sans payer, les nouveaux comptes peuvent réclamer un crédit d'essai de $0,50 en un clic sur la page de clé API.

Pièges de compatibilité courants

  1. URL de base incorrecte. L'URL doit se terminer par /v1. Les clients ajoutent eux-mêmes /chat/completions ; ajouter ce segment à l'URL de base provoque une erreur 404.
  2. Paramètres non pris en charge. Si une bibliothèque envoie un champ que le serveur ne connaît pas, vérifiez s'il est rejeté ou ignoré silencieusement, puis supprimez-le.
  3. Streaming et concurrence. Une requête en streaming occupe un créneau de concurrence jusqu'à la fin du flux. Si votre application ouvre de nombreux flux, vous pouvez recevoir une erreur 429 avec le code concurrency même si votre compteur par minute est faible.
  4. Réessayer après une erreur 429. Traitez le 429 comme un signal d'attente. Lorsque l'en-tête Retry-After est présent, respectez-le.
  5. Comptage des tokens. Ne supposez pas que le tokenizeur d'un autre fournisseur correspond. Lisez l'objet usage dans la réponse pour connaître les nombres sur lesquels vous êtes facturé.

Aucun de ces problèmes n'est difficile à corriger une fois que vous savez où chercher, et la plupart se résument à lire attentivement le premier message d'erreur.

Questions et réponses

Une API compatible OpenAI est-elle créée par OpenAI ?

Non. Le terme décrit le format des requêtes et des réponses. De nombreux fournisseurs indépendants l'adoptent et exécutent leurs propres modèles.

Puis-je utiliser le SDK Python ou Node.js d'OpenAI avec cette API ?

Oui. Définissez l'URL de base et la clé API dans le constructeur du client, et utilisez l'ID de modèle fourni par le fournisseur. Pour ce service, il s'agit de uncensored.

Toutes les fonctionnalités d'OpenAI fonctionneront-elles sur une API compatible ?

Pas nécessairement. Les fournisseurs choisissent les fonctionnalités à implémenter. Ici, vous bénéficiez des complétions de chat, du streaming, de l'appel de fonctions et du mode JSON, mais pas des images, de l'audio ou des embeddings.

La compatibilité signifie-t-elle les mêmes réponses qu'un autre modèle ?

Non. Les réponses dépendent du modèle et des règles du fournisseur. Testez avec vos propres prompts au lieu de supposer un comportement similaire.

Votre clé est à un formulaire de vous

Créez un compte, copiez la clé, modifiez l'URL de base. C'est toute la configuration.

Obtenir une clé API