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.
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.
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.
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.
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.
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 messagesystemqui 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>"}]}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"}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.
Trouver une entreprise sur le web
Recherche, puis synthèse : deux appels.
- 1.
/v1/searchavec"query":"<nom> <ville>",max_results: 8. - 2. chat
fastavec lesresultscollé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.
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"}Classer ou trier une liste
Leads, avis, tickets : une étiquette par ligne.
- Modèle :
smart·temperature: 0pour des réponses stables ·response_formatJSON. - Envoyez des lots de 20 à 50 lignes plutôt qu'une requête par ligne : vous restez sous la limite par minute.
Interface de chat en direct
Pour un widget ou un outil qui attend un flux SSE.
stream: trueest 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.
403 coding_refused.tools / functions → 400 tools_unsupported.404.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.
| Variable | Route | Valeurs | Défaut | Quand la changer |
|---|---|---|---|---|
model | chat | auto · fast · smart · un id de la table | auto | fast pour la vitesse, smart pour le raisonnement, un id pour un résultat reproductible (pas de repli). |
messages[].role | chat | system · user · assistant | — | system fixe la langue, le ton, le format. assistant sert à rejouer un historique. |
max_tokens | chat | 1 – 4000 | 1500 | Baissez pour des réponses courtes et plus rapides. |
temperature | chat | 0 – 2 | celle du modèle | 0 pour classer et extraire. Certains modèles l'ignorent (Kimi). |
response_format | chat | {"type":"json_object"} | texte libre | Dès qu'un programme lit la réponse. |
stream | chat | true · false | false | Seulement si votre client exige du SSE. |
query | search | texte | — | Nom + ville trouve mieux qu'une description. |
max_results | search | 1 – 10 | 5 | Montez à 8–10 pour trouver une page précise. |
input | speech | ≤ 1000 caractères | — | Coupez un long texte en phrases. |
voice | speech | code langue ISO : fr, ar, en… | fr | La langue du texte, pas un timbre de voix. |
Authorization | toutes (POST) | Bearer aif_… ou en-tête X-API-Key | — | Une clé par personne ou par outil : on la révoque sans toucher aux autres. |
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 | État | Score | Temps moyen | Remarque |
|---|---|---|---|---|
glm-5.2 | ok | 5/5 | 21 s | Best all-round with Kimi; reasoning model |
kimi-k2.7 | ok | 5/5 | 19 s | Sharpest reasoning in the test |
kimi-k2.6 | ok | 5/5 | 23 s | Strong; weak Arabic script |
nemotron-3-120b | ok | 5/5 | 9 s | Fastest good model; best derja of the lot |
deepseek-v4-flash | ok | 4/5 | 18 s | Good; misspelled Sfax in Arabic |
deepseek-v4-pro | ok | 4/5 | 51 s | Good but slow |
llama-3.3-70b | ok | 4/5 | 23 s | Solid, plain style |
glm-4.7-flash | ok | 3/5 | 18 s | Refuses some texts with personal data |
gemma-4-26b | ok | 3/5 | 43 s | Slow; sometimes errors |
qwen2.5-32b | weak | 3/5 | 8 s | Failed the word problem |
gpt-oss-20b | weak | 2/5 | 6 s | Fast, shallow |
granite-4.0-micro | weak | 3/5 | 8 s | Tiny model |
llama-3.1-8b | weak | 0/5 | 7 s | Answers with junk tool calls |
mistral-small-3.1 | weak | 0/5 | 8 s | Output doubles every word |
qwq-32b | weak | 0/5 | 12 s | Rambles, never concludes |
deepseek-r1-distill-32b | weak | 0/5 | 13 s | Empty answers |
gpt-oss-120b | down | — | — | Cloudflare-side error on every call |
qwen3-30b | down | — | — | Cloudflare-side error on every call |
llama-4-scout | down | — | — | Cloudflare-side error on every call |
sea-lion-v4-27b | down | — | — | Internal server error |
Alias : chaînes de repli
Un alias essaie chaque modèle dans l'ordre jusqu'à ce qu'un réponde.
| Alias | Ordre d'essai |
|---|---|
auto | nemotron-3-120b → glm-5.2 → kimi-k2.7 → kimi-k2.6 → deepseek-v4-flash → llama-3.3-70b |
fast | nemotron-3-120b → deepseek-v4-flash → llama-3.3-70b |
smart | glm-5.2 → kimi-k2.7 → kimi-k2.6 → deepseek-v4-pro → nemotron-3-120b |
06 — Erreurs et limitesLire le code, pas le message
Toutes les erreurs ont la forme {"error":{"type","message"}}.
| Code | type | Cause | Que faire |
|---|---|---|---|
| 400 | bad_request · model_not_found · tools_unsupported | Corps invalide, modèle inconnu ou en panne, tools envoyé. | Corriger la requête ; voir /v1/models. |
| 401 | invalid_api_key | Clé absente, inconnue ou révoquée. | Vérifier l'en-tête Authorization. |
| 403 | coding_refused | La demande porte sur du code. | Ce service n'en fait pas. |
| 413 | error | Corps au-delà de 64 Ko. | Couper le texte. |
| 429 | rate_limited | 20 requêtes / minute ou 500 / jour par clé. | Attendre retry_after_seconds. |
| 502 | upstream_failed | Tous 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. |
| 503 | busy | Trop de requêtes en cours sur le service. | Réessayer après quelques secondes. |
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