Intermédiaire

Intégrer l'IA via API : un guide pratique

Une API, 367 modèles. Compatible OpenAI — change l'URL de base, garde ton code. Voici tout ce qu'il faut pour passer de zéro à une intégration IA fonctionnelle en moins d'une heure.
Sarah Chen March 2026 10 min read

Tu as une app. Tu veux qu'elle parle à l'IA. Peut-être que tu veux des chat completions, peut-être de la génération d'images, peut-être les deux. La bonne nouvelle : si tu as déjà utilisé l'API OpenAI, tu sais déjà utiliser la nôtre. La meilleure nouvelle : tu obtiens accès à 367 modèles de 61 fournisseurs à travers un seul endpoint.

Pas de nouveau SDK à apprendre. Pas de protocole propriétaire. Change juste l'URL de base et ta clé API.

Étape 1 : Obtenir ta clé API

Inscris-toi sur zubnet.com et navigue vers les paramètres de ton espace de travail. Ta clé API vit là. Elle commence par un préfixe reconnaissable :

zub_live_a1b2c3d4e5f6...

Garde-la secrète. Traite-la comme un mot de passe. Si elle fuit, fais-la tourner immédiatement depuis les paramètres de ton espace de travail — l'ancienne clé arrête de fonctionner dès que tu en génères une nouvelle.

Étape 2 : Définir ton URL de base

Chaque requête va à :

https://api.zubnet.ai/v1

C'est tout. Le préfixe /v1 correspond à la convention OpenAI, donc toute bibliothèque, outil ou framework qui supporte OpenAI fonctionnera en changeant juste l'URL.

Étape 3 : Faire ta première requête

Utiliser curl

Le test le plus simple possible — un chat completion avec un message :

curl https://api.zubnet.ai/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer zub_live_YOUR_KEY" \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "messages": [
      {"role": "user", "content": "What is the capital of France?"}
    ]
  }'

Tu récupéreras une réponse JSON avec la réponse du modèle dans choices[0].message.content. Exactement la même forme que la réponse OpenAI.

Utiliser Python avec le SDK OpenAI

Installe le SDK si ce n'est pas déjà fait :

pip install openai

Puis utilise-le avec notre URL de base :

from openai import OpenAI

client = OpenAI(
    api_key="zub_live_YOUR_KEY",
    base_url="https://api.zubnet.ai/v1"
)

response = client.chat.completions.create(
    model="claude-sonnet-4-20250514",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain quantum computing in three sentences."}
    ],
    max_tokens=500,
    temperature=0.7
)

print(response.choices[0].message.content)

C'est un exemple complet et fonctionnel. Copie-le, colle-le, remplace la clé API, exécute-le.

Le paramètre modèle

Le champ model est où ça devient intéressant. Au lieu d'être verrouillé à un fournisseur, tu choisis parmi 367 modèles de 61 fournisseurs. Quelques exemples :

IDs de modèles populaires :

claude-sonnet-4-20250514Anthropic Claude Sonnet 4
gpt-4.1OpenAI GPT-4.1
gemini-2.5-pro-preview-05-06 — Google Gemini 2.5 Pro
deepseek-r1 — modèle de raisonnement DeepSeek R1
flux-1.1-proBlack Forest Labs FLUX pour les images
kling-v2.5-master — génération vidéo Kling

La liste complète est sur notre page des modèles, filtrable par type (LLM, image, vidéo, audio, 3D, code) et fournisseur. L'ID de modèle que tu vois là est exactement ce qui va dans le champ model.

Génération d'images

Les modèles d'images utilisent le même patron d'endpoint. Voici FLUX via Python :

response = client.images.generate(
    model="flux-1.1-pro",
    prompt="A serene Japanese garden at dawn, soft morning light",
    n=1,
    size="1024x1024"
)

image_url = response.data[0].url
print(image_url)

La réponse inclut une URL vers l'image générée hébergée sur notre CDN. Télécharge-la, affiche-la, intègre-la — l'URL est valide pour 24 heures.

Réponses en streaming

Pour les modèles de chat, le streaming envoie les tokens au fur et à mesure qu'ils sont générés au lieu d'attendre la réponse complète. C'est essentiel pour toute interface de chat utilisateur — personne ne veut fixer un écran vide pendant 10 secondes.

