Documentation

Développeurs : cinq minutes jusqu'à votre premier token

Notre passerelle remplace directement l'API OpenAI. Gardez votre SDK, vos templates de prompts et vos tests — changez deux lignes et vous êtes en production.

Démarrage rapide

Trois étapes : créez une clé dans votre console, placez-la dans une variable d'environnement, appelez le modèle.

Créez une clé API

Dans votre console, ouvrez Clés API → Nouvelle clé. Donnez-lui un nom, une limite de débit, une liste blanche d'IP et un plafond de dépense.

Exportez-la

Ne codez jamais une clé en dur dans le dépôt. Utilisez une variable d'environnement.

.env
# Any OpenAI-compatible SDK works. Two values change.
export IAALGERIE_API_KEY="iaa_live_xxxxxxxxxxxxxxxxxxxx"
export OPENAI_BASE_URL="https://api.iaalgerie.com/v1"

# default model
export DEFAULT_MODEL="qwen3.7-plus"

Appelez un modèle

Pointez le SDK OpenAI vers notre URL de base et choisissez un ID de modèle du catalogue.

Python
# pip install openai
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.iaalgerie.com/v1",
    api_key=os.environ["IAALGERIE_API_KEY"],
)

response = client.chat.completions.create(
    model="qwen3.7-plus",
    messages=[
        {"role": "system", "content": "Reponds toujours en francais."},
        {"role": "user", "content": "Resume ce contrat en 5 points."},
    ],
    temperature=0.3,
)

print(response.choices[0].message.content)
print("tokens:", response.usage.total_tokens)
Node.js
// npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.iaalgerie.com/v1",
  apiKey: process.env.IAALGERIE_API_KEY,
});

const response = await client.chat.completions.create({
  model: "qwen3.7-plus",
  messages: [
    { role: "system", content: "Reponds toujours en francais." },
    { role: "user", content: "Resume ce contrat en 5 points." },
  ],
});

console.log(response.choices[0].message.content);
cURL
curl https://api.iaalgerie.com/v1/chat/completions \
  -H "Authorization: Bearer $IAALGERIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.7-plus",
    "messages": [
      {"role": "system", "content": "Reponds toujours en francais."},
      {"role": "user", "content": "Resume ce contrat en 5 points."}
    ],
    "temperature": 0.3
  }'

URL de base & régions

Une seule URL pour tous les modèles. Notre passerelle choisit la région en amont selon le modèle demandé.

Endpoints
OpenAI-compatible  https://api.iaalgerie.com/v1
Anthropic format   https://api.iaalgerie.com/anthropic
Native DashScope   https://api.iaalgerie.com/api/v1

One URL for every model. Our gateway selects the upstream region
for you (Singapore, US Virginia or Beijing) — nothing to configure
on your side.

Vous n'avez rien à configurer côté région : c'est notre travail. Si vous avez besoin d'une région précise pour des raisons de conformité, dites-le nous.

Authentification

Envoyez votre clé dans l'en-tête Authorization, exactement comme OpenAI.

HTTP
Authorization: Bearer iaa_live_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json

Renouvelez vos clés depuis votre console à tout moment. L'ancienne clé cesse de fonctionner immédiatement.

Complétions de chat

Le format de chat OpenAI standard fonctionne tel quel.

cURL
curl https://api.iaalgerie.com/v1/chat/completions \
  -H "Authorization: Bearer $IAALGERIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3.7-plus",
    "messages": [
      {"role": "system", "content": "Reponds toujours en francais."},
      {"role": "user", "content": "Resume ce contrat en 5 points."}
    ],
    "temperature": 0.3
  }'

Utilisez qwen3.8-flash pour les brouillons et la classification, qwen3.7-plus pour les réponses aux utilisateurs, qwen3.8-max seulement quand la tâche l'exige.

Streaming

Mettez stream à true et consommez les événements serveur : l'utilisateur voit le premier mot en quelques centaines de millisecondes.

Python
stream = client.chat.completions.create(
    model="qwen3.7-plus",
    messages=[{"role": "user", "content": "Ecris un devis pour 3 sites web."}],
    stream=True,
)

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

Appel de fonctions

Déclarez vos outils de façon habituelle et laissez le modèle décider quand les appeler.

Python
tools = [{
    "type": "function",
    "function": {
        "name": "get_order_status",
        "description": "Retourne le statut d'une commande algerienne.",
        "parameters": {
            "type": "object",
            "properties": {
                "order_id": {"type": "string"},
                "wilaya": {"type": "string"}
            },
            "required": ["order_id"]
        }
    }
}]

messages = [{"role": "user", "content": "Ou est ma commande CMD-4821 ?"}]

while True:
    reply = client.chat.completions.create(
        model="qwen3.7-plus", messages=messages, tools=tools
    ).choices[0].message

    if not reply.tool_calls:
        print(reply.content)
        break

    messages.append(reply)
    for call in reply.tool_calls:
        args = json.loads(call.function.arguments)
        messages.append({
            "role": "tool",
            "tool_call_id": call.id,
            "content": json.dumps({"status": "en livraison", "wilaya": "Bejaia"}),
        })

Sortie structurée

Demandez du JSON et validez-le par schéma. Idéal pour extraire des champs de factures ou de formulaires.

Python
from pydantic import BaseModel

class Invoice(BaseModel):
    supplier: str
    nif: str | None
    total_da: float
    currency: str
    due_date: str | None

raw = "FACTURE SARL Exemple, NIF 0998...1620, total 145 000,00 DA, echeance 30/11/2026"

parsed = client.beta.chat.completions.parse(
    model="qwen3.8-flash",
    messages=[
        {"role": "system", "content": "Extract the invoice fields."},
        {"role": "user", "content": raw},
    ],
    response_format=Invoice,
)

