Remplacement de l'API OpenAI : Liste de contrôle de migration
Un remplacement de l'API OpenAI ne fonctionne bien que si vous vérifiez trois choses au préalable : quels endpoints votre code appelle, quelles fonctionnalités il utilise et comment le nouveau modèle se comporte sur vos prompts. Cette liste couvre les trois points, avec des commandes que vous pouvez exécuter dès aujourd'hui.

Résumé
- Les complétions de chat, les réponses, le streaming, les outils et le mode JSON fonctionnent avec le SDK OpenAI standard après un changement d'URL de base.
- Les endpoints embeddings, image, audio et fine-tuning ne sont pas disponibles. Conservez-les chez votre fournisseur actuel.
- Le modèle est différent, donc testez les prompts avant de couper. Gardez un indicateur pour revenir en arrière.
- La facturation est prépayée et par token : $0,15 par 1M de tokens en entrée et $0,50 par 1M de tokens en sortie.
Étape 1 : inventoriez ce que votre code appelle
Avant de modifier quoi que ce soit, listez les fonctionnalités OpenAI que vous utilisez réellement. La plupart des projets en utilisent moins qu'ils ne le pensent, et la liste détermine si ce remplacement est une tâche de cinq minutes ou partielle. Exécutez ceci depuis la racine du projet :
# New values you will point the project at:
export OPENAI_BASE_URL="https://api.alternativeapiopenai.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
export MODEL="uncensored"
# What does the code call today?
grep -rnE "embeddings|images\.|audio\.|fine_tuning|moderations|assistants|batches" --include="*.py" --include="*.js" --include="*.ts" .
grep -rnE "model *[=:] *['\"]" --include="*.py" --include="*.js" --include="*.ts" .
Le premier grep trouve les endpoints que cette API n'offre pas. Le second liste tous les noms de modèles codés en dur, que vous devrez modifier. Mettez les résultats dans un tableau court avec une ligne par fonctionnalité : utilisé, non utilisé et actions à entreprendre.
Étape 2 : comparez avec ce qui est pris en charge
| Fonctionnalité OpenAI | Ici | Notes |
|---|---|---|
| Complétions de chat | Oui | POST /v1/chat/completions |
| API Responses | Oui | POST /v1/responses |
| Lister les modèles | Oui | GET /v1/models renvoie uncensored |
| Diffusion en continu | Oui | SSE, avec l'utilisation à la fin |
| Appel de fonctions | Oui | tools, tool_choice, diffusés en streaming tool_calls, résultats role: "tool" |
| Mode JSON | Oui | response_format: {"type":"json_object"} |
| Paramètres d'échantillonnage | Oui | temperature, top_p, stop, seed, pénalités |
| Embeddings | Non | Non proposé |
| Génération d'images, audio, vidéo | Non | Texte uniquement |
| Fine-tuning | Non | Non proposé |
Tout ce qui n'est pas dans la partie prise en charge de ce tableau doit être considéré comme non disponible jusqu'à ce que vous le confirmiez dans la documentation. Cela inclut la sortie contrainte par schéma : le mode JSON fait que le modèle retourne du JSON valide, mais il ne fait pas respecter votre propre schéma, donc gardez votre code de validation. Les entrées image dans un message de chat ne sont pas non plus listées, prévoyez donc uniquement des prompts texte.
Le modèle est un modèle à poids ouverts unique exécuté par un fournisseur indépendant. Ce n'est pas le modèle d'OpenAI et ce n'est pas une API officielle d'un quelconque fournisseur, et il ne fait pas de routage entre les fournisseurs. Attendez-vous à un style différent, des forces différentes et des modes de défaillance différents.
Étape 3 : effectuez le remplacement
Avec le SDK Python officiel, trois valeurs changent :
from openai import OpenAI
client = OpenAI(
base_url="https://api.alternativeapiopenai.com/v1", # was the default OpenAI URL
api_key="YOUR_API_KEY", # was your old key
)
resp = client.chat.completions.create(
model="uncensored", # was your old model name
messages=[{"role": "user", "content": "Give me three names for a coffee shop."}],
)
print(resp.choices[0].message.content)
Mieux encore, conservez l'URL de base, la clé et le nom du modèle dans la configuration afin que la même build puisse pointer vers l'un ou l'autre fournisseur. Un modèle simple est trois variables d'environnement : LLM_BASE_URL, LLM_API_KEY et LLM_MODEL. Ensuite, un retour en arrière signifie changer trois valeurs et redémarrer, et non livrer une nouvelle version.
Si votre code utilise l'API Responses, les mêmes trois valeurs s'appliquent. Pour des frameworks tels que LangChain ou LlamaIndex, recherchez le connecteur compatible OpenAI et passez la même URL de base et le même nom de modèle.
Étape 4 : testez avant la production
Le risque dans tout remplacement de modèle est le comportement, pas la connexion. Testez ceci dans l'ordre :
- Connexion. Une requête avec curl. Si elle retourne une réponse, la clé et l'URL sont correctes.
- Vos vrais prompts. Rejouez au moins vingt prompts de production et examinez la sortie. Vérifiez le ton, la longueur et le respect des instructions.
- Appels d'outils. Exécutez chacun de vos outils et vérifiez les arguments que le modèle produit. Confirmez que votre boucle gère
tool_callsdans une réponse en streaming. - Sortie JSON. Exécutez cent appels en mode JSON et comptez combien échouent votre analyseur ou votre schéma.
- Entrées longues. La fenêtre de contexte est de 100 000 tokens pour le prompt plus la complétion. Testez une grande requête une fois pour savoir combien de temps cela prend.
- Limites. Une clé complète permet 8 requêtes simultanées et 300 par minute. Testez la charge à votre pic réel.
Les décomptes de tokens varieront
Si votre code estime les tokens avec une bibliothèque de tokenisation conçue pour un autre modèle, considérez le résultat comme approximatif. Utilisez l'objet usage dans chaque réponse pour la facturation et le budget, et laissez une marge de sécurité lorsque vous réduisez l'historique pour s'adapter à la fenêtre de 100 000 tokens. La définition de max_tokens est ici optionnelle, mais un plafond raisonnable empêche une réponse débridée de dépenser plus que prévu.
À quoi ressemblent les erreurs
Au-delà d'une limite, l'API retourne HTTP 429 avec le code rate_limited (requêtes par minute) ou concurrency (trop en même temps). Une surcharge temporaire retourne également 429, avec un en-tête Retry-After: 5. Une requête en streaming occupe sa place de concurrence jusqu'à la fin du flux, donc les clients lents comptent pour vous. Les requêtes échouées ou refusées ne sont pas facturées.
Étape 5 : vérifiez le coût
Le prix est de 0,15 $ par 1M de tokens en entrée et 0,50 $ par 1M de tokens en sortie, prélevés sur le crédit prépayé. Pour comparer avec votre facture actuelle, utilisez vos propres nombres de tokens du champ usage et appliquez la formule : coût = tokens_entrée x 0,15 / 1 000 000 + tokens_sortie x 0,50 / 1 000 000. Pour les autres fournisseurs, consultez leurs tarifs actuels et insérez les mêmes nombres.
Un exemple détaillé : un outil de support gère 30 000 requêtes par mois avec 1 200 tokens d'entrée et 250 tokens de sortie chacun. L'entrée est de 36M de tokens, coûtant 5,40 $. La sortie est de 7,5M de tokens, coûtant 3,75 $. Le total mensuel est de 9,15 $. Si la même charge remplit la fenêtre de contexte, à 100 000 tokens d'entrée, chaque requête coûte 0,015 $ en entrée seulement, donc la taille du prompt est le nombre à surveiller.
La page de tarification liste les montants de rechargement. Ils vont de 20 $ à 500 $, avec +5 % à partir de 50 $, +10 % à partir de 100 $ et +15 % à partir de 200 $, payés en crypto uniquement (USDT sur TRC20 ou USDC sur Base). Le crédit n'expire jamais et il n'y a pas d'abonnement. Le guide connexe sur la tarification de l'API pour les modèles sans censure explique plus en détail la structure des coûts.
Étape 6 : déployez et gardez une voie de retour
Envoyez d'abord une petite part de trafic vers le nouvel endpoint. Journalisez l'ID de requête de l'en-tête X-Request-Id afin de pouvoir tracer une mauvaise réponse, et enregistrez X-Balance-USD après les appels pour que le crédit ne s'épuise pas sans que vous le sachiez. Configurez une alerte lorsque le solde tombe en dessous de quelques jours de dépenses.
Lorsque le shadow traffic semble bon, augmentez la part par paliers et conservez la clé de l'ancien fournisseur valide pendant une semaine. Pour tout ce qui concerne le contenu pour adultes, le modèle est conçu pour une utilisation légale pour adultes, et le contenu sexuel impliquant des mineurs est toujours refusé. Les prompts ne sont pas utilisés pour l'entraînement.
Les nouveaux comptes peuvent réclamer 0,50 $ de crédit d'essai gratuit en un clic sur la page des clés API, valable 7 jours, ce qui suffit pour exécuter toute la liste de contrôle sur un échantillon de votre trafic.
Plus de guides
Questions fréquentes
Mon code SDK OpenAI existant fonctionnera-t-il ?
Pour les complétions de chat et les réponses, oui. Modifiez l'URL de base, la clé et le nom du modèle. Les appels aux embeddings, images, audio ou au fine-tuning ne fonctionneront pas.
La qualité des réponses est-elle identique à celle des modèles OpenAI ?
Non, il s'agit d'un modèle à poids ouverts différent. Testez vos propres prompts au lieu de supposer une parité dans un sens ou dans l'autre.
Comment revenir en arrière en cas de problème ?
Conservez l'URL de base, la clé et le modèle dans la configuration et gardez active la clé de votre ancien fournisseur. Le retour en arrière est alors un simple changement de configuration.
Prend-il en charge l'appel de fonctions ?
Oui. Utilisez les outils et tool_choice, et retournez les résultats en tant que messages avec le rôle tool. Les tool_calls en streaming sont pris en charge.
La génération de clé nécessite simplement un formulaire
Inscrivez-vous, copiez votre clé et mettez à jour votre URL de base. C'est toute la configuration requise.