stream = client.chat.completions.create(
    model="claude-sonnet-4-20250514",
    messages=[
        {"role": "user", "content": "Write a short poem about code."}
    ],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Sous le capot, ça utilise Server-Sent Events (SSE). Chaque chunk arrive comme une ligne data: dans la réponse HTTP. Le SDK OpenAI gère le parsing pour toi, mais si tu utilises du HTTP brut, tu verras des lignes comme :

data: {"choices":[{"delta":{"content":"Once"},"index":0}]}
data: {"choices":[{"delta":{"content":" upon"},"index":0}]}
data: {"choices":[{"delta":{"content":" a"},"index":0}]}
...
data: [DONE]

Le flux se termine avec data: [DONE]. Parse chaque ligne, extrais delta.content, ajoute au tampon de sortie. C'est tout le protocole.

Gestion d'erreurs

L'API utilise les codes de statut HTTP standard. Voici ceux que tu rencontreras vraiment :

400 Bad Request — ton corps de requête est mal formé. Vérifie la structure JSON, assure-toi que messages est un tableau, assure-toi que model est un ID de modèle valide.

401 Unauthorized — ta clé API est manquante, invalide ou expirée. Vérifie l'en-tête Authorization: Bearer.

403 Forbidden — ton compte n'a pas accès à ce modèle ou à cette fonction. Vérifie le niveau d'abonnement de ton espace de travail.

429 Too Many Requests — tu as atteint la limite de débit. La réponse inclut un en-tête Retry-After te disant combien de secondes attendre. Implémente un backoff exponentiel :

import time
from openai import RateLimitError

max_retries = 3
for attempt in range(max_retries):
    try:
        response = client.chat.completions.create(
            model="claude-sonnet-4-20250514",
            messages=[{"role": "user", "content": "Hello"}]
        )
        break
    except RateLimitError:
        wait = 2 ** attempt
        print(f"Rate limited. Waiting {wait}s...")
        time.sleep(wait)

500 / 502 / 503 — problèmes côté serveur. Ils sont rares mais ça arrive. Réessaie avec backoff. Si persistants, vérifie notre page de statut Pulse.

Détails d'authentification

Chaque requête a besoin d'un en-tête Authorization :

Authorization: Bearer zub_live_YOUR_KEY

La clé est attachée à ton espace de travail. Tous les membres d'équipe dans le même espace de travail partagent la même clé et le même pool d'usage. Si tu as besoin d'un suivi séparé par membre d'équipe, crée des espaces de travail séparés.

Meilleures pratiques de sécurité :

• Ne code jamais les clés en dur dans le code source — utilise des variables d'environnement
• Ne commit jamais les clés dans git — utilise des fichiers .env dans .gitignore
• Fais tourner les clés régulièrement depuis les paramètres de l'espace de travail
• Utilise des clés séparées pour le développement et la production

Limites de débit

Les limites de débit dépendent de ton niveau de plan. Les défauts sont généreux pour la plupart des cas d'usage :

Requêtes par minute : varie par plan (60 à 600 RPM)
Tokens par minute : varie par modèle et plan
Requêtes concurrentes : pas de limite dure, mais des 429 se déclencheront si tu burst trop agressivement

Les en-têtes de limite de débit sont inclus dans chaque réponse :

x-ratelimit-limit-requests: 120
x-ratelimit-remaining-requests: 119
x-ratelimit-reset-requests: 0.5s

Lis ces en-têtes. Construis ton client pour les respecter. Tes utilisateurs te remercieront quand leurs requêtes n'échoueront pas aléatoirement.

Mettre tout ensemble

Voici une fonction Python prête pour la production qui gère les erreurs, les retries et le streaming :

import os
from openai import OpenAI, APIError, RateLimitError
import time

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

def ask(prompt, model="claude-sonnet-4-20250514", stream=False):
    for attempt in range(3):
        try:
            response = client.chat.completions.create(
                model=model,
                messages=[{"role": "user", "content": prompt}],
                stream=stream
            )
            if stream:
                return response  # iterate over chunks
            return response.choices[0].message.content
        except RateLimitError:
            time.sleep(2 ** attempt)
        except APIError as e:
            if attempt == 2:
                raise
            time.sleep(1)

# Usage
print(ask("Summarize the latest in quantum computing"))
print(ask("Same question, different model", model="gpt-4.1"))

Change de modèle en changeant une chaîne. Pas de refactoring de code, pas de nouvelles dépendances, pas de format de réponse différent. C'est tout le but de la compatibilité OpenAI.

L'idée clé : La compatibilité OpenAI n'est pas juste une question de commodité. Elle signifie que chaque outil de l'écosystème — LangChain, LlamaIndex, AutoGen, Cursor, Continue, tout outil qui parle le protocole OpenAI — fonctionne avec Zubnet dès le départ. Change l'URL de base, branche ta clé, et tu as 367 modèles dans n'importe quel framework.

Tous les exemples de code dans ce guide sont testés et fonctionnels en date de mars 2026. Copie-les, exécute-les, construis dessus. C'est à ça qu'ils servent.

Prêt à commencer ? Obtiens ta clé API sur zubnet.com

Sarah Chen
Zubnet · March 2026
ESC