invoice = parsed.choices[0].message.parsed
print(invoice.total_da, invoice.currency)   # 145000.0 DA

Image, vidéo & parole

Les modèles média sont asynchrones : vous soumettez une tâche, puis vous l'interrogez. La facturation a lieu à la réussite de la tâche.

cURL
# Images — synchronous, billed per image
curl -X POST https://api.iaalgerie.com/v1/images/generations \
  -H "Authorization: Bearer $IAALGERIE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "qwen-image-3.0-pro",
       "prompt": "Photo produit d une bouteille d huile d olive",
       "size": "1024x1024", "n": 2}'

# Video — asynchronous: submit, then poll the task
curl -X POST https://api.iaalgerie.com/v1/services/aigc/video-generation/video-synthesis \
  -H "Authorization: Bearer $IAALGERIE_API_KEY" \
  -H "X-DashScope-Async: enable" \
  -H "Content-Type: application/json" \
  -d '{"model": "wan3.0-video",
       "input": {"prompt": "Tramway d Alger au coucher du soleil"},
       "parameters": {"duration": 5, "size": "1280*720"}}'

# -> {"output": {"task_id": "..."}}  then:
curl https://api.iaalgerie.com/v1/tasks/<task_id> \
  -H "Authorization: Bearer $IAALGERIE_API_KEY"

# Speech to text
curl -X POST https://api.iaalgerie.com/v1/audio/transcriptions \
  -H "Authorization: Bearer $IAALGERIE_API_KEY" \
  -F model="qwen-audio-3.1-asr-flash-filetrans" \
  -F file="@reunion.m4a"

Les tarifs média sont par image, par seconde de vidéo ou par minute d'audio — voir la page tarifs.

Embeddings & rerank

Construisez un pipeline de recherche pour des documents en arabe, français et anglais.

Python
# Embeddings: turn your knowledge base into vectors
emb = client.embeddings.create(
    model="text-embedding-v4",
    input=["Politique de retour sous 7 jours", "Frais de livraison Yalidine"],
)
vectors = [d.embedding for d in emb.data]

# Rerank: best candidates first, before the chat call
import dashscope   # pip install dashscope

ranked = dashscope.TextReRank.call(
    model="qwen3-rerank",
    query="Quel est le delai de retour ?",
    documents=["Politique de retour sous 7 jours",
               "Nos horaires d ouverture",
               "Frais de livraison Yalidine"],
    top_n=2,
    return_documents=True,
    api_key=os.environ["IAALGERIE_API_KEY"],
)
print(ranked.output.results[0].document.text)

Erreurs & limites

StatutSignificationQue faire
400Requête mal forméeVérifiez l'ID du modèle dans le catalogue.
401Clé invalide ou révoquéeRégénérez la clé dans votre console.
402Solde insuffisantRechargez, ou réduisez le plafond de la clé.
429Limite de débit atteinteRéessayez avec un backoff exponentiel.
500Erreur amontRéessayez une fois, puis contactez le support avec l'ID de requête.
503Modèle temporairement indisponibleBasculez vers un modèle frère de la même famille.

Chaque réponse contient votre quota restant et l'ID de requête. Journalisez cet ID — le support ne peut rien investiguer sans lui.

Python
import time
from openai import APIStatusError

def ask(messages, model="qwen3.7-plus"):
    for attempt in range(5):
        try:
            r = client.chat.completions.create(model=model, messages=messages)
            print("request_id:", r._request_id, "tokens:", r.usage.total_tokens)
            return r
        except APIStatusError as e:
            if e.status_code == 429:      # rate limit
                time.sleep(2 ** attempt)
                continue
            if e.status_code == 402:      # insufficient balance
                raise SystemExit("Top up your IA Algerie balance.")
            if e.status_code >= 500:      # upstream hiccup
                time.sleep(1)
                continue
            raise
    raise RuntimeError("rate limited after 5 attempts")

Bonnes pratiques de coût

Cinq habitudes qui réduisent réellement une facture IA de moitié ou plus.

Choisissez le bon modèle

Routez les intentions simples vers Flash. Réservez les modèles classe Max aux tâches où une mauvaise réponse coûte plus cher que les tokens.

Plafonnez chaque clé

Un plafond mensuel par clé transforme une boucle folle en erreur inoffensive.

Allégez vos prompts

Les tokens de sortie coûtent généralement quatre fois les tokens d'entrée.

Mettez en cache la partie stable

Le cache de contexte facture les préfixes répétés à tarif réduit.

Utilisez le mode batch quand la latence le permet

Les traitements nocturnes de classification ou d'embedding n'ont pas besoin de réponse temps réel.

FAQ développeur

Puis-je utiliser la bibliothèque officielle OpenAI ?

Oui. Définissez base_url sur notre endpoint et api_key sur votre clé IA Algérie. Rien d'autre ne change.

Supportez-vous le format Anthropic ?

Oui, sur un chemin séparé. Utile pour les outils type Claude Code.

Quels IDs de modèles épingler en production ?

Épinglez un ID de version exact plutôt qu'un alias mobile, pour qu'une mise à jour amont ne change jamais vos sorties en silence.

Y a-t-il un bac à sable gratuit ?

Chaque nouveau compte reçoit un petit solde d'essai pour valider l'intégration avant de payer.

Comment signaler une mauvaise réponse ?

Envoyez l'ID de requête et l'ID du modèle au support ; nous pouvons rejouer l'appel et escalader.

Obtenez une clé et testez ce soir

Les premiers comptes reçoivent le solde d'essai, l'appel d'onboarding et une ligne Telegram directe.

Phase de lancement — places restantes sur 100 pour la bêta