Aller au contenu principal

Guide d’intégration

Gardez votre client. Changez l’URL de base et la valeur model.

Les modèles de texte parlent ici les protocoles que votre SDK parle déjà : Chat Completions, le sous-ensemble sans état de Responses, Anthropic Messages et Google generateContent. La question intéressante concerne les paramètres que le modèle cible n’a jamais déclarés.

L’enjeu

Les couches de compatibilité mentent surtout par omission

L’échec classique n’est pas un 500. C’est un paramètre que votre passerelle a accepté, jeté et jamais mentionné : le modèle a tourné sans votre temperature, vos définitions d’outils ou votre format de réponse, et la sortie a simplement paru décevante plutôt que cassée.

01

Un paramètre non déclaré est refusé, pas jeté

messages, tools, tool_choice, response_format, max_tokens, temperature et top_p correspondent aux champs déclarés du modèle. Le reste est transmis au schéma du modèle et renvoie 400 s’il ne le déclare pas. Le silence n’est jamais la réponse.

02

La forme de l’erreur suit le protocole appelé

Sur /v1 le corps est un objet d’erreur OpenAI ou Anthropic, pas l’enveloppe {code, msg, data, request_id} de /api/v1. Si vous mélangez les deux surfaces, traitez les deux formes.

03

Diffusion et règlement sont deux sujets

stream: true renvoie des événements chat.completion.chunk terminés par data: [DONE]. La facturation suit toujours l’usage mesuré : un flux interrompu n’est pas une requête gratuite.

La méthode

Changer le point d’accès, puis relancer vos évaluations

Modifiez base_url et api_key, remplacez la chaîne de modèle par une valeur de GET /v1/models et lancez la suite de tests que vous avez déjà. Un 400 sur un paramètre signifie que le modèle choisi ne l’a jamais pris en charge — une information que la version silencieuse ne donnait pas.

N’importe quel client compatible OpenAI convient. Seules l’URL de base et la valeur model changent.

POST /v1/chat/completions

from openai import OpenAI

client = OpenAI(
    base_url="https://api.spicyapi.ai/v1",
    api_key=os.environ["SPICY_API_KEY"],
)

stream = client.chat.completions.create(
    model="<publisher>/<model>/chat",          # exact value from GET /v1/models
    messages=[{"role": "user", "content": "Summarise these notes in three bullets."}],
    temperature=0.7,
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

text/event-stream

data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"- "}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"Ships"}}]}
data: [DONE]

Contrat

Les points à figer d’emblée

API LLM compatible OpenAI : changez l’URL de base — Les points à figer d’emblée
Champ ou en-têteValeur ou limite
POST /v1/chat/completionschat.completion · SSE with stream: true
GET /v1/modelsevery callable model value
Authorization: Bearer · x-api-key · x-goog-api-keyaccepted on /v1
undeclared parameter400 · never silently dropped

Balayez horizontalement pour voir toutes les colonnes.

Intégration

Du premier appel à la production

  1. 01Créez une clé, puis faites GET /v1/models pour les identifiants appelables à cet instant.
  2. 02Pointez le client sur l’URL de base et envoyez une requête sans diffusion : vous recevez un objet chat.completion standard.
  3. 03Activez la diffusion et vérifiez que votre lecteur gère chat.completion.chunk et le marqueur [DONE].
  4. 04Surveillez l’usage par clé dans la console et posez un plafond quotidien avant d’acheminer du trafic de production.

Pertinence

Quand cette voie convient

À choisir si

  • Vous avez du code client OpenAI, Anthropic ou Google qui fonctionne et voulez seulement changer le modèle derrière.
  • Vous voulez image, vidéo et texte sur une clé, un solde et un même jeu de plafonds.

À éviter si

  • Vous dépendez de fils ou d’assistants à état côté serveur. Ici c’est le sous-ensemble sans état de Responses.
  • Vous avez besoin de sorties média. Elles passent par createTask, ou par la projection Videos pour les clients qui parlent déjà cette forme.

Vérifications

Ce que vous pouvez contrôler vous-même

Quatre surfaces de protocole, une clé

/v1/chat/completions, /v1/responses, /v1/messages et /v1beta/models/{model}:generateContent s’authentifient toutes avec la même clé. Authorization: Bearer, x-api-key et x-goog-api-key sont acceptés là où le SDK les attend.

La liste de modèles est le contrat

GET /v1/models renvoie exactement les identifiants acceptés par toutes les opérations /v1 et /api/v1, avec l’éditeur dans owned_by. Les prix viennent de /api/v1/models, spécifique au compte et donc privé.

Validation, limites et réservations sont partagées

La couche de compatibilité réutilise la même authentification, les mêmes limites de débit, la même validation, la même tarification et la même réservation que la surface native. Seule l’enveloppe diffère.

Avant la mise en production

Comportements de la plateforme à confirmer

  • Gardez la clé côté serveur ; un identifiant dans la chaîne de requête n’est jamais accepté.
  • Journalisez l’identifiant de réponse propre au protocole à chaque appel, pour avoir une prise en cas de question.
  • Décidez avant le lancement comment un 400 sur un paramètre non pris en charge parvient à vos utilisateurs.
  • Posez des plafonds quotidien, mensuel et cumulé par clé plutôt que de compter sur le seul solde.

Questions fréquentes

Ce qu’on nous demande sur cette page

Tout client permettant de définir une URL de base et une chaîne de modèle. Les clients de forme OpenAI utilisent /v1/chat/completions et /v1/responses, les clients Anthropic /v1/messages, et les clients Google GenAI les chemins generateContent.

Et après

Pointer un client vers un modèle de texte

Pointez un client OpenAI, Anthropic ou Google existant vers SpicyAPI. Ce qui passe tel quel, ce qui est refusé exprès, et comment le texte est facturé.

Guides associés