Appeler n’importe quel modèle avec le OpenAI SDK

· Hyperouter · 3 min de lecture

Hyperouter parle l’API d’OpenAI. N’importe quel OpenAI SDK fonctionne dès que vous changez deux choses : l’URL de base et la clé API. Ce guide effectue un appel de chat et un appel d’image en Python et en TypeScript.

1. Obtenir une clé

Connectez-vous avec Google ou GitHub et créez une clé API. Les clés commencent par sk-hr-v1- et ne sont affichées qu’une seule fois : conservez la vôtre dans une variable d’environnement.

export HYPEROUTER_API_KEY="sk-hr-v1-..."

Les requêtes sont payées sur votre solde prépayé : ouvrez une demande de recharge dans le tableau de bord avant votre premier appel. Gardez la clé côté serveur, jamais dans du code navigateur ou mobile.

2. Pointer le SDK vers Hyperouter

L’URL de base est https://api.hyperouter.app/v1.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hyperouter.app/v1",
    api_key=os.environ["HYPEROUTER_API_KEY"],
)

3. Chat

Nommez un modèle par son id Hyperouter, <provider>/<name>. Cet appel utilise Grok 4.3 de xAI :

res = client.chat.completions.create(
    model="x-ai/grok-4.3",
    messages=[{"role": "user", "content": "Explain idempotency in one sentence."}],
)
print(res.choices[0].message.content)

La réponse est la chat completion d’OpenAI, avec deux ajouts : provider, le fournisseur qui a servi la requête, et usage.cost, son coût en USD. Définissez stream: true pour recevoir des server-sent events, comme avec OpenAI.

Pour basculer sur d’autres modèles lorsque tous les fournisseurs du premier échouent, listez-les dans models. Les OpenAI SDK l’envoient comme champ supplémentaire du corps :

res = client.chat.completions.create(
    model="x-ai/grok-4.3",
    messages=[{"role": "user", "content": "Hello"}],
    extra_body={"models": ["x-ai/grok-4.20-0309-non-reasoning"]},
)

4. Images

L’Images API fonctionne de la même manière. Cet appel génère une image avec Grok Imagine :

img = client.images.generate(
    model="x-ai/grok-imagine-image",
    prompt="A lighthouse at dusk",
)
print(img.data[0].url)

Le lien est signé et valable 24 heures, et GET /v1/generations/{id} en signe un nouveau. qwen/qwen-image-2.0 s’appelle de la même façon. Sur un modèle qui répond de manière synchrone, une image qui n’est pas prête au bout de 90 secondes renvoie 503 avec le code timeout et son generation_id ; Attendre le résultat explique comment l’interroger à la place.

Et ensuite