AIF Obtenir une clé
Vérification du service…· API compatible OpenAI

Une clé. Trois portes. Zéro facture.

AIF est l'IA gratuite de BRIMIND : texte (résumer, extraire, traduire, rédiger un brouillon), recherche web et voix (MP3 français, arabe, anglais), derrière une seule adresse compatible OpenAI. Ce que vous branchez sur OpenAI se branche ici en changeant deux lignes.

Base URLhttps://aif.offer.brimind.pro/v1
AuthentificationAuthorization: Bearer aif_…
Modèle par défautauto

01 — DémarrerPremier appel

Trois routes, toutes en POST avec un corps JSON et votre clé. Les routes publiques (GET /v1/models, GET /health) n'ont pas besoin de clé.

# texte → texte
curl https://aif.offer.brimind.pro/v1/chat/completions \
  -H "Authorization: Bearer $AIF_KEY" -H "Content-Type: application/json" \
  -d '{"model":"auto","messages":[{"role":"user","content":"Résume en 2 lignes : …"}]}'

# recherche web
curl https://aif.offer.brimind.pro/v1/search \
  -H "Authorization: Bearer $AIF_KEY" -H "Content-Type: application/json" \
  -d '{"query":"pâtisserie Sousse","max_results":5}'

# texte → voix (MP3)
curl https://aif.offer.brimind.pro/v1/audio/speech \
  -H "Authorization: Bearer $AIF_KEY" -H "Content-Type: application/json" \
  -d '{"input":"Votre site est prêt.","voice":"fr"}' -o message.mp3
# pip install openai — le SDK officiel marche tel quel
from openai import OpenAI
client = OpenAI(base_url="https://aif.offer.brimind.pro/v1", api_key="aif_…")

r = client.chat.completions.create(
    model="smart",                       # auto | fast | smart | un id de la table
    messages=[{"role": "system", "content": "Tu réponds en français, en 3 puces."},
              {"role": "user", "content": "Pourquoi un site aide une pâtisserie ?"}],
    max_tokens=400,
)
print(r.choices[0].message.content, r.model)   # r.model = le modèle qui a vraiment répondu
const r = await fetch("https://aif.offer.brimind.pro/v1/chat/completions", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.AIF_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    model: "fast",
    response_format: { type: "json_object" },       // réponse = JSON garanti ou erreur
    messages: [{ role: "user", content: "Extrais {nom, ville} de : Boulangerie El Amen, Sfax" }],
  }),
});
const data = await r.json();
console.log(JSON.parse(data.choices[0].message.content), r.headers.get("X-AIF-Model"));
# Tout outil qui accepte « OpenAI compatible » (n8n, Make, LibreChat, Open WebUI, Zapier Webhooks…)
Base URL : https://aif.offer.brimind.pro/v1
API key  : aif_…
Model    : auto          # ou fast / smart / glm-5.2 / nemotron-3-120b …

# Ne pas activer : « tools / function calling », « vision », « embeddings » — non disponibles ici.

02 — Les trois portesCe qui entre, ce qui sort

Chaque route, avec son entrée, sa sortie et ses bornes.

POST /v1/chat/completions

Texte → texte

Entrée : messages (system / user / assistant), model, option response_format, max_tokens, stream.
Sortie : format OpenAI standard ; model dit qui a répondu. En-têtes X-AIF-Model, X-AIF-Ms, X-AIF-Remaining-Today.

POST /v1/search

Requête → résultats web

Entrée : query, max_results (1–10, défaut 5).
Sortie : {query, results:[{title, url, snippet}]}. Source : DuckDuckGo. Idéal pour trouver la page Facebook, Instagram ou le site d'une entreprise.

POST /v1/audio/speech

Texte → voix MP3

Entrée : input (≤ 1000 caractères), voice = code langue (fr, ar, en, es, de, it…).
Sortie : audio/mpeg, 24 kHz mono. ~0,4 s pour une phrase.

03 — Situations détailléesQuel réglage pour quel besoin

Chaque situation donne la route, le modèle, les variables à fixer, et le piège à éviter.

01

Résumer une fiche, un avis, une page

