RouterShift fournit des interfaces compatibles OpenAI, Anthropic et Gemini pour les modèles actifs pour votre clé. Routage, failover, facturation et preuves d’audit sont appliqués derrière la frontière de protocole.
Fonctionnalités clés
API compatible OpenAI — remplacement direct pour tout client SDK OpenAI
Routage intelligent avec stratégies configurables (pondéré, round-robin, basé sur la latence, basculement)
Disjoncteur intégré et limitation de débit pour protéger votre application
Cache sémantique pour réduire la latence et les coûts sur les requêtes répétées
Journalisation complète, surveillance et analytique des dépenses
Support multi-fournisseurs avec basculement automatique en cas d'indisponibilité d'un fournisseur
URL de base
Toutes les requêtes API utilisent l'URL de base suivante. L'API est entièrement compatible avec les bibliothèques clientes OpenAI — changez simplement l'URL de base et utilisez votre clé API RouterShift.
https://api.routershift.com/v1
URL de base compatible Anthropic
Pour le SDK Anthropic ou Claude Code. Note : pas de suffixe /v1 — le SDK ajoute automatiquement /v1/messages.
https://api.routershift.com
Compatibilité OpenAI
Les clients OpenAI, Anthropic et Gemini se connectent généralement en changeant l’URL de base et l’identifiant. Les extensions du protocole natif ne sont pas automatiquement portables : la conversion entre protocoles ne prend en charge que les champs de sémantique équivalente. Consultez OpenAPI pour les interfaces documentées ; les restrictions des routes et modèles restent applicables.
Catégories de modèles prises en charge
GET /v1/models fait autorité pour les modèles disponibles avec votre clé. La disponibilité dépend aussi du produit, de la santé des routes, des permissions, du solde, de la région et de l’accès privé.
Obtenir de l'aide
Si vous rencontrez des problèmes ou avez des questions, consultez les sections ci-dessous pour des guides détaillés. Pour les questions de facturation, contactez le support via la console. Pour les mises à jour de statut en temps réel, visitez la page Statut.
Liste complète des points de terminaison
Le tableau est un index lisible du plan de données public. Le contrat machine est /api/openapi.yaml et la référence interactive /api/docs; les portées de clé restent applicables.
GET/v1/version
Version et compatibilité de l’API de données
GET/v1/models
Liste des modèles
GET/v1/requests/:id
Reçu original : lire les preuves d’exécution et de facturation sans renvoi
GET/v1/requests/:id/result
Résultat audio capturé : lire les résultats originaux pris en charge sans nouvelle génération
POST/v1/chat/completions
Complétions de chat (compatible OpenAI)
POST/v1/contracted/chat/completions
Complétions de chat (compatible OpenAI)
POST/v1/messages
API Messages (compatible Anthropic)
POST/v1/messages/count_tokens
Estimation des tokens Messages (texte, réflexion et outils ; pas un usage natif exact)
Tâche d’image : consulter une tâche existante sans relancer la génération
POST/v1/audio/transcriptions
Transcription audio
POST/v1/audio/speech
Synthèse vocale
POST/v1/contracted/audio/speech
Synthèse vocale
POST/v1/tts
Synthèse vocale étendue
POST/v1/transcriptions
Transcription étendue
POST/v1/contracted/transcriptions
Transcription étendue
POST/v1/midjourney/imagine
Génération d'images Midjourney
POST/v1/suno/generate
Génération de musique Suno
POST/v1/video/generations
Tâche de génération vidéo
POST/v1/contracted/video/generations
Tâche de génération vidéo
GET/v1/video/tasks/:task_id
État de la tâche vidéo
POST/v1/chat/completions/async
Tâche asynchrone — Soumettre
GET/v1/chat/completions/async/:task_id
Tâche asynchrone — Vérifier le statut
GET/v1/chat/completions/async/:task_id/result
Tâche asynchrone — Obtenir le résultat
POST/v1/batch
Traitement par lots
GET/v1/batch/:batch_id
État du traitement par lot
GET/v1/batch/:batch_id/results
Téléchargement des résultats du lot
POST/v1/batch/:batch_id/cancel
Annuler un traitement par lot
POST/v1/mcp/
Passerelle d'outils MCP JSON-RPC
GET/v1/mcp/sse
Transport SSE MCP
POST/v1/a2a/
Passerelle JSON-RPC A2A
GET/v1/a2a/sse
Flux d’événements SSE A2A
Méthode
Chemin
Description
GET
/v1/version
Version et compatibilité de l’API de données
GET
/v1/models
Liste des modèles
GET
/v1/requests/:id
Reçu original : lire les preuves d’exécution et de facturation sans renvoi
GET
/v1/requests/:id/result
Résultat audio capturé : lire les résultats originaux pris en charge sans nouvelle génération
POST
/v1/chat/completions
Complétions de chat (compatible OpenAI)
POST
/v1/contracted/chat/completions
Complétions de chat (compatible OpenAI)
POST
/v1/messages
API Messages (compatible Anthropic)
POST
/v1/messages/count_tokens
Estimation des tokens Messages (texte, réflexion et outils ; pas un usage natif exact)
POST
/v1/models/gemini/:model/generateContent
Génération de contenu Gemini
POST
/v1/models/gemini/:model/streamGenerateContent
Génération de contenu en flux Gemini
POST
/v1/embeddings
Embeddings de texte
POST
/v1/rerank
Reclassement
POST
/v1/chat/completions/estimate
Estimation préalable des tokens et du coût
POST
/v1/images/generations
Génération d'images
POST
/v1/contracted/images/generations
Génération d'images
GET
/v1/images/tasks/:id
Tâche d’image : consulter une tâche existante sans relancer la génération
POST
/v1/audio/transcriptions
Transcription audio
POST
/v1/audio/speech
Synthèse vocale
POST
/v1/contracted/audio/speech
Synthèse vocale
POST
/v1/tts
Synthèse vocale étendue
POST
/v1/transcriptions
Transcription étendue
POST
/v1/contracted/transcriptions
Transcription étendue
POST
/v1/midjourney/imagine
Génération d'images Midjourney
POST
/v1/suno/generate
Génération de musique Suno
POST
/v1/video/generations
Tâche de génération vidéo
POST
/v1/contracted/video/generations
Tâche de génération vidéo
GET
/v1/video/tasks/:task_id
État de la tâche vidéo
POST
/v1/chat/completions/async
Tâche asynchrone — Soumettre
GET
/v1/chat/completions/async/:task_id
Tâche asynchrone — Vérifier le statut
GET
/v1/chat/completions/async/:task_id/result
Tâche asynchrone — Obtenir le résultat
POST
/v1/batch
Traitement par lots
GET
/v1/batch/:batch_id
État du traitement par lot
GET
/v1/batch/:batch_id/results
Téléchargement des résultats du lot
POST
/v1/batch/:batch_id/cancel
Annuler un traitement par lot
POST
/v1/mcp/
Passerelle d'outils MCP JSON-RPC
GET
/v1/mcp/sse
Transport SSE MCP
POST
/v1/a2a/
Passerelle JSON-RPC A2A
GET
/v1/a2a/sse
Flux d’événements SSE A2A
Correspondance des protocoles
RouterShift est compatible avec plusieurs protocoles API. Le tableau ci-dessous montre l'URL de base et la configuration SDK pour chacun.
Compatible OpenAI
https://api.routershift.com/v1
Models: <available-model-code>
Authorization: Bearer / x-api-key
Compatible Anthropic
https://api.routershift.com
Models: <available-model-code>
x-api-key: sk-xxx
Gemini natif
https://api.routershift.com/v1
Models: <available-model-code>
Authorization: Bearer
URL de base
Exemple de paramètre de modèle
En-tête d'authentification
https://api.routershift.com/v1
SDK OpenAI standard — changez simplement base_url
<available-model-code>
Authorization: Bearer / x-api-key
https://api.routershift.com
SDK Anthropic standard — changez simplement base_url
<available-model-code>
x-api-key: sk-xxx
https://api.routershift.com/v1
Format natif Gemini, appelez generateContent directement
<available-model-code>
Authorization: Bearer
Authentification unifiée
Tous les points de terminaison utilisent la même authentification. Les deux formats d'en-tête fonctionnent de manière identique :
Format compatible OpenAI
Authorization: Bearer sk-xxx
Format compatible Anthropic
x-api-key: sk-xxx
Fonctionnalités de la plateforme
Aperçu de l'API RouterShift
RouterShift fournit des interfaces compatibles OpenAI, Anthropic et Gemini pour les modèles actifs pour votre clé. Routage, failover, facturation et preuves d’audit sont appliqués derrière la frontière de protocole.
RouterShift utilise des portefeuilles prépayés et des prix figés par requête. Les requêtes réussies sont débitées au prix de vente client selon les dimensions de facturation du produit.
Fonctionnalités clés
GET /v1/models fait autorité pour les modèles disponibles avec votre clé. La disponibilité dépend aussi du produit, de la santé des routes, des permissions, du solde, de la région et de l’accès privé.
API compatible OpenAI — remplacement direct pour tout client SDK OpenAI
Routage intelligent avec stratégies configurables (pondéré, round-robin, basé sur la latence, basculement)
Disjoncteur intégré et limitation de débit pour protéger votre application
RouterShift propose le chat, les embeddings, la découverte de modèles et d'autres interfaces prises en charge. Utilisez le format de requête et de réponse de l'interface choisie, compatible OpenAI, Anthropic ou Gemini.
Ajoutez des outils à un agent via MCP ou utilisez le SDK Python/Node dans votre application : ces accès sont proposés en parallèle. Suivez ces quatre étapes stdio locales et ne placez pas d’identifiants dans une configuration partagée ou un dépôt de code.
RouterShift utilise des portefeuilles prépayés et des prix figés par requête. Les requêtes réussies sont débitées au prix de vente client selon les dimensions de facturation du produit.
Rapprochez état, latence, usage natif, source de cache et dépenses par date, modèle et clé API; configurez budgets et alertes disponibles.
Intégrations SDK et agents
Utilisez un client compatible standard ou les SDK de données Python et Node.js de RouterShift ; les deux partagent le même contrat d’API actif.
Téléchargements Python 0.3.7 et Node 0.3.7
Les téléchargements à version fixe de cette page correspondent à Python 0.3.7 et Node 0.3.7 et incluent la découverte détaillée des modèles. Python 3.9 ou ultérieur est requis ; Node.js et MCP local exigent Node 20 ou ultérieur. Ces archives ne signifient pas une publication sur npm ou PyPI. Le SDK Node ordinaire ne nécessite pas les dépendances MCP facultatives.
Aucun code source client ni identifiant fournisseur ne sont nécessaires. Indiquez langage/environnement et version du SDK, model_code + operation + mode, paramètres anonymisés, limites des médias et expiration des URL, reprise, budget par devise et concurrence. REST est le contrat d’exécution ; les SDK sont des clients légers facultatifs et MCP local une entrée stdio pour agents. Le SDK propre utilise une origine sans /v1. Un SDK fournisseur peut exiger une adaptation des champs et répétitions ; changer seulement la clé ou l’URL ne garantit pas la compatibilité multimodale. Alignez exemples anonymisés de requête/réponse et résultats attendus. Testez d’abord des réponses synthétiques 200/202, GET en attente, SSE incomplet, envoi inconnu et livraison répétée ; l’acceptation payante exige une autorisation distincte et un budget explicite.
Exécutez d’abord cette requête en lecture seule et copiez un code de modèle exact dans les exemples ci-dessous. La liste indique ce que la clé peut voir ; elle ne prouve pas que chaque opération ou mode est activé pour ce modèle.
Utilisez la même clé d’exécution pour GET /v1/models?details=1 : aucune tâche, réserve de fonds ou invocation fournisseur ; authentification, journaux et limites restent applicables. Vérifiez routes/modes de details.operations, constraints.status et import_contract.status/reason. Conservez dimensions, conditions, devise, précision, sélecteurs, heure d’observation et semantic_sha256. Un prix de référence n’est pas un contrat exécutable. Des limites absentes/inconnues ne signifient pas des entrées illimitées ; available ne garantit pas les fonds. Ce n’est ni un Schema d’entrée complet ni une projection universelle des contrats hors tokens. models.list() reste la liste ordinaire par défaut ; demandez explicitement les détails avec les méthodes incluses dans le SDK ou REST. Pour constraints, available décrit le sous-ensemble validé de l’opération ; unsupported exige sa documentation spécifique.
Distinguez details.constraints.operations[].scope : reviewed_subset désigne un sous-ensemble validé de l’opération ; finite_admission_opt_in concerne seulement les requêtes à limite finie explicitement activée, pas tout chat ordinaire. parameters n’est pas un Schema d’entrée complet. Si details.admission existe, vérifiez status, profile, /details/admission/required_headers et les limites déclarées d’entrée/sortie ; les modèles inconnus restent unavailable. La découverte n’accorde ni fonds ni plafond tarifaire universel.
Node 0.3.7 inclut listDetails() et l’option details=true de models.list ; Python 0.3.7 inclut models.list(details=True) et list_details(). Ces méthodes de découverte détaillée font partie des paquets de cette version. models.list() conserve la liste ordinaire par défaut ; les anciennes installations ne reçoivent pas automatiquement les nouvelles méthodes.
Python, Node et MCP peuvent appeler des modèles de texte. L’agent peut conserver son modèle principal et utiliser RouterShift selon ses besoins. Les autorisations et les frais restent dans la même API.
import os
from routershift import RequestOptions, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
response = client.chat.completions.create(
model="YOUR_TEXT_MODEL_CODE",
messages=[{"role": "user", "content": "Summarize this project in one sentence."}],
request_options=RequestOptions(max_retries=0),
)
print(response.choices[0].message.content)
Requêtes Omni par HTTP
Cet exemple envoie du son WAV et demande du texte et du son par flux HTTP. Choisissez une route compatible OpenAI validée, avec un mode stream et une voix pris en charge par le modèle. Les modèles limités à SSE exigent stream:true ; routershift_chat accepte aussi cette option. Le SDK préserve les blocs de contenu, l’audio, les modalités, les appels d’outils et les réponses audio. HTTP Omni ne fournit ni WebSocket Realtime ni conversion arbitraire entre protocoles de fournisseurs.
import base64
import os
from pathlib import Path
from routershift import RequestOptions, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
audio_data = base64.b64encode(Path("/absolute/path/to/sample.wav").read_bytes()).decode()
response = client.chat.completions.create(
model="YOUR_OMNI_MODEL_CODE",
messages=[{"role": "user", "content": [
{"type": "text", "text": "Describe the sound."},
{"type": "input_audio", "input_audio": {"data": audio_data, "format": "wav"}},
]}],
stream=True,
modalities=["text", "audio"],
audio={"voice": "YOUR_MODEL_VOICE", "format": "wav"},
request_options=RequestOptions(max_retries=0),
)
for chunk in response:
if chunk.choices:
delta = chunk.choices[0].delta or {}
print(delta.get("content", ""), end="")
if delta.get("audio"):
print(delta["audio"].get("transcript", ""), end="")
Synthèse vocale
audio.speech appelle /v1/audio/speech. Python renvoie les octets audio ; Node renvoie les octets data et le contentType réel. Choisissez une voix et un format pris en charge. L’audio renvoyé n’est pas enregistré automatiquement dans un fichier local.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
speech = client.audio.speech(
model="YOUR_SPEECH_MODEL_CODE",
input="Welcome to RouterShift.",
voice="YOUR_MODEL_VOICE",
response_format="wav",
)
print(len(speech))
Transcription audio
audio.transcribe envoie le fichier audio explicitement choisi en multipart à /v1/audio/transcriptions. Conservez son extension réelle. L’exemple demande JSON et lit text ; les langues et formats dépendent de la route.
import os
from pathlib import Path
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
transcript = client.audio.transcribe(
model="YOUR_TRANSCRIPTION_MODEL_CODE",
file=Path("/absolute/path/to/sample.wav").read_bytes(),
filename="sample.wav",
response_format="json",
)
print(transcript.text)
Transcrire une URL audio HTTPS
Utilisez audio.transcribe_url en Python, audio.transcribeURL en Node.js ou envoyez du JSON à /v1/transcriptions avec file_url. Le SDK valide l’URL HTTPS sans télécharger l’enregistrement localement. Les onglets Go et Java emploient leurs clients HTTP standard ; RouterShift ne prétend pas fournir de SDK Go ou Java propriétaire.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
transcript = client.audio.transcribe_url(
"YOUR_TRANSCRIPTION_MODEL_CODE",
"https://media.example/recording.wav",
language="en",
audio_format="wav",
response_format="json",
)
print(transcript.text)
Générer des images et consulter les tâches
Utilisez images.generate avec un modèle activé pour la génération d’images. Pour les modèles prenant en charge les images asynchrones, ajoutez async_=True en Python ou async: true en Node.js, puis consultez l’id renvoyé avec images.retrieve. La réponse finale contient data et les URL des images ; une réponse en attente contient id et status.
import os
from routershift import ImageTaskResponse, RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
image = client.images.generate(
model="YOUR_IMAGE_MODEL_CODE",
prompt="A quiet garden in watercolor",
)
print(image)
if isinstance(image, ImageTaskResponse):
print(client.images.retrieve(image.id))
Soumettre une vidéo et consulter son état
videos.create soumet une tâche vidéo et renvoie task_id. Enregistrez-le avant d’appeler videos.retrieve ; une tâche en attente peut ne pas encore avoir de video_url. Les deux SDK proposent videos.poll pour une attente limitée. Le chemin de l’API est /v1/video/generations, avec video au singulier.
Les routes natives vérifiées Seedance et Wan 3.0 acceptent generate_audio : omettez-le pour garder le choix du fournisseur, false pour supprimer la piste audio, true pour l’inclure. Wan le convertit en parameters.audio et active actuellement le son par défaut. Le tarif vidéo Wan reste identique avec ou sans son, sans supplément audio. Les autres routes peuvent refuser ce champ ; une valeur explicite ne doit jamais être supprimée silencieusement.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
task = client.videos.create(
model="YOUR_VIDEO_MODEL_CODE",
prompt="A slow camera movement through a garden",
)
print(task.task_id)
result = client.videos.retrieve(task.task_id)
print(result.status, result.video_url)
Choisir les paramètres selon le modèle
N’envoyez que les paramètres validés pour le modèle et l’opération choisis. Conservez false explicite et seed=0 ; l’omission laisse la valeur par défaut du fournisseur. Ces notes décrivent l’implémentation, pas une disponibilité en production vérifiée.
Qwen Image 3.0 : seed, watermark, prompt_extend et enable_thinking sont propres au modèle. prompt_extend_mode accepte direct ou agent ; agent exige l’extension du prompt et ne s’applique pas à l’édition d’image. enable_thinking s’applique uniquement lorsque l’extension du prompt est activée et n’active pas implicitement prompt_extend.
Vidéo Wan 3.0 : seed, watermark et prompt_extend sont propres au modèle. generate_audio commande la génération audio ; son caractère facultatif, obligatoire ou non pris en charge dépend du modèle. Les médias file/link exigent prompt_extend=true ou l’omission ; false explicite est refusé.
Ark Seedance : la route actuelle de la plateforme n’accepte ni seed ni prompt_extend. Ne réutilisez pas les paramètres Qwen ou Wan entre fournisseurs.
Prise en charge dans le code ne signifie pas déploiement, et déploiement ne signifie pas validation du produit. L’édition avancée, l’extension vidéo, MOV, Draft, HappyHorse, Wan 2.7, Animate et VACE en développement hors ligne ne constituent pas des produits activés. Vérifiez modèle, opération et paramètres avant une requête payante.
Des images de référence à une vidéo avec première image (REST, SDK, MCP)
Cet exemple crée une image à partir de trois références HTTPS sans portrait, puis transmet son URL HTTPS comme image_url pour la première image de la vidéo. Remplacez les deux modèles par des codes visibles pour votre clé dans /v1/models et acceptés séparément pour chaque opération ; la visibilité ne suffit pas. Les 720p et 5 secondes de l’exemple exigent une route vidéo compatible.
Ark : utilisez une route acceptée de retouche Seedream Pro et une route Seedance avec première image. Seul un modèle acceptant trois références peut recevoir cette entrée ; 2048x1152 n’est pas une taille universelle. Les portraits de personnes réelles suivent des règles distinctes ; une exception texte-vers-image liée au même compte n’autorise pas la fusion de trois photos.
Bailian : une route de retouche Qwen Image 3.0 acceptée prend une à trois références et renvoie une URL ; n’attendez pas b64_json et ne présumez pas que le mode image asynchrone est activé. Wan utilise image_url pour la première image. Résolution et durée doivent être acceptées par la route choisie ; une fonction de la console fournisseur ne prouve pas l’activation de la route de la plateforme.
Les onglets décrivent une suite d’étapes, pas des relances automatiques. Avec REST ou MCP, lancez chaque étape séparément. Ignorez la consultation de la tâche image si une URL finale est déjà retournée ; sinon, consultez une seule fois la tâche initiale et ne continuez qu’avec une URL HTTPS exploitable. Conservez le task_id vidéo et consultez une fois cette même tâche ; une tâche en attente peut être revue plus tard.
Les tâches image REST et SDK renvoient id, tandis que les tâches vidéo renvoient task_id. Les résultats MCP locaux exposent structuredContent.task_id lorsqu’un identifiant de tâche existe : vérifiez isError et next_action, puis lisez structuredContent.outputs[].url ou le contenu image MCP joint. Seule une véritable URL HTTPS peut être transmise comme image_url vidéo ; un contenu image joint n’est pas une URL. Ne supposez pas que MCP renvoie le data[0].url de REST.
Un rejet 400 effectivement reçu diffère d’un délai de transport laissant l’envoi incertain. En cas d’erreur, conservez le code et le message sûrs, X-Request-ID et, s’il existe, l’identifiant de tâche ; n’attendez pas le motif brut du fournisseur et ne renvoyez pas automatiquement un POST facturable. Un échec de consultation rend seulement l’état de la tâche indisponible, sans prouver l’échec de génération. L’expiration de l’attente n’annule ni ne rembourse le travail. Budget, prélèvement et règlement suivent les registres de la plateforme, pas cet exemple ni le prix affiché par un fournisseur.
Ajouter des outils de modèles à un agent
Ajoutez des outils à un agent via MCP ou utilisez le SDK Python/Node dans votre application : ces accès sont proposés en parallèle. Suivez ces quatre étapes stdio locales et ne placez pas d’identifiants dans une configuration partagée ou un dépôt de code.
1. Créer un répertoire dédié et installer MCP
Utilisez Node 20 ou ultérieur. Cette installation réservée à MCP ajoute les deux dépendances homologues du protocole ; une installation habituelle du SDK Node n’en a pas besoin.
Exécutez cette commande dans le nouveau répertoire. Elle affiche un chemin absolu échappé pour JSON que vous pouvez coller dans le tableau args de la configuration.
Remplacez le chemin d’exemple, définissez la clé API uniquement dans votre environnement local et conservez l’origine API approuvée sans /v1, identifiants, requête ni fragment. L’onglet Codex utilise sa syntaxe stdio et env_vars documentée.
4. Redémarrer le connecteur et vérifier dix outils
Redémarrez ou rechargez le client MCP, confirmez la présence des dix outils, puis appelez d’abord routershift_list_models en lecture seule. N’appelez un outil de modèle facturé que lorsque vous souhaitez soumettre cette opération.
Dix outils sont proposés : routershift_list_models, routershift_estimate_chat, routershift_chat, routershift_generate_image, routershift_create_video, routershift_get_task, routershift_get_request, routershift_speech, routershift_transcribe, routershift_transcribe_url. Choisissez d’abord un modèle adapté à l’opération. Consultez les tâches d’image ou de vidéo avec routershift_get_task, en précisant kind (image ou video) et task_id. Consultez le reçu d’une requête avec routershift_get_request et request_id, en lecture seule ; cela ne soumet ni n’active aucune opération payante. Dans 0.3.7, details:true lit les modèles et contrats détaillés. routershift_estimate_chat observe uniquement une borne supérieure finie d’admission : aucun appel fournisseur, aucune réservation ni exécution automatique ; funds_verified=false. Un devis n’est ni une facture finale ni une autorisation d’exécution.
routershift_chat accepte des références HTTPS d’images et de vidéos ; audio_file lit un chemin absolu WAV/MP3 explicitement choisi, de 16 MiB au maximum. routershift_transcribe lit un fichier local choisi via file_path ; routershift_transcribe_url transmet un file_url HTTPS sans le télécharger. La synthèse vocale et l’audio Omni sont renvoyés de façon intégrée. routershift_generate_image accepte response_format url ou b64_json ; pour une sortie b64_json PNG, JPEG, WebP ou GIF valide et de taille limitée, il renvoie du contenu image MCP natif sans écrire, télécharger ni réhéberger de fichier, et sans copier le Base64 dans du JSON texte. Les données trop volumineuses ou de format inconnu sont explicitement omises ; ne renvoyez pas une requête payante pour récupérer une sortie omise. L’adaptateur ne parcourt pas les répertoires et n’enregistre pas automatiquement les résultats.
L’onglet JSON présente la structure mcpServers courante ; l’onglet TOML présente la syntaxe Codex documentée. Les emplacements de configuration et les autorisations de sous-processus varient selon le client. Les clients exclusivement distants nécessitent un autre transport pris en charge ; ces exemples ne prétendent pas avoir été testés dans toutes les interfaces d’agent.
L’adaptateur MCP local permet d’appeler les API RouterShift de texte, multimodalité, audio et tâches. La passerelle /v1/mcp existante donne accès aux outils externes configurés. Sa configuration HTTP/SSE ne remplace pas la configuration locale des outils de modèles présentée ici.
Accès aux modèles, attente et facturation
Plateformes UGC : soumettre une seule fois, conserver l'identifiant de tâche et le X-Request-ID initial, puis consulter la même tâche. Un identifiant métier ne garantit pas une répétition sûre côté serveur. REST, SDK et MCP partagent tâches et facturation ; changer d'accès ne doit pas relancer une génération incertaine.
Avec import_contract disponible et une opération prise en charge, utilisez endpoint_prefix/request_header (X-RouterShift-Customer-Contract) sur /v1/contracted/... avec la requête complète et semantic_sha256. Ce même en-tête sur /v1 ordinaire n’active pas la protection. Arrêtez-vous si contrat non pris en charge, 404 ou changement du résumé ; ne renvoyez pas sans protection. Le chat protégé exige aussi X-RouterShift-Token-Bound, X-RouterShift-Max-Admission-Quote et X-RouterShift-Quote-Currency avec un contrat fini vérifié d’entrée/sortie/raisonnement. Ne les déduisez pas du résumé ou du contexte. Simulation publique et admission_quote avec bound_proven=false ou funds_verified=false n’autorisent pas une dépense ni un plafond universel.
Séparer soumission, exécution, livraison et facturation. Sans identifiant de tâche, enquêter sans nouveau POST. Un GET en échec rend seulement l'état indisponible. Si la génération est terminée mais le téléchargement échoue, reprendre la livraison du même résultat connu. released et reconciliation_required arrêtent le suivi, sans prouver réussite ou remboursement.
Conservez l’ID original et consultez GET /v1/requests/ORIGINAL_REQUEST_ID pour le reçu. GET /v1/requests/ORIGINAL_REQUEST_ID/result lit uniquement les résultats audio capturés pris en charge ; ce n’est pas un stockage universel. Python 0.3.7 (depuis 0.3.6) audio.retrieve/poll interroge ASR natif 202 ; Node 0.3.7 n’annonce pas de méthodes équivalentes. Ces GET ne soumettent aucune nouvelle génération et ne déclenchent pas de reprise comptable. Sauvegardez sorties synchrones et vrais IDs asynchrones. Séparez envoi inconnu, échec de livraison et règlement en attente ; un délai dépassé n’autorise pas à répéter un POST payant.
Avec receipt.metering.basis=recorded_settlement_context, seules les dimensions enregistrées de requêtes déjà réglées sont exposées. Ce n’est ni un reçu natif du fournisseur, ni une facture, ni une ventilation complète des frais. Conservez les chaînes quantity/unit/pricing_unit_divisor ; les preuves absentes ou non prises en charge restent unavailable. Ne remplacez pas un usage inconnu par zéro, ne déduisez pas les frais finaux et ne déclenchez pas de reprise depuis cette projection en lecture seule.
Le statut et la liste des conversations asynchrones conservent status et ajoutent execution_status, billing_status, reason_code, next_action et retry_allowed: false. completed signifie que le résultat est disponible, pas que la facturation est réglée ; unknown ne signifie ni gratuité ni remboursement. _billing_status du SDK d’images et billing_status de MCP recopient uniquement l’en-tête réel X-Billing-Status autorisé ; un en-tête absent ou invalide reste sans valeur. Une consultation ne lance pas la reprise de facturation et n’autorise aucun nouvel envoi.
Copiez l’identifiant complet depuis les frais utilisateur ou les journaux de requêtes administrateur, puis recherchez le request_id exact : UTF-8 valide, non vide, 256 octets au maximum, sans espaces ni caractères de contrôle. Les permissions et filtres de période et de modèle restent applicables ; l’absence de résultat ne prouve ni l’absence d’acceptation ni celle de frais. Conservez séparément l’identifiant de soumission initial, celui de tâche et ceux des consultations suivantes. L’export CSV couvre toujours toute la période sélectionnée, pas seulement les lignes filtrées par identifiant.
Contrôler les nouvelles soumissions avec la file et les limites par utilisateur de l'application ; espacer et borner le suivi. Un délai dépassé arrête l'attente locale, pas le fournisseur. Les tests simulés ne certifient pas sa capacité de génération simultanée.
Remplacez YOUR_* par vos codes de modèle, voix ou identifiants de tâche. /v1/models liste les codes visibles par votre clé, sans confirmer le texte, Omni, les images, vidéos, sons ou tous les modes. Vérifiez les entrées, sorties et modes activés du modèle. Aucune compatibilité universelle ou Realtime n’est annoncée.
Le chat/Messages ordinaire du SDK conserve les répétitions automatiques : les envois UGC de chat/Omni doivent utiliser explicitement Python RequestOptions(max_retries=0) ou Node maxRetries=0, redirect=error. Les méthodes multimédias dédiées sans répétition ne couvrent pas toutes les méthodes. Les envois d’images, vidéos, synthèses vocales et transcriptions ne sont pas répétés automatiquement ; le chat MCP envoie aussi une seule fois. Un délai dépassé ou l’arrêt de l’attente n’annule ni ne rembourse le travail et ne rend pas sa répétition sûre. Conservez id pour l’image et task_id pour la vidéo. released et reconciliation_required sont des états finaux, pas une preuve de génération réussie.
Les appels SDK et MCP utilisent la même API, les mêmes prix, mesures d’usage, portefeuille et règlements que les requêtes directes. Ils n’ajoutent aucun solde ni système de facturation distinct. Une URL de résultat ne certifie pas le règlement ; consultez l’état de facturation de l’API, lorsqu’il est disponible, et les données de la console.
Le champ as_of d’une estimation indique l’heure de consultation, pas une durée de prix garanti. Les tâches acceptées sont réglées selon leur contrat tarifaire figé et l’usage réel natif, sans appliquer les mises à jour ultérieures du catalogue ou des prix de la clé. Un tarif figé ne fixe pas le montant final. Un usage absent ou contradictoire exige un rapprochement, pas un montant deviné. Reprenez la tâche d’origine sans relancer une génération avec de nouveaux paramètres.
SDK officiels
Des clients typés pour les modèles, le chat, les messages, les embeddings, les médias et les tâches asynchrones, sans API de session console.
Écosystèmes compatibles
Les clients compatibles OpenAI, Anthropic et Gemini utilisent leur sous-ensemble de protocole pris en charge. Vérifiez préfixe d’URL, champs, lecture des réponses et répétitions ; changer seulement la clé ou l’URL ne garantit pas le multimédia hors chat.
Protocoles d’agents
MCP et A2A fournissent des limites d’interopérabilité stables sans révéler le routage interne.
Versions SDK indépendantes
Les SDK sont publiés indépendamment de la plateforme. Python 0.3.7 et Node 0.3.7 incluent les méthodes de découverte détaillée. Vérifiez les téléchargements à version fixe avec leurs sommes SHA-256 ; ces archives ne signifient ni publication sur npm ou PyPI, ni validation native du modèle. Le contrat OpenAPI actif fait autorité.
import os
from routershift import RouterShift
client = RouterShift(api_key=os.environ["ROUTERSHIFT_API_KEY"])
models = client.models.list()
print([model.id for model in models])
response = client.chat.completions.create(
model="YOUR_MODEL_CODE",
messages=[{"role": "user", "content": "Hello"}],
)
Authentification
Toutes les requêtes API nécessitent une authentification via un token Bearer. Vous pouvez générer et gérer des clés API depuis votre tableau de bord.
Format de clé API
Les clés API commencent par sk- suivi d'un identifiant unique. Gardez vos clés API en sécurité et ne les exposez jamais dans du code côté client ou dans le contrôle de version.
En-tête d'autorisation
Incluez votre clé API dans l'en-tête Authorization de chaque requête :
Authorization: Bearer YOUR_API_KEY
Bonnes pratiques de sécurité
Ne codez jamais en dur les clés API dans votre code source. Utilisez des variables d'environnement ou un gestionnaire de secrets.
Faites tourner régulièrement les clés API depuis le tableau de bord — créez de nouvelles clés et révoquez les anciennes sans interruption de service.
Utilisez des clés API distinctes pour les environnements de développement et de production.
Définissez des limites d'utilisation et des restrictions IP sur les clés API pour une sécurité supplémentaire.
Surveillez l'utilisation des clés dans le tableau de bord pour détecter toute activité inhabituelle.
Ne commitez jamais de clés API dans le contrôle de version. Ajoutez les fichiers .env au .gitignore.
Signatures HMAC des webhooks
Les webhooks utilisateur incluent dans X-RS-Signature le condensé hexadécimal HMAC-SHA256 du corps. X-RS-Event et X-RS-Delivery identifient l'événement et la livraison.
Effectuer des requêtes
RouterShift propose le chat, les embeddings, la découverte de modèles et d'autres interfaces prises en charge. Utilisez le format de requête et de réponse de l'interface choisie, compatible OpenAI, Anthropic ou Gemini.
Complétions de chat
Envoyez une requête de complétion de chat avec un nom de modèle, un tableau de messages et des paramètres optionnels comme temperature, max_tokens et top_p. RouterShift route votre requête vers le fournisseur approprié selon votre configuration de routage.
Réponses en streaming
Activez le streaming en définissant stream: true. RouterShift prend en charge les Server-Sent Events (SSE) pour le streaming de tokens en temps réel. Le format de flux est compatible avec la spécification de streaming OpenAI.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.routershift.com/v1",
api_key=os.environ["ROUTERSHIFT_API_KEY"],
)
stream = client.chat.completions.create(
model="YOUR_MODEL_CODE",
messages=[{"role": "user", "content": "Tell me a story"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
Requêtes asynchrones
Pour les tâches de longue durée ou le traitement par lots, utilisez le mode asynchrone. Soumettez une requête et interrogez les résultats — utile pour les charges de travail dépassant les limites de délai habituelles.
Traitement par lots
Envoyez un fichier JSONL à POST /v1/batch, puis consultez l'état et les résultats. Les délais et prix dépendent du mode d'exécution et du contrat du modèle ; un lot ne garantit ni réduction ni délai fixe.
Représentations vectorielles
Générez des embeddings vectoriels pour le texte en utilisant le point de terminaison /v1/embeddings. Les embeddings sont utiles pour la recherche sémantique, le clustering et la génération augmentée de récupération (RAG).
Estimation de tokens
Envoyez le corps de la requête de chat à POST /v1/chat/completions/estimate pour estimer les tokens et le coût avant l'appel. L'estimation n'est pas la facturation finale ; celle-ci dépend de l'usage réel et du contrat tarifaire applicable.
Limites et contrôles de requête
Les limites effectives dépendent de la clé API, de la politique client, de la route du modèle et de la capacité du fournisseur. Les en-têtes et la console reflètent la configuration d'exécution.
Limites de débit par défaut
Les clés de plateforme renvoient x-ratelimit-limit-{tps,rpm,tpm,tph} et, pour les limites actives, x-ratelimit-remaining-{tps,rpm,tpm,tph}. Retry-After apparaît uniquement si l’attente peut rétablir la capacité, arrondi à la seconde supérieure ; il ne garantit pas la nouvelle tentative. Sans cet en-tête, vérifiez le quota par demande et la politique. Ne renvoyez jamais automatiquement un POST au résultat inconnu ; utilisez un délai borné et aléatoire seulement si une nouvelle tentative est sûre.
Codes de réponse HTTP
429429 Trop de requêtes — Vous avez dépassé votre limite de débit. Vérifiez l'en-tête Retry-After et reculez.
402402 Paiement requis — Le solde de votre compte est insuffisant. Ajoutez des crédits dans la section Facturation.
403403 Interdit — La clé authentifiée n'est pas autorisée à utiliser ce modèle, cette route ou cette opération. Vérifiez les portées de la clé et la politique client.
503503 Service indisponible — Aucun fournisseur n'est actuellement disponible pour le modèle demandé. Le disjoncteur a peut-être temporairement désactivé tous les fournisseurs.
401401 Non autorisé — En-tête Authorization manquant ou mal formé.
400400 Requête incorrecte — Paramètres de requête invalides. Vérifiez le message d'erreur pour plus de détails.
Facturation et tarification
RouterShift utilise des portefeuilles prépayés et des prix figés par requête. Les requêtes réussies sont débitées au prix de vente client selon les dimensions de facturation du produit.
Modèle de tarification
Le débit utilise le prix de vente client approuvé et fige le modèle, la devise, la version de prix et les dimensions par requête. Le catalogue public montre les prix catalogue à titre comparatif; les coûts fournisseur relèvent du règlement.
Facturation et factures
Rapprochez appels, tokens, dimensions de cache et dépenses par date, modèle et clé API. Factures et remboursements utilisent les preuves de prix conservées côté serveur; une modification ultérieure ne réécrit pas l’historique.
Portefeuille et crédits
Les portefeuilles CNY et USD sont comptabilisés séparément. Le solde disponible exclut déjà les fonds gelés : ne les soustrayez pas deux fois. Le crédit de tolérance personnel et la garantie de la plateforme sont désactivés par défaut et exigent des autorisations et des fonds de garantie distincts. Le crédit engagé et le principal dû ne sont ni du solde disponible ni un accès automatique aux modèles. L’admission exige un contrat de mesure vérifié et un plafond de coût démontré. La progression en direct n’est pas une facture finale ; les résultats ou usages inconnus restent à rapprocher. Les recharges suivent les paiements effectivement reçus.
Forfaits et coupons
Forfaits, promotions, coupons ou plans d’économies n’agissent que si une règle applicable est configurée. Le financement de la remise reste séparé des sommes dues au fournisseur.
Moteur de commission revendeur
Les revendeurs gagnent un pourcentage de la marge plateforme sur chaque requête des utilisateurs invités. Des taux de commission par modèle permettent des programmes partenaires granulaires — par ex., 15% sur GPT-4o, 10% sur Claude. L'attribution est automatique via les liens d'invitation ; le settlement est en temps réel par requête.
Accès privé
L'accès privé réunit BYOK et pools de comptes IA avec contrôle centralisé, tarification flexible et basculement.
Intégration BYOK
Associez vos clés après activation de l'accès privé. Le fournisseur facture votre compte séparément ; les frais RouterShift suivent le forfait et les exonérations applicables. BYOK ne rend pas tout usage gratuit.
Pools de comptes
Connectez des pools externes au moyen d'une passerelle de clés et d'une couche de politiques unifiées.
Mode abonnement
L'accès privé est un service complémentaire facultatif. Avant activation, vérifiez le forfait mensuel ou les frais à l'usage, la devise, le renouvellement et les exonérations. L'API principale reste facturée à l'usage.
Basculement sur incident
Si une source privée est indisponible, les routes admissibles de la plateforme pour le même modèle peuvent être essayées successivement, selon les droits de la clé et de la région. Le prix de vente et les contrôles de solde et budget s'appliquent ; un abonnement privé ou une exonération ne rendent pas ces requêtes gratuites.
Règlement auditable en CNY et USD
Une chaîne de preuves couvrant tarification, débit, partage des revenus, remboursement, paiement et facturation. Un compte achète des modèles locaux et mondiaux : l'expérience client reste en CNY et les coûts étrangers sont réglés nativement.
Devises de vente et de coût séparées
Les offres nationales sont vendues et facturées en CNY ; un coût fournisseur en USD n'impose pas le risque de change au client à chaque requête.
Instantanés de prix et de change
Chaque requête verrouille les versions approuvées du prix et du taux ainsi que les mouvements réels du portefeuille.
Dettes fournisseurs en devise native
La dette reste dans la devise amont, tandis que marge, commission et taxe sont comptabilisées séparément.
Remboursement par le chemin d'origine
Le remboursement inverse les mouvements CNY/USD initiaux ; toute reconversion réelle constate le gain ou la perte de change.
Gestion des erreurs
Comprenez les erreurs API courantes et comment les gérer avec élégance dans votre application.
Structure de réponse d'erreur
Toutes les erreurs suivent le format standard avec un objet error contenant un message, un type, un code et un param (le cas échéant).
Respectez Retry-After lorsqu'il est présent. Ne réessayez que les opérations idempotentes ou rejouables en toute sécurité, avec un backoff exponentiel borné et du jitter, puis arrêtez selon le budget d'essais ou de temps de l'application.
Types d'erreurs courants
invalid_request_error — Corps de requête mal formé ou paramètres obligatoires manquants.
authentication_error — Clé API invalide, expirée ou révoquée.
rate_limit_error — Trop de requêtes. Ralentissez et respectez les en-têtes Retry-After.
server_error — Problème temporaire du fournisseur ou de la plateforme. Réessayez avec backoff.
upstream_error — Aucun fournisseur disponible ou échec d'un appel. Consultez error.code avant de décider de réessayer.
content_filter_error — Requête bloquée par les garde-fous ou le filtre de contenu. Examinez le contenu signalé.
Codes d'erreur structurés
Les erreurs d'inférence compatibles OpenAI incluent le champ lisible par machine error.code. Utilisez ce champ pour le traitement programmatique plutôt que le texte du message.
AUTH_INVALIDIdentifiants invalides
AUTH_EXPIREDSession expirée
AUTH_EMAIL_NOT_VERIFIEDEmail non vérifié
AUTH_INSUFFICIENTAccès refusé
WALLET_LOWSolde insuffisant
WALLET_EMPTYPortefeuille vide
RATE_LIMIT_GLOBALLimite de débit dépassée
RATE_LIMIT_KEYLimite de débit de la clé API dépassée
UPSTREAM_TIMEOUTDélai d'attente du fournisseur upstream
INTERNAL_ERRORErreur interne du serveur
error.code
Description
AUTH_INVALID
Identifiants invalides
AUTH_EXPIRED
Session expirée
AUTH_EMAIL_NOT_VERIFIED
Email non vérifié
AUTH_INSUFFICIENT
Accès refusé
WALLET_LOW
Solde insuffisant
WALLET_EMPTY
Portefeuille vide
RATE_LIMIT_GLOBAL
Limite de débit dépassée
RATE_LIMIT_KEY
Limite de débit de la clé API dépassée
RES_MODEL_NOT_FOUND
Modèle non trouvé
UPSTREAM_UNREACHABLE
Fournisseur upstream inaccessible
UPSTREAM_ERROR
Erreur du fournisseur upstream
UPSTREAM_TIMEOUT
Délai d'attente du fournisseur upstream
INTERNAL_ERROR
Erreur interne du serveur
Gestion des délais d'expiration
Choisissez les délais de connexion, de requête et d'inactivité du flux selon la charge et la latence du modèle. Les opérations synchrones, streaming, asynchrones et par lots ne doivent pas partager une valeur fixe.