Brick Appel IA
transform/ai_call — une ligne = un appel. Quatre questions, et rien
d'autre :
- Quelle connexion — elle porte le fournisseur et la clé d'API ;
- quel modèle — vide = celui par défaut de la connexion ;
- qu'est-ce que j'envoie — un prompt, et éventuellement une colonne d'entrée ;
- où ranger la réponse — une colonne,
ai_responsepar défaut.
La brick ne connaît aucun fournisseur. C'est le backend de la connexion qui
sait comment attacher un document à une requête ou imposer un schéma JSON —
ajouter un fournisseur ne crée aucune brick. Même principe que pour le
stockage, où e_file_input ignore s'il parle à S3, à un FTP ou au disque local.
Le modèle décide de la route
Certains fournisseurs servent l'océrisation par un endpoint distinct, avec une famille de modèles dédiée. Ce n'est pas un réglage de plus : c'est le modèle choisi qui le désigne.
Chez Mistral, mistral-ocr-latest part vers l'endpoint d'océrisation et rend le
texte du document ; mistral-large-latest part vers la complétion et lit le
document en voyant sa mise en page. Même colonne d'entrée, deux traitements —
le choix se fait là où tu le faisais déjà.
L'océrisation aplatit le document en texte et perd la mise en page : les colonnes d'un tableau, les alignements, ce qui distingue un montant d'un numéro de dossier. Pour extraire des données, un modèle qui voit la page fait mieux, et en un appel. Réserve l'océrisation au cas où c'est le texte lui-même que tu veux : recherche plein texte, archivage.
Générer avec l'IA
extract/e_ai_generate — une source, pas une transformation : elle n'a pas
d'entrée et fabrique des lignes.
| Paramètre | Défaut | Description |
|---|---|---|
prompt_template | — | Ce qu'on demande au modèle. |
output_column | ai_response | Colonne qui reçoit la réponse. |
runs | 1 | Une ligne par génération — chacune est un appel facturé. |
temperature | 0.7 | Monter pour varier d'une génération à l'autre. |
Deux usages : ouvrir un flux sur une génération, ou fabriquer un jeu d'essai. Dans ce second cas la température compte — à 0, un même prompt rend la même réponse et les N lignes seront identiques. La brick le signale.
Un modèle d'océrisation y est refusé : cette brick ne fournit aucun document, et l'erreur arrive avant le premier appel plutôt qu'à chaque génération.
Connexion IA
La connexion se crée comme les autres, dans Connexions → Nouvelle connexion → Intelligence artificielle. Voir Créer une connexion.
C'est elle qui porte le fournisseur — Mistral aujourd'hui — sa clé d'API et son modèle par défaut. Les paramètres ci-dessous sont ceux du connecteur Mistral.
| Paramètre | Défaut | Description |
|---|---|---|
api_key | — | Clé API Mistral (console.mistral.ai). Stockée chiffrée. |
base_url | https://api.mistral.ai | À changer uniquement pour passer par une passerelle. |
default_model | mistral-large-latest | Modèle utilisé quand la brick n'en impose pas. |
timeout | 120 | Délai maximum par appel, en secondes. |
max_retries | 3 | Reprises sur erreur réseau, quota (429) ou 5xx. |
retry_delay | 2 | Délai de base entre tentatives, doublé à chaque essai. |
verify_ssl | true | Vérification du certificat TLS. |
Le bouton Tester vérifie la clé en listant les modèles du compte.
Paramètres
| Paramètre | Défaut | Description |
|---|---|---|
connection_id | — | Connexion IA utilisée. |
model | (vide) | Vide = modèle par défaut de la connexion. Le bouton à droite du champ liste les modèles du compte. |
document_column | (vide) | Colonne d'entrée. Vide = on n'envoie que le prompt. |
prompt_template | (vide) | Insère une valeur de colonne avec {{nom_de_colonne}}. |
output_column | ai_response | Colonne qui reçoit la réponse du modèle. |
system_prompt | (une consigne) | Cadre le rôle du modèle, identique pour toutes les lignes. |
temperature | 0 | 0 pour une extraction reproductible. |
max_tokens | 0 | 0 = laisser le fournisseur décider. |
skip_when_column | (vide) | Colonne booléenne : les lignes vraies ne sont pas envoyées. |
max_parallel | 4 | Lignes traitées en parallèle. |
on_error | fail | fail arrête au premier échec, continue laisse la ligne vide. |
error_column | ai_error | Renseignée en mode continue. |
L'entrée n'a rien à déclarer
Un modèle prend du texte. Mais un document ne se met pas dans du texte : les API le passent par un champ dédié, et l'y forcer fait répondre une erreur qui parle du format d'entrée sans jamais nommer la colonne.
La brick tranche donc sur la valeur, ligne par ligne :
| Valeur de la colonne | Ce qui se passe |
|---|---|
commence par http | jointe comme document, via son URL |
| encodée en base64 | jointe comme document |
| autre chose | envoyée en texte, à la suite du prompt |
Le type du document se déduit de même — signature des premiers octets pour du base64, extension pour une URL : PDF, PNG, JPEG, GIF, TIFF. Une image et un PDF n'entrent pas par la même porte de l'API, et un type mal deviné fait répondre au modèle qu'il n'a rien reçu, sans erreur HTTP. C'est pour ça que la déduction se fait sur le contenu, et non sur une déclaration qu'on peut oublier de mettre à jour.
Une colonne peut donc mélanger les deux : chaque ligne suit sa nature.
Enchaîner deux appels — l'un qui océrise, l'autre qui interprète le texte — fonctionne : la colonne de réponse du premier devient la colonne d'entrée du second. Mais un seul appel avec un modèle qui voit la page fait souvent mieux, et coûte moitié moins.
Sur un PDF Factur-X, la colonne content porte du XML, pas un document
encodé. Aiguille sur has_embedded_xml avant la brick, ou renseigne
skip_when_column : les données XML sont exactes et n'ont rien à faire dans un
modèle.
Sortie
Une colonne, ai_response par défaut, qui reçoit la réponse du modèle telle
quelle. Les colonnes d'entrée traversent la brick. En mode continue, une
colonne d'erreur s'ajoute.
Le nom est réglable : deux appels IA à la suite écriraient sinon dans la même colonne, le second effaçant le premier.
Le schéma de sortie est connu sans appeler le modèle : les bricks en aval voient la colonne dès la conception.
Pour obtenir des champs
La brick appelle, elle n'interprète pas. Demande du JSON dans le prompt, puis découpe-le avec Depuis JSON :
Réponds uniquement en JSON : {"numero": …, "total_ttc": …, "date": …}
Sans schéma imposé au modèle, rien ne garantit que la réponse soit du JSON valide. Fais suivre d'une vérification — Qualité ou Validation de format — sur ce qui est vérifiable : cohérence HT + TVA = TTC, format de SIRET, plage de dates.
Coût et débit
La brick parallélise ses appels (max_parallel), car le temps est dominé par
l'attente réseau. Trois réflexes :
- préférer un modèle qui voit la page quand tu veux des données : un appel au lieu de deux, et un meilleur résultat qu'une océrisation suivie d'une interprétation ;
- réduire
max_parallelen cas d'erreurs 429 (quota dépassé) — les reprises sont automatiques mais coûtent du temps ; - filtrer en amont ce qui n'a pas besoin du modèle (
skip_when_column, un Router surhas_embedded_xml) : un appel évité est un appel gratuit.