Beaucoup de texte en entrée, trois lignes en sortie.

  • Route : chat · modèle : fast (≈ 9 s)
  • Variables : max_tokens: 300, un message system qui fixe le format (« 3 puces, français »).
  • Piège : corps limité à 64 Ko — coupez une page longue avant de l'envoyer.
{"model":"fast","max_tokens":300,"messages":[
 {"role":"system","content":"3 puces, français, sans introduction."},
 {"role":"user","content":"<texte de la page>"}]}
02

Extraire des données structurées

Un message libre devient un objet propre à ranger dans une base.

  • Route : chat · modèle : smart · variable clé : response_format: {"type":"json_object"}
  • La réponse est du JSON valide, sinon la chaîne passe au modèle suivant ; si aucun n'y arrive → 502.
  • Données personnelles : numéros et e-mails sont masqués avant de partir ([TEL1], [MAIL1]) puis remis dans la réponse. Vous les recevez intacts.
{"model":"smart","response_format":{"type":"json_object"},"messages":[
 {"role":"user","content":"Extrais business, city, phone : Boulangerie El Amen à Sfax, 22 111 333"}]}
→ {"business":"Boulangerie El Amen","city":"Sfax","phone":"22 111 333"}
03

Traduire ou reformuler FR · EN · AR

Brouillons internes, reformulations, traductions de travail.

  • Modèle : nemotron-3-120b — le meilleur arabe du test, et le plus rapide.
  • Piège : aucun modèle n'écrit un darija tunisien fiable. Tout texte arabe destiné à un client se relit par un humain.
04

Trouver une entreprise sur le web

Recherche, puis synthèse : deux appels.

  • 1. /v1/search avec "query":"<nom> <ville>", max_results: 8.
  • 2. chat fast avec les results collés dans le message : « quelle URL est leur page officielle ? ».
  • Piège : les extraits sont courts ; le modèle ne lit pas les pages elles-mêmes.
05

Message vocal (WhatsApp, démo, standard)

Une phrase écrite devient un MP3 prêt à envoyer.

  • Route : speech · variables : voice: "fr" ou "ar", input ≤ 1000 caractères.
  • Voix de synthèse standard (une seule par langue), pas de clonage.
{"input":"Bonjour, votre site de démonstration est en ligne.","voice":"fr"}
06

Classer ou trier une liste

Leads, avis, tickets : une étiquette par ligne.

  • Modèle : smart · temperature: 0 pour des réponses stables · response_format JSON.
  • Envoyez des lots de 20 à 50 lignes plutôt qu'une requête par ligne : vous restez sous la limite par minute.
07

Interface de chat en direct

Pour un widget ou un outil qui attend un flux SSE.

  • stream: true est accepté : le texte arrive en un seul bloc SSE, puis [DONE]. Compatible avec les clients OpenAI ; l'effet « mot à mot » n'existe pas.
  • Prévoir un indicateur d'attente : 9 à 50 s selon le modèle.
Hors périmètre, refusé par le serveur — pas une recommandation, une règle :
ProgrammationÉcrire, corriger ou expliquer du code → 403 coding_refused.
Appels d'outilstools / functions400 tools_unsupported.
Images, vision, embeddingsPas de route : 404.
Texte final à un clientAutorisé techniquement, mais toujours relu : la qualité varie d'un modèle à l'autre.

04 — Variables pivotsLes boutons qui changent le résultat

Tout ce que vous pouvez régler, sa valeur par défaut, et quand y toucher.

VariableRouteValeursDéfautQuand la changer
modelchatauto · fast · smart · un id de la tableautofast pour la vitesse, smart pour le raisonnement, un id pour un résultat reproductible (pas de repli).
messages[].rolechatsystem · user · assistantsystem fixe la langue, le ton, le format. assistant sert à rejouer un historique.
max_tokenschat1 – 40001500Baissez pour des réponses courtes et plus rapides.
temperaturechat0 – 2celle du modèle0 pour classer et extraire. Certains modèles l'ignorent (Kimi).
response_formatchat{"type":"json_object"}texte libreDès qu'un programme lit la réponse.
streamchattrue · falsefalseSeulement si votre client exige du SSE.
querysearchtexteNom + ville trouve mieux qu'une description.
max_resultssearch1 – 105Montez à 8–10 pour trouver une page précise.
inputspeech≤ 1000 caractèresCoupez un long texte en phrases.
voicespeechcode langue ISO : fr, ar, enfrLa langue du texte, pas un timbre de voix.
Authorizationtoutes (POST)Bearer aif_… ou en-tête X-API-KeyUne clé par personne ou par outil : on la révoque sans toucher aux autres.
Arbitrage vitesse / qualité. fast ≈ 9 s, smart ≈ 20 s, deepseek-v4-pro ≈ 50 s. auto commence par le plus rapide et ne descend la chaîne qu'en cas d'échec. Le modèle qui a vraiment répondu est dans model et dans l'en-tête X-AIF-Model.

