Référence API

Bases de l'intégration

#URL de base

Tous les endpoints se trouvent sous /v1, sur le domaine propre à ce déploiement. Il n'y a pas de choix de région — le routage vers les fournisseurs en amont se fait derrière la passerelle.

#En-tête d'authentification

Un seul en-tête Authorization: Bearer suffit pour toute l'authentification. Pas de signature, pas d'horodatage, pas d'en-tête par utilisateur — rien de ce qu'exigent d'autres passerelles au-delà du jeton bearer n'existe ici.

#Enveloppe d'erreur

Les rejets côté passerelle utilisent l'enveloppe au format OpenAI avec le type "xiaoxiang_error". Les erreurs en amont sont transmises telles quelles, les endpoints de tâches asynchrones répondent avec un corps plat, et deux cas n'ont aucun corps — lisez la page des erreurs avant d'écrire votre parseur.

error.json
HTTP/1.1 402 Payment Required
X-Oneapi-Request-Id: 2026091023...

{
  "error": {
    "message": "insufficient account balance, please top up to continue (request id: 2026091023...)",
    "type": "xiaoxiang_error",
    "code": "insufficient_user_quota"
  }
}

Les cinq enveloppes et la table des codes d'erreur →

#Politique de nouvelle tentative

Réessayez les 429 et 5xx avec un backoff exponentiel, en respectant Retry-After s'il est présent. Ne réessayez pas les erreurs de validation 4xx — le même corps échouera à nouveau. Pour les soumissions facturables, envoyez une Idempotency-Key : une nouvelle tentative après un délai d'expiration rejouera le premier résultat au lieu de lancer un second traitement.

backoff.py
import time, requests

def call_with_backoff(url, headers, body, tries=5):
    for i in range(tries):
        r = requests.post(url, headers=headers, json=body)
        if r.status_code not in (429, 500, 502, 503, 504):
            return r
        # 429 and 413 have no JSON body — never parse before checking status.
        wait = int(r.headers.get("Retry-After", 2 ** i))
        time.sleep(wait)
    r.raise_for_status()

Fonctionnement des clés d'idempotence →

#Spécification lisible par machine

Le même contrat dans deux formats générés : OpenAPI pour la génération de clients, Postman et les outils API, et un fichier markdown unique à coller dans un agent de code. Les deux sont reconstruits à partir de ces pages : ils ne peuvent pas diverger de ce que vous lisez.

L'URL du serveur est réécrite vers ce domaine : les clients générés ne nécessitent aucune configuration supplémentaire.
generate-a-client.sh
# Any OpenAPI generator works; this is the common one.
npx @openapitools/openapi-generator-cli generate \
  -i https://www.aisplice.store/openapi.json \
  -g python \
  -o ./gateway-client

#Vue d'ensemble des endpoints

Chaque chemin accepte le corps de requête OpenAI — les paramètres propres aux fournisseurs (anthropic tool_use, gemini thinking_config) sont transmis tels quels. Les routes natives des fournisseurs et les routes historiques figées sont listées séparément sur la page de compatibilité.

Texte
POST/v1/chat/completionsChat multitour, appel d'outils, streaming, mode JSON.
POST/v1/responsesTexte en un seul appel, avec sorties structurées et raisonnement.
POST/v1/messagesFormat natif Anthropic — même authentification, aucun adaptateur nécessaire.
POST/v1/responses/compactCondense une longue conversation sur les modèles qui prennent en charge la compaction — pas de version en streaming.
Vecteurs
POST/v1/moderationsModération de contenu avec le même format d'échange.
Musique
POST/v1/music/generationsGénération de musique asynchrone — renvoie un task_id ; webhook facultatif pris en charge.
GET/v1/music/tasks/:task_idInterroge le statut et la progression d'une tâche de musique asynchrone.
GET/v1/music/tasks/:task_id/contentRécupère l'audio terminé via la passerelle.
Image
POST/v1/images/tasksGénération d'images asynchrone, la route utilisée par les modèles d'image — renvoie un task_id ; webhook facultatif pris en charge.
GET/v1/images/tasks/:task_idInterroge le statut et la progression d'une tâche d'image asynchrone.
GET/v1/images/tasks/:task_id/contentRécupère les URL finales des images — liens persistants, que vous pouvez stocker.
Vidéo
POST/v1/videosGénération vidéo au format OpenAI (Sora, Doubao) — webhook facultatif pris en charge.
GET/v1/videos/:task_idInterroge le statut d'une tâche asynchrone ; le contenu est disponible sur /content.
GET/v1/videos/:task_id/contentTélécharge la vidéo terminée via la passerelle.
DELETE/v1/videos/:task_idAnnule une tâche qui n'a pas encore atteint un état final.
POST/v1/videos/:video_id/remixRégénère une vidéo existante avec un nouveau prompt, sur les modèles qui le permettent.
3D
POST/v1/model3d/tasksGénération asynchrone d'assets 3D et post-traitement — renvoie un task_id.
GET/v1/model3d/tasks/:task_idInterroge la tâche 3D ; l'URL du résultat figure dans le corps de la tâche, il n'y a pas de route /content.
Médias
POST/v1/media/upload-policyCrée une politique d'envoi de fichier de courte durée pour une image, une vidéo, un audio ou un fichier générique, dans la limite configurée.
Abonnements d'application
POST/v1/google-play/verifyVérifie un jeton d'achat Google Play pour votre application avec le compte de service configuré sur cette clé — gratuit, sans appel de modèle.
POST/v1/xsolla/verifyVérifie si un utilisateur Xsolla a un abonnement actif avec la clé API Xsolla définie sur cette clé — gratuit, aucun appel de modèle.
Compte
GET/v1/balanceSolde du compte et montant que cette clé peut encore dépenser — gratuit, sans appel de modèle.
Métadonnées
GET/v1/modelsListe tous les modèles auxquels cette clé a accès.
GET/v1/models/:modelRécupère une entrée de modèle — le format que les clients Anthropic et OpenAI sondent au démarrage.

Toujours bloqué ?

Envoyez-nous l'ID de requête ou le message d'erreur, et nous examinerons le problème.