05 — ModèlesTous les modèles, testés

Test du 23/09/2026, mêmes questions pour tous : problème chiffré, piège logique, extraction JSON, fonction exécutée sur 11 cas, phrase de vente FR + darija. ok = fiable · weak = répond, mais échoue à la plupart · down = en panne côté fournisseur, refusé ici. Liste lisible par programme : GET /v1/models.

IdÉtatScoreTemps moyenRemarque
glm-5.2ok5/521 sBest all-round with Kimi; reasoning model
kimi-k2.7ok5/519 sSharpest reasoning in the test
kimi-k2.6ok5/523 sStrong; weak Arabic script
nemotron-3-120bok5/59 sFastest good model; best derja of the lot
deepseek-v4-flashok4/518 sGood; misspelled Sfax in Arabic
deepseek-v4-prook4/551 sGood but slow
llama-3.3-70bok4/523 sSolid, plain style
glm-4.7-flashok3/518 sRefuses some texts with personal data
gemma-4-26bok3/543 sSlow; sometimes errors
qwen2.5-32bweak3/58 sFailed the word problem
gpt-oss-20bweak2/56 sFast, shallow
granite-4.0-microweak3/58 sTiny model
llama-3.1-8bweak0/57 sAnswers with junk tool calls
mistral-small-3.1weak0/58 sOutput doubles every word
qwq-32bweak0/512 sRambles, never concludes
deepseek-r1-distill-32bweak0/513 sEmpty answers
gpt-oss-120bdownCloudflare-side error on every call
qwen3-30bdownCloudflare-side error on every call
llama-4-scoutdownCloudflare-side error on every call
sea-lion-v4-27bdownInternal server error

Alias : chaînes de repli

Un alias essaie chaque modèle dans l'ordre jusqu'à ce qu'un réponde.

AliasOrdre d'essai
autonemotron-3-120bglm-5.2kimi-k2.7kimi-k2.6deepseek-v4-flashllama-3.3-70b
fastnemotron-3-120bdeepseek-v4-flashllama-3.3-70b
smartglm-5.2kimi-k2.7kimi-k2.6deepseek-v4-pronemotron-3-120b

06 — Erreurs et limitesLire le code, pas le message

Toutes les erreurs ont la forme {"error":{"type","message"}}.

CodetypeCauseQue faire
400bad_request · model_not_found · tools_unsupportedCorps invalide, modèle inconnu ou en panne, tools envoyé.Corriger la requête ; voir /v1/models.
401invalid_api_keyClé absente, inconnue ou révoquée.Vérifier l'en-tête Authorization.
403coding_refusedLa demande porte sur du code.Ce service n'en fait pas.
413errorCorps au-delà de 64 Ko.Couper le texte.
429rate_limited20 requêtes / minute ou 500 / jour par clé.Attendre retry_after_seconds.
502upstream_failedTous les modèles de la chaîne ont échoué ; le détail est dans tried.Réessayer dans une minute ou changer de modèle.
503busyTrop de requêtes en cours sur le service.Réessayer après quelques secondes.
Disponibilité. Le service tourne en continu et se relance seul après une panne ou un redémarrage. Il est vérifié toutes les heures. Les modèles viennent de fournisseurs gratuits tiers sans garantie de service : un modèle peut disparaître sans préavis, d'où les chaînes de repli. État en direct : GET /health.

Une clé, et c'est branché.

Écrivez-nous sur WhatsApp : vous recevez votre clé gratuite, et si vous voulez l'IA intégrée à votre site, votre caisse ou votre suivi client, on vous montre comment.

Demander ma clé sur WhatsApp