<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Antoine Laurent</title>
    <description>The latest articles on DEV Community by Antoine Laurent (@antoine_laurentt).</description>
    <link>https://dev.to/antoine_laurentt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3820003%2Fa715e92b-d41a-4a32-8b32-8cf0b0c9b5c8.png</url>
      <title>DEV Community: Antoine Laurent</title>
      <link>https://dev.to/antoine_laurentt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antoine_laurentt"/>
    <language>en</language>
    <item>
      <title>Automatiser sa recherche d'emploi avec l'IA Open Source (Guide Career-Ops)</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Tue, 07 Apr 2026 10:07:38 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/automatiser-sa-recherche-demploi-avec-lia-open-source-guide-career-ops-1f37</link>
      <guid>https://dev.to/antoine_laurentt/automatiser-sa-recherche-demploi-avec-lia-open-source-guide-career-ops-1f37</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Career-Ops est un boilerplate open source qui transforme Claude Code en un centre de commande pour la recherche d'emploi. Il évalue les offres (note A à F), génère des CV optimisés pour les ATS et adaptés à chaque annonce, scanne automatiquement plus de 45 portails d'entreprise, et suit tout dans un tableau de bord terminal. Le créateur l'a utilisé pour évaluer 740+ offres et décrocher un poste de Head of Applied AI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;La plupart des développeurs suivent leurs candidatures dans un tableur. Vous ouvrez un nouvel onglet, collez une description de poste, cherchez des mots-clés, mettez à jour une ligne avec "Candidature envoyée, en attente." Vous répétez ça 50 fois et le processus devient un second job.&lt;/p&gt;

&lt;p&gt;Career-Ops inverse ce modèle. Au lieu de tout faire manuellement, déléguez à Claude Code : collez une URL ou une description de poste, le système lit votre CV, évalue l'adéquation, note l’offre sur 10 dimensions, génère un PDF personnalisé et sauvegarde le résultat. À vous de décider de postuler.&lt;/p&gt;

&lt;p&gt;Ce n'est pas un bot de candidatures massives. Le système filtre et recommande uniquement ce qui vaut le coup (seuil de 4.0/5). Son créateur, Santiago Fernández de Valderrama, a évalué plus de 740 offres, généré 100+ CV personnalisés, décroché un poste de Head of Applied AI, et le projet a atteint 11 900 étoiles GitHub en moins d’une semaine.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Tip&lt;/strong&gt; : Si vous développez ou testez des API, les Scénarios de Test d'&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; vous permettent de vérifier chaque appel HTTP que Career-Ops effectue vers les API des sites d'emploi, avant toute mise en production. Voir [internal: api-testing-tutorial] pour une approche complète.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que Career-Ops fait réellement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/santifer/career-ops" rel="noopener noreferrer"&gt;Career-Ops&lt;/a&gt; est un boilerplate Claude Code. Ce n'est pas une application autonome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mise en place rapide :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clonez le dépôt.&lt;/li&gt;
&lt;li&gt;Ajoutez votre CV en markdown.&lt;/li&gt;
&lt;li&gt;Configurez votre profil YAML.&lt;/li&gt;
&lt;li&gt;Ouvrez Claude Code dans ce dossier.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Une commande slash exécute tout le pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuln89ymw48c4v042moe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuln89ymw48c4v042moe.png" alt="Flux de travail"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow principal :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vous collez une URL ou une description de poste
        |
        v
Détection de l'archétype
(LLMOps / Agentique / PM / SA / FDE / Transformation)
        |
        v
Moteur d'évaluation A-F
(lit votre cv.md, note 10 dimensions)
        |
   +----+----+
   v    v    v
Rapport  PDF  Suivi
 .md   .pdf  .tsv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L'exécution se fait dans Claude Code, qui lit/modifie ses propres fichiers de configuration : modes, pondérations, scripts de négociation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les 14 commandes slash
&lt;/h2&gt;

&lt;p&gt;Le point d’entrée : &lt;code&gt;/career-ops&lt;/code&gt; avec 14 modes clés.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/career-ops                 → Liste toutes les commandes
/career-ops &lt;span class="o"&gt;{&lt;/span&gt;description&lt;span class="o"&gt;}&lt;/span&gt;   → Évaluation complète : scoring + PDF + suivi
/career-ops scan            → Scanner 45+ portails d&lt;span class="s1"&gt;'entreprise
/career-ops pdf             → Générer un CV ATS pour une annonce
/career-ops batch           → Évaluer 10+ offres en parallèle
/career-ops tracker         → Statut du pipeline de candidatures
/career-ops apply           → Remplir des formulaires de candidature avec l'&lt;/span&gt;IA
/career-ops pipeline        → Traiter une file d’attente d’URL
/career-ops contacto        → Messages de prospection LinkedIn
/career-ops deep            → Recherche approfondie entreprise
/career-ops training        → Évaluer un cours/certif
/career-ops project         → Évaluer un projet de portfolio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La commande principale : collez l’URL d’un poste, Career-Ops gère tout. L’auto-détection de mode permet de simplement insérer la description brute pour déclencher l’évaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment fonctionne le moteur de notation A-F
&lt;/h2&gt;

&lt;p&gt;Le cœur du système : chaque offre est analysée via 6 blocs structurés.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bloc A : Résumé du rôle.&lt;/strong&gt; Extraction du titre, équipe, séniorité, compétences, archétype.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloc B : Adéquation du CV.&lt;/strong&gt; Analyse de votre profil versus l’annonce, au-delà des mots-clés. Met en évidence lacunes et points forts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloc C : Stratégie niveau/rémunération.&lt;/strong&gt; Recherche des fourchettes salariales, prépare les arguments de négociation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloc D : Personnalisation.&lt;/strong&gt; Génère les points pour lettre de motivation/prospection, adaptés à l’entreprise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloc E : Score (A-F).&lt;/strong&gt; Score global (recommandé : postuler uniquement si &amp;gt;4.0/5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloc F : Préparation entretien (STAR+R).&lt;/strong&gt; Génère des récits STAR stockés dans &lt;code&gt;story-bank.md&lt;/code&gt;, pour constituer une bibliothèque réutilisable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Des scripts de négociation (ancrage salarial, refus de réduction géographique, argumentaires d’offres concurrentes) sont aussi générés.&lt;/p&gt;

&lt;h2&gt;
  
  
  Génération de PDF optimisés ATS
&lt;/h2&gt;

&lt;p&gt;Le générateur PDF adapte votre CV à chaque annonce :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyse la description pour extraire mots-clés et exigences.&lt;/li&gt;
&lt;li&gt;Réécrit vos expériences pour mettre en avant ces mots-clés, sans rien inventer.&lt;/li&gt;
&lt;li&gt;Génère un PDF via Playwright/Puppeteer avec un template HTML (polices Space Grotesk &amp;amp; DM Sans).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemple d’utilisation :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Générer un CV personnalisé pour une annonce&lt;/span&gt;
/career-ops pdf

&lt;span class="c"&gt;# Ou via le pipeline complet&lt;/span&gt;
/career-ops &lt;span class="o"&gt;{&lt;/span&gt;URL ou description &lt;span class="nb"&gt;du &lt;/span&gt;poste&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les PDF sont placés dans &lt;code&gt;output/&lt;/code&gt;, ignoré par Git pour préserver vos données.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scan de portails à grande échelle
&lt;/h2&gt;

&lt;p&gt;Career-Ops intègre 45+ entreprises IA/scalups configurées pour le scan automatique :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Laboratoires IA:&lt;/strong&gt; Anthropic, OpenAI, Mistral, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IA vocale:&lt;/strong&gt; ElevenLabs, PolyAI, Parloa, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plateformes IA:&lt;/strong&gt; Retool, Airtable, Vercel, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLMOps:&lt;/strong&gt; Langfuse, W&amp;amp;B, Lindy, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entreprise:&lt;/strong&gt; Salesforce, Twilio, Gong, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatisation:&lt;/strong&gt; n8n, Zapier, Make.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DACH/Europe:&lt;/strong&gt; Factorial, Attio, Tinybird, +31 entreprises DACH&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le scanner utilise Playwright pour extraire les offres sur les pages carrière et interroge directement les API de Greenhouse, Ashby, Lever, Wellfound. Configurez vos cibles dans &lt;code&gt;portals.yml&lt;/code&gt;, puis lancez :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/career-ops scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les nouvelles offres sont intégrées automatiquement dans votre pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traitement par lots avec des sous-agents parallèles
&lt;/h2&gt;

&lt;p&gt;Pour traiter rapidement un backlog d’offres :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Déposez les URLs dans le dossier jds/&lt;/span&gt;
&lt;span class="c"&gt;# Puis lancez :&lt;/span&gt;
/career-ops batch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sous le capot, des workers &lt;code&gt;claude -p&lt;/code&gt; traitent chaque offre en parallèle. Résultats fusionnés et dédupliqués automatiquement. Le script &lt;code&gt;batch/batch-runner.sh&lt;/code&gt; orchestre le tout et gère les échecs.&lt;/p&gt;

&lt;p&gt;Ce mode permet d’évaluer 20 offres en moins d’une heure, contre une journée en manuel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tableau de bord TUI en Go
&lt;/h2&gt;

&lt;p&gt;Le suivi des candidatures est stocké dans &lt;code&gt;data/applications.md&lt;/code&gt; (tableau markdown).&lt;/p&gt;

&lt;p&gt;Le dashboard terminal (Go + Bubble Tea, thème Catppuccin Mocha) offre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6 filtres (statut, archétype, score)&lt;/li&gt;
&lt;li&gt;4 modes de tri&lt;/li&gt;
&lt;li&gt;Vue groupée ou plate&lt;/li&gt;
&lt;li&gt;Aperçus différés des rapports&lt;/li&gt;
&lt;li&gt;Changement de statut en ligne
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;dashboard
go build &lt;span class="nt"&gt;-o&lt;/span&gt; career-dashboard &lt;span class="nb"&gt;.&lt;/span&gt;
./career-dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mettez à jour le statut d’une candidature directement dans le TUI, sans toucher au markdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration en 15 minutes
&lt;/h2&gt;

&lt;p&gt;Procédure :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Cloner et installer&lt;/span&gt;
git clone https://github.com/santifer/career-ops.git
&lt;span class="nb"&gt;cd &lt;/span&gt;career-ops &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
&lt;/span&gt;npx playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium

&lt;span class="c"&gt;# 2. Configurer le profil&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/profile.example.yml config/profile.yml
&lt;span class="c"&gt;# Éditez profile.yml (nom, lieu, rôle, salaire, préférences)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Configurer les entreprises&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;templates/portals.example.yml portals.yml
&lt;span class="c"&gt;# Modifiez la liste dans portals.yml&lt;/span&gt;

&lt;span class="c"&gt;# 4. Ajoutez votre CV&lt;/span&gt;
&lt;span class="c"&gt;# Créez cv.md à la racine, collez votre CV (markdown)&lt;/span&gt;

&lt;span class="c"&gt;# 5. Ouvrir Claude Code&lt;/span&gt;
claude
&lt;span class="c"&gt;# Exemples de commandes :&lt;/span&gt;
&lt;span class="c"&gt;# "Changer les archétypes en rôles backend"&lt;/span&gt;
&lt;span class="c"&gt;# "Ajouter ces entreprises à portals.yml"&lt;/span&gt;
&lt;span class="c"&gt;# "Mettre à jour mon profil avec ce CV"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude peut modifier les fichiers système pour personnaliser modes, pondérations et scripts, sur simple demande.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mise à jour automatique
&lt;/h2&gt;

&lt;p&gt;Version 1.1.0 : deux couches (fichiers système vs utilisateur). Les mises à jour ne touchent que la couche système.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Vérifier les mises à jour&lt;/span&gt;
node update-system.mjs check

&lt;span class="c"&gt;# Appliquer mise à jour&lt;/span&gt;
node update-system.mjs apply

&lt;span class="c"&gt;# Annuler&lt;/span&gt;
node update-system.mjs rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une branche de sauvegarde est créée à chaque mise à jour. Vérification automatique de l’intégrité des données utilisateur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Différences avec les autres outils
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pas de bot de candidatures, mais un système d’aide à la décision.&lt;/strong&gt; Ne postulez pas &amp;lt;4.0/5, économisez votre temps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyse réelle de l’adéquation, pas seulement des mots-clés.&lt;/strong&gt; Le raisonnement prime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S’améliore avec le contexte fourni.&lt;/strong&gt; Plus votre profil est enrichi, plus l’évaluation est pertinente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toutes vos données restent locales.&lt;/strong&gt; Rien n’est envoyé ailleurs (hors appels API nécessaires à l’évaluation).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations à connaître
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nécessite Claude Code.&lt;/strong&gt; Non compatible avec d'autres modèles/interfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright dépendant des portails.&lt;/strong&gt; Fonctionne mieux sur Greenhouse/Ashby/Lever ; pages custom parfois instables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Étalonnage initial obligatoire.&lt;/strong&gt; Prévoyez une heure pour configurer le profil et fournir contexte/preuves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch = consommation rapide de crédits API.&lt;/strong&gt; Surveillez votre quota avant un traitement de masse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voir [internal: how-ai-agent-memory-works] pour comprendre l’importance du contexte et de l’étalonnage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour qui ?
&lt;/h2&gt;

&lt;p&gt;Career-Ops s’adresse aux devs/profils techniques qui :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cherchent activement un job et veulent automatiser le suivi&lt;/li&gt;
&lt;li&gt;Visent des rôles dans des entreprises d’IA&lt;/li&gt;
&lt;li&gt;Veulent l’IA comme assistant d’évaluation/filtrage, pas comme bot de candidature&lt;/li&gt;
&lt;li&gt;Sont à l’aise avec le CLI et l’édition YAML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Non adapté&lt;/strong&gt; : utilisateurs non techniques, recherche d’interface graphique, automatisation de la soumission des candidatures (cette étape reste manuelle).&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour commencer
&lt;/h2&gt;

&lt;p&gt;Clonez le repo, ajoutez votre CV, passez 1h à configurer votre profil avec Claude, puis réalisez une première évaluation sur une offre pertinente. L’étalonnage initial est vite rentabilisé.&lt;/p&gt;

&lt;p&gt;GitHub : &lt;a href="https://github.com/santifer/career-ops" rel="noopener noreferrer"&gt;github.com/santifer/career-ops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Licence MIT, contributions bienvenues (ouvrir une issue avant PR).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Career-Ops est aujourd’hui le pipeline open source de recherche d’emploi le plus complet : notation A-F, génération PDF ATS, traitement batch parallèle, dashboard TUI Go. Avec un profil bien calibré, vous filtrez efficacement et ne postulez que là où cela a du sens.&lt;/p&gt;

&lt;p&gt;La recherche d’emploi est un problème d’information, pas de volume. Career-Ops traite le problème sous cet angle.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Career-Ops est-il payant ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Non, licence MIT. Vous payez uniquement l’API Claude selon usage (10k-30k tokens/évaluation complète, soit &amp;lt;0,05 $/évaluation).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compatible avec d’autres modèles que Claude ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Non. Boilerplate dédié Claude Code. Portage nécessiterait de réécrire les définitions de compétences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimisation ATS, comment ça marche ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Lecture de l’offre, extraction de mots-clés, réécriture des expériences pour coller naturellement au wording du poste. Pas d’invention. PDF généré via Playwright avec polices compatibles ATS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quels portails sont supportés ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Greenhouse, Ashby, Lever, Wellfound, Workable, RemoteFront nativement. Pour les autres, Playwright scrappe la page carrière. 31 entreprises DACH/UE ajoutées par la communauté. Voir [internal: local-vs-api-ai-models] pour plus d’infos sur la gestion multi-API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mes données CV sont-elles sécurisées ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, tout est local par défaut (CV, candidatures, PDF, rapports ignorés par Git). Seuls les appels API nécessaires à l’évaluation sortent (vers l’API Anthropic). Voir [internal: claude-code] pour plus d’infos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peut-on ajouter ses propres entreprises au scanner ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Copiez &lt;code&gt;templates/portals.example.yml&lt;/code&gt; vers &lt;code&gt;portals.yml&lt;/code&gt; et ajoutez vos entreprises. Si Greenhouse/Ashby/Lever, détection auto via API. Pour les pages custom, définissez des sélecteurs Playwright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combien de temps pour une évaluation complète ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
2-4 min avec Claude 3.5 Sonnet. En batch, 10 offres traitées en parallèle en 2-4 min.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qu’est-ce que le cadre STAR+R ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
STAR = Situation, Tâche, Action, Résultat. +R = Réflexion (ce que vous feriez différemment, ce que vous avez appris). Career-Ops ajoute cette colonne pour signaler la séniorité.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Meilleurs assistants de codage open source en 2026: Alternatives gratuites à Cursor</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Tue, 07 Apr 2026 10:01:31 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/meilleurs-assistants-de-codage-open-source-en-2026-alternatives-gratuites-a-cursor-fep</link>
      <guid>https://dev.to/antoine_laurentt/meilleurs-assistants-de-codage-open-source-en-2026-alternatives-gratuites-a-cursor-fep</guid>
      <description>&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;p&gt;Cursor coûte 20 $/mois. Windsurf coûte 15 $/mois. Cinq alternatives open source égalent désormais 80 % des fonctionnalités gratuitement, y compris le codage agentique, les modifications multi-fichiers et la flexibilité "apportez votre propre modèle". Ce guide couvre les meilleures, ce pour quoi chacune est réellement bonne et comment choisir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Il y a un an, "assistant de codage open source" désignait un plugin de complétion de code qui suggérait la ligne suivante. Aujourd'hui, il s'agit d'un environnement de codage agentique complet capable de lire votre base de code, d'écrire des tests, d'exécuter des commandes terminales et d'itérer sur sa propre sortie.&lt;/p&gt;

&lt;p&gt;L'écart entre les outils payants et les alternatives gratuites s'est considérablement réduit. Cursor reste la référence en matière de codage agentique, mais à 20 $/mois par développeur, cela s'additionne rapidement pour les équipes. Windsurf, à 15 $/mois, est une alternative solide. GitHub Copilot, à 10 $/mois, bénéficie de la plus large adoption. Les trois sont propriétaires. Vous ne pouvez pas auditer le code, vous ne pouvez pas les auto-héberger, et vous êtes lié à leurs choix de modèles.&lt;/p&gt;

&lt;p&gt;Les outils open source présentés dans cet article vous offrent une flexibilité de modèle, une auditabilité complète et zéro frais d'abonnement. Le compromis est le temps de configuration et, dans certains cas, une expérience utilisateur moins raffinée.&lt;/p&gt;

&lt;p&gt;💡Une chose qu'aucun de ces outils ne fait : tester les API que votre code généré par l'IA appelle. C'est là qu'Apidog intervient. Une fois qu'un assistant de codage IA écrit un client REST ou génère des points de terminaison conformes à la spécification OpenAPI, les scénarios de test d'Apidog vous permettent de vérifier ces intégrations avant qu'elles n'atteignent la production. Consultez [internal: api-testing-tutorial] pour le workflow de test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi les assistants de codage open source sont viables en 2026
&lt;/h2&gt;

&lt;p&gt;Trois choses ont changé.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accès aux modèles&lt;/strong&gt; : OpenAI, Anthropic et Google offrent tous un accès API à leurs modèles de pointe. Un outil open source avec une bonne UX peut offrir le même modèle sous-jacent que Cursor ; il ne vient juste pas avec l'enveloppe propriétaire. Des outils comme Continue.dev et Cline vous permettent de brancher directement Claude 3.5 Sonnet, GPT-4o ou Gemini 1.5 Pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modèles locaux&lt;/strong&gt; : Ollama a rendu trivial l'exécution locale de Qwen2.5-Coder, DeepSeek-Coder-V2 et Code Llama. Pour les bases de code sensibles où vous ne pouvez pas envoyer de code à une API externe, les modèles locaux sont désormais véritablement utilisables pour les tâches de codage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture d'agent&lt;/strong&gt; : L'API d'utilisation d'outils de Claude et l'appel de fonctions de GPT-4o ont standardisé le fonctionnement des agents de codage. Les frameworks open source peuvent reproduire la même boucle de lecture de fichiers/écriture de fichiers/exécution de terminal qui alimente le mode agent de Cursor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les 5 meilleurs assistants de codage open source
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Continue.dev
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que c'est&lt;/strong&gt; : une extension VS Code et JetBrains qui ajoute une barre latérale de chat, des modifications en ligne et une fonction de questions-réponses consciente de la base de code. L'option &lt;a href="https://github.com/continuedev/continue" rel="noopener noreferrer"&gt;open source&lt;/a&gt; la plus mature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnub0gbftgsmggqyy4qzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnub0gbftgsmggqyy4qzm.png" alt="Image de l'extension Continue.dev pour VS Code" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour&lt;/strong&gt; : les développeurs qui souhaitent une expérience similaire à Cursor dans VS Code sans quitter leur configuration existante. Excellent pour les équipes qui veulent contrôler le modèle qu'elles utilisent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installez depuis la marketplace VS Code.&lt;/li&gt;
&lt;li&gt;Ajoutez votre clé API (OpenAI, Anthropic, Gemini ou Ollama local).&lt;/li&gt;
&lt;li&gt;Aucun compte requis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ce qu'il peut faire :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat contextuel avec indexation complète de la base de code&lt;/li&gt;
&lt;li&gt;Modifications en ligne via &lt;code&gt;Ctrl+I&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Recherche &lt;code&gt;@codebase&lt;/code&gt; sur l'ensemble du dépôt&lt;/li&gt;
&lt;li&gt;Commandes slash et fournisseurs de contexte personnalisés&lt;/li&gt;
&lt;li&gt;Fonctionne avec plus de 20 fournisseurs de modèles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt; : pas d'exécution de terminal intégrée ni de boucle d'agent autonome. C'est un assistant, pas un agent. Vous approuvez chaque modification manuellement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coût&lt;/strong&gt; : gratuit. Auto-hébergé ou utilisez vos propres clés API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Continue.dev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prix&lt;/td&gt;
&lt;td&gt;20 $/mois&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support VS Code&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support JetBrains&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibilité du modèle&lt;/td&gt;
&lt;td&gt;Limitée&lt;/td&gt;
&lt;td&gt;Complète&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mode Agent&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Partiel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idéal pour&lt;/td&gt;
&lt;td&gt;Codage agentique complet&lt;/td&gt;
&lt;td&gt;Édition assistée avec contrôle du modèle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Aider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que c'est&lt;/strong&gt; : un agent de codage basé sur le terminal qui utilise Git comme interface principale. Vous décrivez ce que vous voulez, &lt;a href="http://apidog.com/blog/aider-ai/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Aider&lt;/a&gt; lit les fichiers pertinents, apporte des modifications et les commite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kbw9saep1ohti5vp3ld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kbw9saep1ohti5vp3ld.png" alt="Aider en action, dans un terminal" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour&lt;/strong&gt; : les ingénieurs backend qui travaillent dans le terminal et souhaitent un agent de codage autonome qu'ils peuvent exécuter dans un pipeline CI ou sur un serveur distant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aider-chat
aider &lt;span class="nt"&gt;--model&lt;/span&gt; claude-3-5-sonnet-20241022
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(à lancer depuis la racine de votre projet)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce qu'il peut faire :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modifications multi-fichiers autonomes avec des commits Git&lt;/li&gt;
&lt;li&gt;Fonctionne avec Claude, GPT-4o, Gemini et les modèles locaux&lt;/li&gt;
&lt;li&gt;Flag &lt;code&gt;--yes&lt;/code&gt; pour un fonctionnement entièrement automatisé&lt;/li&gt;
&lt;li&gt;Lit la carte du dépôt pour comprendre la structure de la base de code&lt;/li&gt;
&lt;li&gt;Prise en charge de la saisie vocale&lt;/li&gt;
&lt;li&gt;Suite de benchmarks intégrée (&lt;code&gt;aider-bench&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt; : uniquement en terminal. Pas d'intégration IDE. L'absence d'une vue de diff visuelle rend l'examen des modifications importantes difficile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coût&lt;/strong&gt; : gratuit. Paiement à l'utilisation pour l'API du modèle sous-jacent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple pratique&lt;/strong&gt; : exécutez Aider dans un workflow GitHub Actions pour corriger automatiquement les tests échoués :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Aider to fix tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;aider --model gpt-4o \&lt;/span&gt;
          &lt;span class="s"&gt;--message "Fix the failing tests in test_api.py" \&lt;/span&gt;
          &lt;span class="s"&gt;--yes \&lt;/span&gt;
          &lt;span class="s"&gt;--no-git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Cline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que c'est&lt;/strong&gt; : une extension VS Code qui exécute une boucle d'agent complète avec utilisation d'outils. &lt;a href="http://apidog.com/blog/what-is-cline/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cline&lt;/a&gt; peut lire des fichiers, écrire des fichiers, exécuter des commandes terminales, naviguer sur le web et utiliser votre navigateur. C'est l'équivalent open source le plus proche du mode agent complet de Cursor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmnd03117g9cnqchczkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmnd03117g9cnqchczkq.png" alt="Image de l'extension Cline en action dans VS Code" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour&lt;/strong&gt; : les développeurs qui souhaitent des tâches de codage autonomes et multi-étapes gérées de bout en bout dans VS Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installez depuis la marketplace VS Code.&lt;/li&gt;
&lt;li&gt;Ajoutez votre clé API.&lt;/li&gt;
&lt;li&gt;Démarrez une nouvelle tâche.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ce qu'il peut faire :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boucle agentique complète : lecture, écriture, exécution, navigation&lt;/li&gt;
&lt;li&gt;Mode approbation : vous approuvez chaque action avant qu'elle ne s'exécute (ou définissez-la sur auto-approbation)&lt;/li&gt;
&lt;li&gt;Flexibilité du modèle : Claude, GPT-4o, Gemini, Bedrock, Vertex, Ollama local&lt;/li&gt;
&lt;li&gt;Suivi des coûts par tâche (utile lors de l'utilisation de modèles de pointe coûteux)&lt;/li&gt;
&lt;li&gt;Injection de prompt système personnalisé&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt; : peut devenir coûteux avec les modèles de pointe sur des tâches longues car la boucle de l'agent envoie le contexte complet à chaque étape. Surveillez vos coûts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coût&lt;/strong&gt; : gratuit. Payez votre fournisseur de modèle directement.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Modo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que c'est&lt;/strong&gt; : un nouveau projet open source apparu en avril 2026 comme une alternative explicite à Cursor, Kiro et Windsurf. C'est un IDE complet construit sur le cœur de VS Code avec le codage IA intégré.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour&lt;/strong&gt; : les développeurs qui veulent un IDE dédié axé sur l'IA sans abonnement. Encore en phase précoce, mais la trajectoire est prometteuse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/mohshomis/modo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;modo
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ce qu'il peut faire :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compatibilité complète avec l'écosystème d'extensions VS Code&lt;/li&gt;
&lt;li&gt;Chat IA intégré et complétions en ligne&lt;/li&gt;
&lt;li&gt;Indépendant du modèle&lt;/li&gt;
&lt;li&gt;Open source : base de code entièrement auditable et auto-hébergeable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt; : projet plus récent, moins éprouvé que Continue ou Cline. Attendez-vous à des imperfections. Pas encore sur la Marketplace VS Code (installation manuelle requise).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coût&lt;/strong&gt; : gratuit.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Void editor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que c'est&lt;/strong&gt; : un fork open source de VS Code qui ajoute des capacités natives d'IA sans avoir besoin d'extensions. Le projet vise à être le "&lt;a href="https://github.com/voideditor/void" rel="noopener noreferrer"&gt;Cursor open source.&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdpkvyrfe5l015d6t29e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdpkvyrfe5l015d6t29e.png" alt="Image de l'éditeur Void, un fork de VS Code avec des capacités IA" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour&lt;/strong&gt; : les développeurs qui veulent l'expérience utilisateur complète de Cursor sans l'abonnement et sont à l'aise avec un fork plutôt qu'une extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Téléchargez depuis voideditor.com&lt;/li&gt;
&lt;li&gt;Ouvrez votre projet&lt;/li&gt;
&lt;li&gt;Configurez votre modèle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ce qu'il peut faire :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat et indexation de base de code natifs&lt;/li&gt;
&lt;li&gt;Édition de diff en ligne&lt;/li&gt;
&lt;li&gt;Système de points de contrôle (annuler des sessions d'édition IA complètes)&lt;/li&gt;
&lt;li&gt;Support des modèles locaux via Ollama&lt;/li&gt;
&lt;li&gt;Compatibilité complète avec les extensions VS Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt; : les projets basés sur des forks sont en retard par rapport aux mises à jour de VS Code. Certaines extensions peuvent avoir des problèmes de compatibilité.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coût&lt;/strong&gt; : gratuit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tableau comparatif
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Support IDE&lt;/th&gt;
&lt;th&gt;Flexibilité du modèle&lt;/th&gt;
&lt;th&gt;Mode Agent&lt;/th&gt;
&lt;th&gt;Idéal pour&lt;/th&gt;
&lt;th&gt;Coût&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Continue.dev&lt;/td&gt;
&lt;td&gt;VS Code, JetBrains&lt;/td&gt;
&lt;td&gt;Complet (20+ fournisseurs)&lt;/td&gt;
&lt;td&gt;Partiel&lt;/td&gt;
&lt;td&gt;Édition assistée, contrôle du modèle équipe&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Complet&lt;/td&gt;
&lt;td&gt;Complet (agent term)&lt;/td&gt;
&lt;td&gt;Ingénieurs backend, automatisation CI/CD&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Complet (Claude, GPT, local)&lt;/td&gt;
&lt;td&gt;Complet&lt;/td&gt;
&lt;td&gt;Tâches multi-étapes autonomes dans VS Code&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo&lt;/td&gt;
&lt;td&gt;IDE basé sur VS Code&lt;/td&gt;
&lt;td&gt;Complet&lt;/td&gt;
&lt;td&gt;En développement&lt;/td&gt;
&lt;td&gt;IDE axé sur l'IA sans abonnement&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Void editor&lt;/td&gt;
&lt;td&gt;Fork de VS Code&lt;/td&gt;
&lt;td&gt;Complet&lt;/td&gt;
&lt;td&gt;Partiel&lt;/td&gt;
&lt;td&gt;UX similaire à Cursor, open source&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Comment choisir le bon
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vous utilisez VS Code et souhaitez les fonctionnalités de chat de Cursor sans payer&lt;/strong&gt; : commencez par Continue.dev. C'est le plus raffiné et il a la plus grande communauté.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vous êtes un développeur backend qui travaille dans le terminal&lt;/strong&gt; : Aider. Il est conçu spécifiquement pour ce workflow et s'intègre nativement à Git. Voir [internal: how-to-build-tiny-llm-from-scratch] si vous développez également des backends alimentés par l'IA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vous voulez un agent entièrement autonome capable d'exécuter des tâches multi-fichiers de bout en bout&lt;/strong&gt; : Cline. C'est l'agent open source le plus performant et le plus proche du mode agent de Cursor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vous voulez un IDE IA dédié sans extensions&lt;/strong&gt; : essayez Void editor. Surveillez Modo lorsqu'il mûrira.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vous avez besoin d'une confidentialité totale du code (pas d'appels API externes)&lt;/strong&gt; : n'importe lequel de ces outils avec Ollama comme backend de modèle. Qwen2.5-Coder-32B fonctionne bien sur une machine avec 24 Go+ de VRAM et produit un code de qualité production pour la plupart des tâches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vous évaluez pour une équipe&lt;/strong&gt; : Continue.dev et Cline prennent tous deux en charge la configuration partagée via des fichiers de configuration versionnés, ce qui les rend plus faciles à standardiser au sein d'une équipe. Voir [internal: rest-api-best-practices] pour la mise en place de tests API cohérents avec votre configuration de codage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comment Apidog s'intègre aux workflows de codage IA
&lt;/h2&gt;

&lt;p&gt;Les assistants de codage IA génèrent du code rapidement. C'est le but. Ce qu'ils ne font pas, c'est vérifier que les API que le code appelle fonctionnent réellement.&lt;/p&gt;

&lt;p&gt;Lorsque Cline ou Continue.dev vous écrit un client REST, il peut sembler syntaxiquement correct tout en étant sémantiquement erroné. Chemins de points de terminaison incorrects, en-têtes d'authentification manquants, schéma JSON incorrect, gestion uniquement du cas de succès. Ces bugs ne font surface que lorsque vous exécutez le code contre un serveur en direct.&lt;/p&gt;

&lt;p&gt;Les scénarios de test d'Apidog les détectent avant cela. Après qu'un assistant IA ait généré du code client API :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Importez le point de terminaison généré dans Apidog (collez l'URL + méthode, ou importez depuis la spécification OpenAPI du code s'il en génère une)&lt;/li&gt;
&lt;li&gt;Créez un scénario de test qui enchaîne le chemin heureux : authentification, requête principale, assertion sur la structure de la réponse&lt;/li&gt;
&lt;li&gt;Ajoutez des cas négatifs : jeton expiré, corps malformé, réponse de limite de débit&lt;/li&gt;
&lt;li&gt;Utilisez Smart Mock pour simuler l'API tierce si vous n'avez pas d'environnement de staging&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;C'est ainsi que vous obtenez la rapidité de la génération de code IA sans déployer d'intégrations non testées. Les articles [internal: open-source-coding-assistants-2026] et [internal: claude-code] couvrent le côté agent ; Apidog couvre le côté vérification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple concret&lt;/strong&gt; : vous demandez à Cline d'écrire un client API GitHub. Il génère une classe &lt;code&gt;GitHubClient&lt;/code&gt; avec des méthodes pour créer des problèmes, lister des PR et récupérer les métadonnées du dépôt. Dans Apidog :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scenario"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vérification du client API GitHub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Créer un problème"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/repos/{owner}/{repo}/issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer {{token}}"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Problème de test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Créé par le scénario de test"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"assertions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exists"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lister les problèmes (vérifier que le problème créé apparaît)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/repos/{owner}/{repo}/issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"assertions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response[0].number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{steps[0].response.number}}"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cela prend cinq minutes à configurer et permet de détecter les erreurs de génération de code IA les plus courantes : mauvaise méthode HTTP, champs obligatoires manquants, pagination non gérée. Voir [internal: how-ai-agent-memory-works] pour tester les API d'agent avec état, ce qui ajoute une autre couche de complexité.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;L'écosystème des assistants de codage open source est légitimement bon en 2026. Vous n'avez pas besoin d'un abonnement Cursor pour obtenir du codage agentique, un chat conscient de la base de code et des modifications multi-fichiers. Continue.dev, Aider et Cline couvrent chacun des workflows différents, et Modo/Void méritent d'être surveillés.&lt;/p&gt;

&lt;p&gt;La pièce manquante est le test. Le code généré par l'IA est rapide à écrire et facile à mal faire. Associez votre assistant de codage open source à Apidog pour vérifier les intégrations d'API qu'il produit.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Continue.dev est-il aussi bon que Cursor ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pour le chat et les modifications en ligne, c'est proche. Pour les tâches d'agent autonomes (écrire une fonctionnalité complète de bout en bout sans approbation), le mode agent de Cursor est toujours en avance. L'écart se réduit si vous configurez Continue.dev avec Claude 3.5 Sonnet ou GPT-4o.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puis-je utiliser les assistants de codage open source uniquement avec des modèles locaux ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Les cinq outils de cet article prennent en charge Ollama, ce qui vous permet d'exécuter des modèles comme Qwen2.5-Coder, DeepSeek-Coder-V2 ou Code Llama localement. La qualité du code avec les modèles locaux est inférieure à celle des modèles de pointe pour les tâches complexes, mais suffisante pour le code boilerplate et le refactoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment choisir un modèle pour les assistants de codage open source ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claude 3.5 Sonnet gère mieux les tâches complexes et multi-étapes. GPT-4o est fort pour la génération de code et a le meilleur support d'appel de fonctions. DeepSeek-Coder-V2 est le modèle open-weight le plus puissant pour les tâches de code et s'exécute localement. Commencez avec Claude ou GPT-4o si le coût n'est pas un problème ; DeepSeek si vous avez besoin de confidentialité ou de volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aider est-il sûr à utiliser en mode &lt;code&gt;--yes&lt;/code&gt; ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utilisez-le avec prudence. Le mode &lt;code&gt;--yes&lt;/code&gt; approuve automatiquement chaque modification de fichier et chaque commit. Exécutez-le sur une branche, jamais sur &lt;code&gt;main&lt;/code&gt;, et examinez le diff Git avant de fusionner. Il est utile pour les tâches automatisées en CI, mais pas pour le développement interactif où vous souhaitez examiner les modifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que Kiro ? Le post HN le mentionnait aux côtés de Cursor et Windsurf.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Kiro est un IDE IA d'AWS, annoncé en 2025. Il est basé sur VS Code, comme Cursor, mais avec une intégration AWS étroite. Il n'est pas open source. Le README GitHub de Modo le nomme spécifiquement comme l'un des outils qu'il vise à remplacer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Les équipes peuvent-elles partager la configuration de ces outils ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Continue.dev lit à partir de &lt;code&gt;.continue/config.json&lt;/code&gt; à la racine de votre dépôt, qui peut être commité au contrôle de version. Cline stocke les paramètres dans &lt;code&gt;settings.json&lt;/code&gt; de VS Code. Aider lit à partir de &lt;code&gt;.aider.conf.yml&lt;/code&gt;. Les trois peuvent être standardisés au sein d'une équipe avec un fichier de configuration partagé.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ces outils fonctionnent-ils hors ligne ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Avec les modèles locaux via Ollama : oui, entièrement hors ligne. Avec les modèles basés sur API (Claude, GPT-4o) : non, ils nécessitent une connexion Internet. Void editor et Modo peuvent être configurés pour une utilisation hors ligne avec des modèles locaux.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Fonctionnement de la mémoire des agents IA et test via API</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Tue, 07 Apr 2026 08:09:11 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/fonctionnement-de-la-memoire-des-agents-ia-et-test-via-api-6mp</link>
      <guid>https://dev.to/antoine_laurentt/fonctionnement-de-la-memoire-des-agents-ia-et-test-via-api-6mp</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Les agents IA échouent non pas par manque d'intelligence, mais parce qu'ils oublient. Comprendre les quatre types de mémoire des agents, comment elles sont stockées et comment elles affectent le comportement de l'API vous permet de construire des agents plus fiables et de détecter les bugs avant qu'ils n'atteignent la production.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Voici le vilain secret de la plupart des échecs des agents IA : le modèle va bien. C'est la couche de mémoire qui est défectueuse.&lt;/p&gt;

&lt;p&gt;Un agent qui ne se souvient pas de ce qui s'est passé il y a trois tours, qui perd le contexte utilisateur entre les sessions, ou qui se contredit en pleine tâche n'est pas en train d'halluciner à cause de la qualité du modèle. Il échoue parce que l'architecture de la mémoire n'a pas été conçue avec soin ou n'a pas été testée du tout.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kitfunso/hippo-memory" rel="noopener noreferrer"&gt;Hippo&lt;/a&gt;, un système de mémoire d'agent open-source qui a récemment fait le buzz, adopte une approche biologiquement inspirée : il modélise la mémoire à court terme, à long terme et épisodique séparément, de la même manière que la mémoire humaine fonctionne. Ce projet a mis en lumière une lacune réelle : la plupart des développeurs construisent la mémoire des agents comme une réflexion après coup et ne découvrent qu'elle est défectueuse qu'en production.&lt;/p&gt;

&lt;p&gt;💡 Les scénarios de test d'Apidog vous permettent de tester des conversations d'agents avec état et à plusieurs tours avant leur mise en ligne. Vous pouvez vérifier que l'état de la session est transféré entre les appels d'API, affirmer la structure du contexte et simuler des défaillances de mémoire avec Smart Mock. Cette couche de test est le sujet de la seconde moitié de cet article. Pour l'instant, commençons par ce qui se passe réellement à l'intérieur de la mémoire de l'agent. Consultez [internal: api-testing-tutorial] pour une introduction à l'approche de test plus large.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce que la mémoire d'un agent IA ?
&lt;/h2&gt;

&lt;p&gt;La mémoire d'agent est tout mécanisme permettant à un système d'IA d'accéder ou de conserver des informations au-delà de l'entrée actuelle. Sans elle, chaque appel d'API est sans état : le modèle reçoit une invite, renvoie une réponse et ne se souvient de rien.&lt;/p&gt;

&lt;p&gt;Quatre types de mémoire distincts servent des objectifs différents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les quatre types de mémoire d'agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mémoire de travail
&lt;/h3&gt;

&lt;p&gt;La mémoire de travail est le contexte actif de l'agent : tout ce qui se trouve dans l'invite actuelle. Pour la plupart des agents basés sur des LLM, il s'agit de la fenêtre contextuelle. GPT-4o a une fenêtre contextuelle de 128K jetons. Claude 3.5 Sonnet supporte 200K. Gemini 1.5 Pro supporte 1M.&lt;/p&gt;

&lt;p&gt;La mémoire de travail est rapide et précise, mais coûteuse (vous payez par jeton) et limitée. Une fois la limite atteinte, le contexte le plus ancien est discrètement supprimé. C'est la source la plus courante de bugs d'agent dans les tâches de longue durée.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mémoire épisodique
&lt;/h3&gt;

&lt;p&gt;La mémoire épisodique stocke ce qui s'est passé : un journal des interactions, des décisions et des observations passées. Considérez-la comme le journal de l'agent.&lt;/p&gt;

&lt;p&gt;En pratique, il s'agit généralement d'une base de données vectorielle (Chroma, Pinecone, Qdrant) ou d'un journal d'événements structuré. L'agent récupère les épisodes passés pertinents via une recherche sémantique avant de générer une réponse. L'approche d'Hippo stocke les séquences d'interaction avec des horodatages et des poids de dégradation, de sorte que les interactions récentes bénéficient d'une priorité de récupération plus élevée.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mémoire sémantique
&lt;/h3&gt;

&lt;p&gt;La mémoire sémantique stocke ce que l'agent sait : des faits, des connaissances spécifiques au domaine, les préférences de l'utilisateur et des connaissances stables sur le monde. Contrairement à la mémoire épisodique, elle n'est pas ordonnée dans le temps.&lt;/p&gt;

&lt;p&gt;Celle-ci peut être préchargée (une invite système avec des données de profil utilisateur), construite dynamiquement (faits extraits de conversations passées et stockés dans un graphe de connaissances) ou obtenue de sources externes (RAG contre un magasin de documents).&lt;/p&gt;

&lt;h3&gt;
  
  
  Mémoire procédurale
&lt;/h3&gt;

&lt;p&gt;La mémoire procédurale stocke comment faire les choses : des séquences d'actions, des modèles d'utilisation d'outils et des compétences que l'agent a apprises. C'est la plus difficile à construire et elle est souvent ignorée dans les systèmes de production.&lt;/p&gt;

&lt;p&gt;En pratique, elle apparaît sous forme d'exemples "few-shot" intégrés dans l'invite système, ou comme une bibliothèque de plans d'action stockés que l'agent peut récupérer et adapter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment la mémoire est stockée dans les systèmes réels
&lt;/h2&gt;

&lt;p&gt;Les quatre types correspondent rarement proprement à quatre magasins distincts. Les configurations réelles ressemblent davantage à ceci :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fenêtre contextuelle (de travail)&lt;/strong&gt; : tout ce qui se trouve dans l'invite active. Gérée par le framework de l'agent. Expire à la fin de la conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Magasin de vecteurs externe (épisodique + sémantique)&lt;/strong&gt; : Chroma, Pinecone ou Qdrant stocke les embeddings des interactions passées et des blocs de connaissances. L'agent interroge cela à chaque tour et injecte les blocs pertinents dans l'invite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base de données structurée (sémantique + procédurale)&lt;/strong&gt; : PostgreSQL ou SQLite pour les préférences utilisateur, l'état du compte ou les modèles d'actions appris. Interrogée via des appels d'outils.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache en mémoire (débordement de travail)&lt;/strong&gt; : Redis ou un simple dict pour un accès rapide au contexte récent qui n'a pas besoin de recherche d'embedding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hippo modélise spécifiquement son système de mémoire à trois niveaux avec une logique de transfert explicite : les entrées de mémoire de travail qui n'ont pas été accédées récemment sont consolidées en mémoire épisodique, qui est finalement résumée en mémoire sémantique. Cela reflète la façon dont la consolidation de la mémoire humaine fonctionne pendant le sommeil (le projet dispose même d'une commande "sleep" pour déclencher la consolidation).&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment la mémoire d'agent affecte le comportement de l'API
&lt;/h2&gt;

&lt;p&gt;Si vous construisez ou consommez une API d'agent, la mémoire façonne directement l'apparence de vos appels d'API et ce qui peut mal tourner.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ID de session&lt;/strong&gt; : la plupart des API d'agents utilisent un ID de session ou de thread pour corréler la mémoire entre les appels. L'API OpenAI Assistants utilise &lt;code&gt;thread_id&lt;/code&gt;. Un ID de thread abandonné ou réutilisé entraîne la perte de contexte par l'agent ou le mélange des sessions de deux utilisateurs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taille du contexte dans les charges utiles des requêtes&lt;/strong&gt; : les agents qui injectent de la mémoire dans les invites produisent des corps de requête plus volumineux au fil du temps. Une conversation d'agent qui commence à 2 Ko peut atteindre 40 Ko après 20 tours. Si votre client HTTP a une limite de taille de charge utile, les requêtes échouent silencieusement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latence de récupération&lt;/strong&gt; : les recherches dans les magasins de vecteurs ajoutent 50 à 200 ms par tour. Si vous effectuez des assertions sur le temps de réponse de l'API, la récupération de la mémoire est un véritable contributeur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;État incohérent après les échecs&lt;/strong&gt; : si l'appel d'outil d'un agent échoue en cours de tâche, le journal épisodique peut enregistrer une action partielle. Le tour suivant démarre à partir d'un état corrompu. Les bons agents sauvegardent l'état avant et après l'utilisation d'un outil.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comment tester la mémoire d'un agent via API avec Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com/api-testing/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Testez les API d'agents avec état&lt;/a&gt; nécessite plus qu'une simple assertion de requête unique. Vous devez vérifier que le contexte est transféré sur plusieurs appels, que les réponses basées sur la mémoire changent comme prévu, et que le système se dégrade gracieusement lorsque la mémoire est indisponible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby2zl8cisv8zsow7dh97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby2zl8cisv8zsow7dh97.png" alt="image-72.png" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les scénarios de test d'Apidog gèrent précisément cela. Voici comment en configurer un pour une API d'agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 1 : Transfert de contexte
&lt;/h3&gt;

&lt;p&gt;Créez un scénario avec trois étapes séquentielles :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;POST &lt;code&gt;/agent/chat&lt;/code&gt; avec un message introduisant un fait ("Mon projet utilise PostgreSQL 16")&lt;/li&gt;
&lt;li&gt;POST &lt;code&gt;/agent/chat&lt;/code&gt; avec un suivi qui nécessite de rappeler ce fait ("Pour quelle base de données devrais-je optimiser ?")&lt;/li&gt;
&lt;li&gt;Affirmez sur la réponse de l'étape 2 : &lt;code&gt;response.message.content&lt;/code&gt; devrait contenir "PostgreSQL"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si la couche de mémoire de l'agent fonctionne, l'étape 2 récupère le fait de la mémoire épisodique ou sémantique et l'utilise dans la réponse. Sinon, vous obtenez une réponse générique.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 2 : Isolation de session
&lt;/h3&gt;

&lt;p&gt;Exécutez la même séquence en deux étapes deux fois avec des valeurs de &lt;code&gt;session_id&lt;/code&gt; différentes. Affirmez que la réponse de la deuxième session ne contient aucun contexte de la première session. Cela détecte les bugs de mémoire partagée, fréquents dans les déploiements d'agents multi-locataires.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 3 : Dégradation en cas de défaillance de la mémoire
&lt;/h3&gt;

&lt;p&gt;Utilisez Smart Mock d'Apidog pour simuler une défaillance du backend de mémoire. Configurez le mock pour qu'il renvoie un 503 sur le point de terminaison de recherche du magasin de vecteurs. Exécutez ensuite votre conversation d'agent et affirmez que :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'agent répond sans planter&lt;/li&gt;
&lt;li&gt;La réponse inclut une solution de repli gracieuse ("Je n'ai pas assez de contexte pour répondre à cela")&lt;/li&gt;
&lt;li&gt;La session peut reprendre une fois le mock supprimé&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Test 4 : Débordement de la fenêtre contextuelle
&lt;/h3&gt;

&lt;p&gt;Envoyez plus de 30 messages rapides en séquence pour pousser la mémoire de travail au-delà de la limite de contexte. Affirmez que :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'agent ne génère pas d'erreur &lt;code&gt;context_length_exceeded&lt;/code&gt; (il devrait tronquer gracieusement)&lt;/li&gt;
&lt;li&gt;La réponse au 30e tour répond toujours correctement en utilisant la récupération épisodique&lt;/li&gt;
&lt;li&gt;Le nombre de jetons dans &lt;code&gt;response.usage&lt;/code&gt; reste dans la plage attendue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous pouvez exécuter ces quatre tests en un seul scénario de test dans Apidog, en les chaînant séquentiellement avec des variables partagées pour les ID de session et les données de réponse. Consultez [internal: how-to-build-tiny-llm-from-scratch] pour des informations sur la raison pour laquelle les fenêtres contextuelles fonctionnent comme elles le font au niveau du modèle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modes de défaillance courants de la mémoire
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Troncation silencieuse du contexte&lt;/strong&gt; : la fenêtre contextuelle se remplit et les messages plus anciens disparaissent sans avertissement. L'agent répond sur la base d'un historique incomplet. Détectez cela en affirmant sur &lt;code&gt;response.usage.prompt_tokens&lt;/code&gt; et en vérifiant qu'il reste en dessous de la limite de contexte de votre modèle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fuite de session&lt;/strong&gt; : les sessions de deux utilisateurs partagent un espace de noms de mémoire. Détectez cela avec des tests d'isolation de session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mémoire sémantique obsolète&lt;/strong&gt; : des connaissances stockées il y a des semaines contredisent des faits actuels. L'agent donne avec confiance des informations erronées. Détectez cela en incluant une assertion de "date actuelle" dans votre test : si l'agent cite un prix ou un numéro de version, affirmez qu'il correspond à la valeur que vous avez chargée dans le contexte de test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dérive d'embedding&lt;/strong&gt; : les magasins de vecteurs construits avec un modèle d'embedding se cassent lorsque vous passez à un autre. Tous les documents récupérés deviennent sémantiquement erronés. Non directement testable via l'API, mais vous pouvez ajouter une assertion qui vérifie si le contexte récupéré est sémantiquement lié à la requête.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Injection de mémoire / injection d'invite&lt;/strong&gt; : une entrée utilisateur malveillante qui manipule ce qui est stocké et récupéré. Incluez des entrées adverses dans votre suite de tests : stockez une "préférence utilisateur" qui contient une surcharge d'invite système et vérifiez que l'agent l'ignore. Consultez [internal: rest-api-best-practices] pour des conseils plus larges sur les tests de sécurité API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;La mémoire d'agent est la différence entre un assistant qui semble intelligent et un qui semble amnésique. Les quatre types, de travail, épisodique, sémantique et procédurale, ont chacun un rôle distinct. Comprendre comment elles sont stockées et récupérées dans les systèmes réels vous indique exactement où les bugs peuvent se cacher et ce qu'il faut affirmer dans vos tests d'API.&lt;/p&gt;

&lt;p&gt;Des outils comme Hippo montrent que le domaine s'oriente vers une architecture de mémoire basée sur des principes. Quel que soit le système de mémoire sur lequel vous construisez, les scénarios de test d'Apidog vous offrent la couche de test pour vérifier qu'il se comporte comme vous l'attendez, en particulier les cas de défaillance qui n'apparaissent qu'à grande échelle.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quelle est la manière la plus simple d'ajouter de la mémoire à un agent ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
L'approche la plus simple est une fenêtre glissante sur l'historique des conversations : conserver les N derniers tours dans l'invite. Ce n'est pas une mémoire épisodique, mais cela fonctionne pour des tâches courtes. Pour les agents de plus longue durée, ajoutez un magasin de vecteurs et une récupération sémantique.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment l'API OpenAI Assistants gère-t-elle la mémoire ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
L'API Assistants gère un objet thread qui stocke l'historique de la conversation côté serveur. Vous pouvez également attacher des outils de recherche de fichiers et d'interprétation de code qui donnent à l'agent accès à des connaissances externes. La gestion de la mémoire est abstraite, ce qui est pratique mais rend le débogage plus difficile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quelle est la meilleure base de données vectorielles pour la mémoire d'agent ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pour le développement local : Chroma (aucune infrastructure nécessaire). Pour la production : Qdrant ou Pinecone selon que vous ayez besoin d'une solution auto-hébergée ou gérée. La bibliothèque Hippo prend en charge les backends de stockage enfichables. Consultez [internal: claude-code] pour voir comment Claude Code utilise sa propre couche de mémoire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment empêcher les agents d'halluciner sur des interactions passées ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Stockez les journaux d'interaction dans un format structuré avec des métadonnées (horodatage, confiance, source). Lors de la récupération du contexte passé, incluez les métadonnées dans l'invite : "Selon notre conversation du [date], vous avez mentionné X." La citation explicite réduit les hallucinations confiantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puis-je tester la mémoire d'un agent sans agent en cours d'exécution ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Utilisez Smart Mock d'Apidog pour simuler les réponses de l'API de l'agent, y compris celles basées sur la mémoire. Définissez des réponses simulées qui changent en fonction de l'ID de session ou du contenu du corps de la requête. Cela vous permet de tester la gestion du comportement de la mémoire par votre couche frontend ou d'intégration sans avoir d'agent en direct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combien coûte le stockage vectoriel en production ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Le niveau gratuit de Pinecone prend en charge 1 index avec 100K vecteurs. À grande échelle, Pinecone facture environ 0,096 $/heure pour un pod p1.x1 (1M de vecteurs à 768 dimensions). Qdrant auto-hébergé est gratuit. Pour la plupart des agents, le coût le plus important est la génération d'embeddings, pas le stockage. Consultez [internal: what-is-mcp-server] pour savoir comment les intégrations de serveurs MCP interagissent avec les systèmes de mémoire d'agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quelle est la différence entre RAG et la mémoire d'agent ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
RAG (génération augmentée par récupération) récupère des documents pertinents au moment de la requête à partir d'une base de connaissances fixe. La mémoire d'agent est dynamique : elle grandit et change au fur et à mesure que l'agent interagit. Un système RAG répond "que disent les documents à propos de X ?" Un système de mémoire d'agent répond "que sais-je de cet utilisateur et qu'ai-je fait avec lui ?"&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comment Créer un LLM de Zéro : Guide et Enseignements</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Tue, 07 Apr 2026 04:36:53 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/comment-creer-un-llm-de-zero-guide-et-enseignements-1hki</link>
      <guid>https://dev.to/antoine_laurentt/comment-creer-un-llm-de-zero-guide-et-enseignements-1hki</guid>
      <description>&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;p&gt;Construire un modèle de langage minimal à partir de zéro prend moins de 300 lignes de Python. Le processus révèle exactement comment fonctionnent la tokenisation, l'attention et l'inférence, ce qui fait de vous un bien meilleur consommateur d'API lorsque vous intégrez des LLM de production dans vos applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;La plupart des développeurs traitent les modèles de langage comme des boîtes noires. Vous envoyez du texte, des jetons en sortent, et quelque part entre les deux, la magie opère. Ce modèle mental fonctionne bien jusqu'à ce que vous ayez besoin de déboguer une intégration d'API cassée, d'ajuster les paramètres d'échantillonnage, ou de comprendre pourquoi votre modèle continue d'halluciner des données structurées.&lt;/p&gt;

&lt;p&gt;GuppyLM, un projet qui a récemment atteint la première page de HackerNews avec 842 points, rend les mécanismes internes visibles. C'est un transformeur de 8,7 millions de paramètres écrit à partir de zéro en Python. Il s'entraîne en moins d'une heure sur un GPU grand public. Le code tient dans un seul fichier. L'objectif n'est pas de concurrencer GPT-4 ; c'est de démystifier ce que font réellement les LLM.&lt;/p&gt;

&lt;p&gt;Cet article explique comment construire un petit LLM, ce que fait chaque composant et ce que la compréhension de ces mécanismes internes vous apprend lorsque vous travaillez professionnellement avec des API d'IA.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡&lt;br&gt;
Si vous testez des intégrations d'API d'IA, les Scénarios de Test d'Apidog vous permettent de vérifier les réponses en streaming, d'affirmer la structure des jetons et de simuler des complétions de cas limites sans gaspiller vos crédits de production. Plus à ce sujet plus tard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qu'est-ce qui rend un modèle de langage "minuscule" ?
&lt;/h2&gt;

&lt;p&gt;Un LLM de production comme GPT-4 possède des centaines de milliards de paramètres. Un LLM "minuscule" se situe dans la plage de 1M à 25M de paramètres. Des projets comme GuppyLM (8,7M), nanoGPT de Karpathy (124M) et MicroLM (1-2M) entrent tous dans cette catégorie.&lt;/p&gt;

&lt;p&gt;Les LLM minuscules permettent de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S'entraîner sur un ordinateur portable ou Google Colab&lt;/li&gt;
&lt;li&gt;Tenir entièrement en mémoire CPU&lt;/li&gt;
&lt;li&gt;Être inspectés, modifiés et débogués au niveau des poids&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limites :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Incapacité à gérer des raisonnements complexes&lt;/li&gt;
&lt;li&gt;Génération peu fiable de texte long et cohérent&lt;/li&gt;
&lt;li&gt;Moins de profondeur factuelle que les modèles de production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'intérêt principal : comprendre le fonctionnement interne des LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composants clés : comment fonctionne réellement un LLM
&lt;/h2&gt;

&lt;p&gt;Avant d'écrire du code, il faut comprendre les quatre principales parties.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tokeniseur
&lt;/h3&gt;

&lt;p&gt;Le tokeniseur convertit le texte brut en ID entiers. Par exemple, "Bonjour, le monde !" devient quelque chose comme &lt;code&gt;[15496, 11, 995, 0]&lt;/code&gt;. Chaque entier correspond à une unité de sous-mot d'un vocabulaire fixe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact sur les API&lt;/strong&gt; : le nombre de jetons impacte la latence et le coût. Comprendre la découpe du texte par le tokeniseur vous aide à rédiger des prompts qui rentrent dans la fenêtre de contexte et à éviter la troncature.&lt;/p&gt;

&lt;p&gt;GuppyLM utilise un tokeniseur caractère. Les modèles de production (GPT-4, etc.) utilisent le BPE (byte-pair encoding) avec des vocabulaires de 50K-100K jetons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Couche d'intégration (embedding)
&lt;/h3&gt;

&lt;p&gt;La couche d'intégration convertit les ID de jetons en vecteurs denses (par exemple, 384 dimensions dans GuppyLM). Ces vecteurs portent un sens sémantique : les jetons similaires sont proches dans l'espace vectoriel.&lt;/p&gt;

&lt;p&gt;Des intégrations de position sont ajoutées pour que le modèle connaisse l'ordre des jetons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blocs Transformeur
&lt;/h3&gt;

&lt;p&gt;Le cœur du calcul. Chaque bloc a deux parties :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-attention&lt;/strong&gt; : chaque jeton examine tous les autres jetons de la séquence pour décider lesquels sont importants pour prédire le jeton suivant. GuppyLM utilise 6 têtes d'attention sur 6 couches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Réseau feed-forward&lt;/strong&gt; : un MLP à deux couches appliqué à chaque jeton après l'attention. GuppyLM utilise une activation ReLU (plus simple que le SwiGLU des architectures récentes).&lt;/p&gt;

&lt;h3&gt;
  
  
  Tête de sortie
&lt;/h3&gt;

&lt;p&gt;Après le dernier bloc de transformateur, une couche linéaire projette la représentation de chaque jeton vers un vecteur de taille égale au vocabulaire. On applique softmax pour obtenir des probabilités, on choisit le jeton suivant (ou on échantillonne), et on recommence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construire un LLM minimal en Python
&lt;/h2&gt;

&lt;p&gt;Voici un LLM minimal fonctionnel, inspiré de GuppyLM, en PyTorch standard :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn.functional&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;

&lt;span class="c1"&gt;# Hyperparamètres
&lt;/span&gt;&lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;     &lt;span class="c1"&gt;# niveau caractère : un emplacement par caractère ASCII
&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;        &lt;span class="c1"&gt;# dimension d'intégration (embedding)
&lt;/span&gt;&lt;span class="n"&gt;N_HEADS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;          &lt;span class="c1"&gt;# têtes d'attention
&lt;/span&gt;&lt;span class="n"&gt;N_LAYERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;         &lt;span class="c1"&gt;# blocs transformeur
&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;         &lt;span class="c1"&gt;# fenêtre de contexte
&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SelfAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_heads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qkv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
        &lt;span class="n"&gt;qkv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;qkv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qkv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unbind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Masque causal : chaque jeton ne peut faire attention qu'aux jetons précédents
&lt;/span&gt;        &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;
        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;triu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;diagonal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TransformerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SelfAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ReLU&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TinyLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos_embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ModuleList&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="nc"&gt;TransformerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N_HEADS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N_LAYERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
        &lt;span class="n"&gt;tok_emb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pos_emb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pos_embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tok_emb&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pos_emb&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;

&lt;span class="c1"&gt;# Initialiser et compter les paramètres
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TinyLLM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;total_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Taille du modèle : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_params&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; paramètres&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ~1.2M
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Boucle d'entraînement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.optim&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3e-4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AdamW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;epoch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# data: tenseur d'ID de jetons, forme [batch, seq_len+1]
&lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# entrée : tous les jetons sauf le dernier
&lt;/span&gt;        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;    &lt;span class="c1"&gt;# cible : tous les jetons décalés de 1
&lt;/span&gt;        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cross_entropy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zero_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;epoch&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Époque &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;epoch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, perte : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inférence (génération de texte)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@torch.no_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;prompt_ids&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;idx_cond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;  &lt;span class="c1"&gt;# rogner à la fenêtre de contexte
&lt;/span&gt;        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx_cond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;  &lt;span class="c1"&gt;# dernier jeton seulement
&lt;/span&gt;        &lt;span class="c1"&gt;# échantillonnage top-k
&lt;/span&gt;        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;next_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multinomial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;probs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_samples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ce que cela vous apprend sur le comportement des API d'IA
&lt;/h2&gt;

&lt;p&gt;Construire un LLM vous rend plus efficace avec les API d'IA. Voici les enseignements essentiels :&lt;/p&gt;

&lt;h3&gt;
  
  
  La température et l'échantillonnage sont des mécaniques
&lt;/h3&gt;

&lt;p&gt;La température divise les logits avant softmax. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Température élevée = plus aléatoire&lt;/li&gt;
&lt;li&gt;Température basse = plus déterministe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec &lt;code&gt;temperature=0.0&lt;/code&gt;, la plupart des API planchent la valeur pour éviter les sorties dégénérées. Si vos résultats sont inconsistants à température zéro, ce n'est pas un bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les fenêtres de contexte sont des limites strictes
&lt;/h3&gt;

&lt;p&gt;La ligne &lt;code&gt;idx_cond = ids[:, -SEQ_LEN:]&lt;/code&gt; dans l'inférence montre la réalité : les jetons hors contexte sont supprimés. Votre API n'a plus l'historique complet au bout d'un moment. Voir [internal: how-ai-agent-memory-works] pour plus de détails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le streaming de jetons = étapes d'inférence visibles
&lt;/h3&gt;

&lt;p&gt;Les API de streaming exécutent la boucle d'inférence et transmettent chaque jeton au flux en temps réel. Si le flux est interrompu, il faut recommencer : impossible de reprendre une génération coupée.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les logits expliquent la difficulté de la sortie structurée
&lt;/h3&gt;

&lt;p&gt;À chaque étape, le modèle attribue une probabilité à chaque jeton. Générer un JSON valide exige que chaque jeton correct soit sélectionné à chaque position. Des bibliothèques comme Outlines et Guidance contraignent la distribution pour garantir la grammaire. Les modes de "sortie structurée" des API font exactement cela en interne.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment tester les intégrations d'API d'IA avec Apidog
&lt;/h2&gt;

&lt;p&gt;Avec une compréhension claire de l'inférence LLM, vous pouvez écrire de meilleurs tests d'API.&lt;/p&gt;

&lt;p&gt;Les scénarios de test d'&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; permettent de chaîner les appels API et d'affirmer la structure des réponses IA.&lt;/p&gt;

&lt;p&gt;Exemple pour tester une API de chat en streaming :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Créez un scénario de test dans Apidog avec le point de terminaison &lt;code&gt;/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Définissez des assertions sur la réponse : &lt;code&gt;response.choices[0].finish_reason == "stop"&lt;/code&gt;, &lt;code&gt;response.usage.total_tokens &amp;lt; 4096&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ajoutez une étape pour envoyer la réponse comme contexte au tour suivant (multi-tours)&lt;/li&gt;
&lt;li&gt;Utilisez Smart Mock d'Apidog pour simuler des cas d'erreur : &lt;code&gt;finish_reason: "length"&lt;/code&gt; (sortie tronquée), &lt;code&gt;finish_reason: "content_filter"&lt;/code&gt;, ou un timeout réseau en cours de flux&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cela permet de tester les intégrations IA sans consommer de crédits API à chaque CI. Consultez [internal: api-testing-tutorial] pour un aperçu plus large des stratégies de test API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test des assertions de nombre de jetons
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assertions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.usage.completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"less_than"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.choices[0].finish_reason"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.choices[0].message.content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_empty"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exécutez ce scénario sur plusieurs modèles (GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro) pour détecter les différences de schéma avant la mise en production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avancé : Quantification et optimisation de l'inférence
&lt;/h2&gt;

&lt;p&gt;Lorsque votre LLM minimal fonctionne, deux optimisations sont à connaître :&lt;/p&gt;

&lt;h3&gt;
  
  
  Quantification
&lt;/h3&gt;

&lt;p&gt;Les poids sont en float32 par défaut. La quantification réduit à INT8 ou INT4, divisant la mémoire utilisée par 4 à 8 avec une perte de précision modérée.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Quantification INT8 dynamique dans PyTorch
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.quantization&lt;/span&gt;
&lt;span class="n"&gt;quantized_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize_dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qint8&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les API de production servent des modèles quantifiés. Une différence de qualité entre versions de modèle peut venir de la quantification.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache KV
&lt;/h3&gt;

&lt;p&gt;Dans la boucle d'inférence ci-dessus, l'attention est recalculée sur toute la séquence à chaque étape. En production, les clés/valeurs des jetons précédents sont mises en cache (cache KV) : chaque nouveau jeton ne nécessite que le calcul d'attention du dernier token. C'est pourquoi le premier jeton d'une réponse en streaming est plus lent que les suivants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Petit LLM vs. API de production : quand utiliser lequel
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cas d'utilisation&lt;/th&gt;
&lt;th&gt;Petit LLM&lt;/th&gt;
&lt;th&gt;API de production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apprendre le fonctionnement interne&lt;/td&gt;
&lt;td&gt;Idéal&lt;/td&gt;
&lt;td&gt;Exagéré&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototypage d'une nouvelle application&lt;/td&gt;
&lt;td&gt;Qualité insuffisante&lt;/td&gt;
&lt;td&gt;Idéal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Données privées/sensibles&lt;/td&gt;
&lt;td&gt;Bonne option&lt;/td&gt;
&lt;td&gt;Dépend du fournisseur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Déploiement hors ligne/en périphérie&lt;/td&gt;
&lt;td&gt;Viable&lt;/td&gt;
&lt;td&gt;Non possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût-sensible, gros volume&lt;/td&gt;
&lt;td&gt;Possible avec compromis&lt;/td&gt;
&lt;td&gt;Coûteux à grande échelle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raisonnement complexe requis&lt;/td&gt;
&lt;td&gt;Non viable&lt;/td&gt;
&lt;td&gt;Requis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La plupart du temps : utilisez l'API de production, mais exécutez un petit LLM pour comprendre ce qui se passe sous le capot. Les deux approches sont complémentaires. Consultez [internal: open-source-coding-assistants-2026] pour explorer les assistants open source "apportez votre propre modèle".&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Construire un petit LLM à partir de zéro prend un week-end. Ce n'est pas un système de production, mais vous comprendrez vraiment comment fonctionnent tous les LLM, de GuppyLM à GPT-4o. Cette compréhension est précieuse pour déboguer, ajuster les paramètres d'échantillonnage, ou écrire des assertions pour vos tests d'API IA.&lt;/p&gt;

&lt;p&gt;GuppyLM est un excellent point de départ : clonez-le, entraînez-le sur un dataset textuel, et plongez dans la boucle d'inférence. Ensuite, vos intégrations d'API de production ne vous paraîtront plus jamais opaques.&lt;/p&gt;

&lt;p&gt;Testez vos intégrations d'API d'IA avec les Scénarios de Test d'&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; pour la même rigueur que pour tout autre backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Combien de paramètres un "petit" LLM a-t-il besoin pour générer du texte cohérent ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Environ 10M-50M de paramètres avec un jeu de données d'entraînement décent permettent des phrases localement cohérentes. En dessous de 1M, c'est souvent du charabia. GuppyLM (8,7M) fonctionne pour des conversations courtes sur son domaine d'entraînement (60 sujets).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puis-je exécuter un petit LLM sans GPU ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oui. Les modèles &amp;lt;100M de paramètres fonctionnent sur CPU, plus lentement. Le modèle ci-dessus (1,2M) génère des jetons en millisecondes sur un CPU d'ordinateur portable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quel jeu de données utiliser pour l'entraînement ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les modèles caractère fonctionnent bien avec le Projet Gutenberg, des sous-ensembles Wikipédia ou tout corpus texte brut. GuppyLM utilise un dataset de conversations (60K entrées, HuggingFace : &lt;code&gt;arman-bd/guppylm-60k-generic&lt;/code&gt;). Pour du code, utilisez The Stack ou CodeParrot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Différence entre température et top-k ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La température module la distribution des logits (aléatoire globale). Top-k restreint l'échantillonnage aux k jetons les plus probables avant d'appliquer la température. On applique d'abord top-k, puis la température.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi mon LLM se répète-t-il parfois ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La répétition vient du modèle qui donne une forte proba aux jetons récemment générés. Les API de production appliquent des pénalités de répétition (&lt;code&gt;repetition_penalty=1.1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temps d'entraînement d'un petit LLM ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le modèle ci-dessus s'entraîne en moins de 2h sur un GPU (RTX 3060 ou équivalent). GuppyLM : similaire dans Colab. Les modèles plus gros (&amp;gt;100M) nécessitent multi-GPU et plusieurs jours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passer à un endpoint API ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exportez au format GGUF via llama.cpp, puis servez-le avec llama-server pour un endpoint API compatible OpenAI local. Pointez Apidog dessus pour les tests ([internal: rest-api-best-practices]).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment les LLM de production gèrent-ils un contexte plus long que leur fenêtre ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Techniques : RoPE (Rotary Position Embedding) avec mise à l'échelle, attention glissante, RAG. L'architecture de base reste un transformeur ; ce sont des modifications sur l'encodage de position et la fenêtre d'attention.&lt;/p&gt;




&lt;p&gt;Images, vidéos, et liens originaux conservés.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Comment Utiliser l'API Seedance 2.0 en 2026</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Sat, 04 Apr 2026 13:07:24 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/comment-utiliser-lapi-seedance-20-en-2026-1e9f</link>
      <guid>https://dev.to/antoine_laurentt/comment-utiliser-lapi-seedance-20-en-2026-1e9f</guid>
      <description>&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;p&gt;L'API Seedance 2.0 a été lancée le 2 avril 2026 via Volcengine Ark. Vous soumettez une tâche de génération de vidéo avec une requête POST, puis interrogez un point de terminaison GET jusqu'à ce que le statut atteigne "succeeded" (réussi). L'API prend en charge le texte-vers-vidéo, l'image-vers-vidéo, le contrôle de la première et de la dernière image, les références multimodales et la génération audio native. Une vidéo de 1080p de 5 secondes coûte environ 0,93 $. Téléchargez la vidéo dans les 24 heures. L'URL expire après cela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://hypereal.cloud" rel="noopener noreferrer"&gt;Hypereal AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9no1b7kwev33vq2bcepw.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;Essayer Hypereal AI&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Le 2 avril 2026, la plateforme Volcengine Ark de ByteDance a publié l'API officielle Seedance 2.0. Avant cette date, la génération de vidéos Seedance 2.0 se faisait uniquement via la console web. Les tutoriels web existants concernaient l'interface utilisateur. Ce guide détaille l'usage direct de l'API pour l'intégration développeur.&lt;/p&gt;

&lt;p&gt;💡 L'API applique un modèle de tâche asynchrone : POST pour créer, ID de tâche reçu, puis interrogation GET jusqu'à complétion. Testez ce workflow de bout en bout avant la mise en production. Les scénarios de test Apidog permettent d’enchaîner la soumission POST, d’extraire l’ID de tâche, de boucler l’interrogation GET et de vérifier la présence d’une URL vidéo valide. Utilisez Apidog pour suivre les étapes pratiques décrites plus bas.&lt;/p&gt;

&lt;p&gt;Cet article couvre chaque type d'entrée, le calcul du coût à partir du nombre de jetons et la gestion des erreurs courantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce que Seedance 2.0 ?
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 est un modèle de génération vidéo de ByteDance fonctionnant sur Volcengine Ark avec les IDs :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt; (standard)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt; (rapide, qualité inférieure)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nouveautés par rapport à la version 1.5 :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contrôle de la première et dernière image&lt;/li&gt;
&lt;li&gt;Références multimodales (images, clips vidéo, fichiers audio dans une même requête)&lt;/li&gt;
&lt;li&gt;Génération audio native (dialogues, SFX, musique, ambiance)&lt;/li&gt;
&lt;li&gt;Synchronisation labiale multilingue (8+ langues)&lt;/li&gt;
&lt;li&gt;Contrôle du mouvement caméra par prompts&lt;/li&gt;
&lt;li&gt;Jusqu’à 15 secondes, résolution jusqu’à 2K&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Production en 24 ips, ratios de 1:1 à 21:9. Choisissez la résolution lors de la requête.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qui a changé : guide vs API officielle
&lt;/h2&gt;

&lt;p&gt;Les anciens guides Seedance 2.0 (par exemple &lt;a href="http://apidog.com/blog/how-to-use-seedance-2-0/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ce guide de février 2026&lt;/a&gt;) expliquaient la console web, sans API. Maintenant, vous pouvez :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Appeler l’API depuis n’importe quel langage&lt;/li&gt;
&lt;li&gt;Automatiser la génération vidéo&lt;/li&gt;
&lt;li&gt;Intégrer Seedance dans vos produits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce guide est la référence pour tout usage développeur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prérequis
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Créez un compte Volcengine sur &lt;a href="https://www.volcengine.com/" rel="noopener noreferrer"&gt;volcengine.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Accédez à la console Ark :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Générez une clé API et exportez-la :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-api-key-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Utilisez la clé dans l’en-tête Bearer :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;   Authorization: Bearer YOUR_ARK_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Les nouveaux comptes reçoivent des crédits gratuits (environ 8 générations complètes de 15s en 1080p).&lt;/p&gt;

&lt;h2&gt;
  
  
  Texte-vers-vidéo : votre première requête
&lt;/h2&gt;

&lt;p&gt;L’URL de base API :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ark.cn-beijing.volces.com/api/v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Soumission POST vers &lt;code&gt;/v1/contents/generations/tasks&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemple cURL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ARK_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "doubao-seedance-2-0-260128",
    "content": [
      {
        "type": "text",
        "text": "A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic"
      }
    ],
    "resolution": "1080p",
    "ratio": "16:9",
    "duration": 5,
    "watermark": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Réponse immédiate avec ID de tâche :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cgt-2025xxxxxxxx-xxxx"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemple Python (SDK officiel)
&lt;/h3&gt;

&lt;p&gt;Installez le SDK :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;volcenginesdkarkruntime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Soumettez une tâche :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stockez l’ID de tâche pour l’interrogation suivante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le modèle de tâche asynchrone : soumettre, interroger, télécharger
&lt;/h2&gt;

&lt;p&gt;La génération n’est pas instantanée (60 à 120s pour 5s en 1080p). Cycle de vie :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;queued -&amp;gt; running -&amp;gt; succeeded
                 -&amp;gt; failed
                 -&amp;gt; expired
                 -&amp;gt; cancelled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interrogez le point de terminaison GET jusqu’à obtention de &lt;code&gt;succeeded&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Boucle d’interrogation Python complète
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Étape 1 : soumettre
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Aerial shot of a mountain lake at sunrise, slow dolly forward&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tâche soumise : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Étape 2 : interrogation avec backoff exponentiel
&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Statut : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;URL de la vidéo : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expired&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancelled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tâche terminée avec le statut : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# max 60s
&lt;/span&gt;
&lt;span class="c1"&gt;# Étape 3 : télécharger immédiatement
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Téléchargé : output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le backoff exponentiel évite de surcharger l’API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Image-vers-vidéo (I2V) : animer une image fixe
&lt;/h2&gt;

&lt;p&gt;Pour animer une image, ajoutez un objet &lt;code&gt;image_url&lt;/code&gt; au tableau &lt;code&gt;content&lt;/code&gt; avec votre texte. L’image devient la première image de la vidéo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The woman slowly turns her head and smiles at the camera&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/portrait.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Définir &lt;code&gt;ratio&lt;/code&gt; à &lt;code&gt;"adaptive"&lt;/code&gt; pour utiliser le ratio natif de l’image. Max 30 Mo/image, jusqu’à 9 images/requête.&lt;/p&gt;

&lt;h2&gt;
  
  
  Première et dernière image : contrôle des points de début et de fin
&lt;/h2&gt;

&lt;p&gt;Vous pouvez fournir la première et la dernière image + une invite textuelle pour générer le mouvement intermédiaire.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The flower blooms from bud to full open, macro lens, soft light&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-bud.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-open.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Incluez les deux images dans l’ordre : première image, puis dernière image. Utilisez &lt;code&gt;return_last_frame: true&lt;/code&gt; pour chaîner plusieurs clips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Référence multimodale : combiner images, vidéo et audio
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 accepte images, vidéos et audio en entrée.&lt;/p&gt;

&lt;p&gt;Types de contenu possibles :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{"type": "text", ...}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "image_url", ...}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "video_url", ...}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "audio_url", ...}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limites :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jusqu’à 9 images (30 Mo chacune)&lt;/li&gt;
&lt;li&gt;3 clips vidéo (2-15s, 50 Mo chacun)&lt;/li&gt;
&lt;li&gt;3 fichiers audio (MP3, 15 Mo chacun)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Match the visual style of the reference clip and add the provided background audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/style-reference.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/motion-reference.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/background-music.mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inclure une référence vidéo réduit le coût (voir section prix).&lt;/p&gt;

&lt;h2&gt;
  
  
  Génération audio native
&lt;/h2&gt;

&lt;p&gt;Activez &lt;code&gt;generate_audio: true&lt;/code&gt; pour générer l’audio en même temps que la vidéo (dialogues, bruitages, musique, ambiance).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A street musician plays guitar outside a cafe in Paris, crowds passing by, city sounds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generate_audio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La génération audio augmente légèrement la consommation de jetons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contrôler la résolution, le rapport d’aspect et la durée
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resolution&lt;/strong&gt; : &lt;code&gt;"480p"&lt;/code&gt;, &lt;code&gt;"720p"&lt;/code&gt;, &lt;code&gt;"1080p"&lt;/code&gt;, &lt;code&gt;"2K"&lt;/code&gt; (défaut : &lt;code&gt;"1080p"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ratio&lt;/strong&gt; : &lt;code&gt;"16:9"&lt;/code&gt;, &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"21:9"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"adaptive"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duration&lt;/strong&gt; : entier de 4 à 15 (secondes, défaut : 5)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le modèle rapide (&lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt;) est utile pour le prototypage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cas d'usage Seedance 2.0&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Génération audio-vidéo native&lt;/li&gt;
&lt;li&gt;Contrôle images début/fin&lt;/li&gt;
&lt;li&gt;Références multimodales&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lire le coût de la réponse
&lt;/h2&gt;

&lt;p&gt;Une fois la tâche réussie, le champ &lt;code&gt;usage&lt;/code&gt; indique la consommation de jetons :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Références :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1080p, 15s ≈ 308 880 jetons&lt;/li&gt;
&lt;li&gt;1080p, 5s ≈ 102 960 jetons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tarifs :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;T2V/I2V 1080p : 46 yuans/Mjetons (~6,40 $)&lt;/li&gt;
&lt;li&gt;V2V : 28 yuans/Mjetons (~3,90 $)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calculez le coût : &lt;code&gt;completion_tokens&lt;/code&gt; × tarif unitaire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important : téléchargez la vidéo dans les 24 heures
&lt;/h2&gt;

&lt;p&gt;Le &lt;code&gt;video_url&lt;/code&gt; expire après 24h. Après expiration : erreur 403, fichier supprimé. Téléchargez immédiatement à la complétion. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;execution_expires_after&lt;/code&gt; donne la durée d’enregistrement de la tâche (172800s = 48h), mais l’URL vidéo = 24h max.&lt;/li&gt;
&lt;li&gt;Historique des tâches limité à 7 jours.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comment tester l'API Seedance avec Apidog
&lt;/h2&gt;

&lt;p&gt;Le modèle asynchrone requiert plusieurs appels dépendants. Apidog permet de chaîner ces étapes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7qpzpmtge0bkzzppks6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7qpzpmtge0bkzzppks6.png" alt="Apidog test scenario"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 1 : Créer un scénario de test&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dans Apidog, module Tests → nouveau scénario "Génération de vidéo Seedance 2.0"&lt;/li&gt;
&lt;li&gt;Définissez la variable d’environnement &lt;code&gt;ARK_API_KEY&lt;/code&gt; dans les paramètres&lt;/li&gt;
&lt;li&gt;Utilisez &lt;code&gt;{{ARK_API_KEY}}&lt;/code&gt; dans les requêtes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 2 : Requête de soumission&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajoutez une requête POST vers &lt;code&gt;https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header Authorization : &lt;code&gt;Bearer {{ARK_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Corps JSON avec &lt;code&gt;model&lt;/code&gt; et &lt;code&gt;content&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ajoutez un extracteur JSONPath &lt;code&gt;$.id&lt;/code&gt; vers une variable &lt;code&gt;TASK_ID&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 3 : Processeur d'attente&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajoutez un délai de 30s après l’extraction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 4 : Requête d’interrogation en boucle For&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajoutez un bloc For (max 20 itérations) :

&lt;ol&gt;
&lt;li&gt;GET sur &lt;code&gt;https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{{TASK_ID}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Attente 10s&lt;/li&gt;
&lt;li&gt;Condition de sortie : &lt;code&gt;$.status == "succeeded"&lt;/code&gt; ou &lt;code&gt;$.status == "failed"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 5 : Assertions&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vérifiez que &lt;code&gt;$.status == "succeeded"&lt;/code&gt; et que &lt;code&gt;$.content.video_url&lt;/code&gt; n’est pas vide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exécutez le scénario pour obtenir un rapport détaillé de chaque étape. Vous pouvez importer les endpoints Seedance directement depuis une commande cURL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Détail des prix : combien coûte une vidéo de 10 secondes
&lt;/h2&gt;

&lt;p&gt;La tarification est purement à la consommation de jetons.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de tâche&lt;/th&gt;
&lt;th&gt;Tarif (pour 1M de jetons)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T2V / I2V en 1080p&lt;/td&gt;
&lt;td&gt;46 yuans (~6,40 $)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2V (entrée vidéo)&lt;/td&gt;
&lt;td&gt;28 yuans (~3,90 $)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Coûts typiques en 1080p :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Durée&lt;/th&gt;
&lt;th&gt;Jetons approx.&lt;/th&gt;
&lt;th&gt;Coût (T2V/I2V)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5 secondes&lt;/td&gt;
&lt;td&gt;~103,000&lt;/td&gt;
&lt;td&gt;~0,66 yuan / ~0,93 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 secondes&lt;/td&gt;
&lt;td&gt;~206,000&lt;/td&gt;
&lt;td&gt;~9,48 yuans / ~1,32 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 secondes&lt;/td&gt;
&lt;td&gt;~309,000&lt;/td&gt;
&lt;td&gt;~14,21 yuans / ~1,97 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Les crédits d’essai couvrent ≈8 générations complètes de 15s. Pour réduire le coût, commencez en 720p ou 480p.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erreurs courantes et solutions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;429 Trop de requêtes&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limite de concurrence atteinte (trop de tâches en parallèle). Implémentez un backoff exponentiel (départ 10s, doublez jusqu’à 60s max).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Statut "failed"&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invite non conforme, image corrompue/trop grande, paramètres invalides. Vérifiez et resoumettez.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Statut "expired"&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tâche trop longtemps en file d’attente. Resoumettez, pas de redémarrage possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;403 sur video_url&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L’URL a expiré (24h dépassées). Fichier supprimé. Régénérez avec les mêmes paramètres/seed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reproductibilité avec seed&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passez la valeur &lt;code&gt;seed&lt;/code&gt; pour tenter de reproduire une vidéo identique.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;L’API Seedance 2.0 permet une génération vidéo avancée, automatisable et multimodale. Modèle asynchrone simple : POST, interrogation GET, téléchargement immédiat. Les tests automatisés avec Apidog garantissent la robustesse de vos workflows avant déploiement réel.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q : Quelle est la différence entre doubao-seedance-2-0-260128 et doubao-seedance-2-0-fast-260128 ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Le modèle standard offre une meilleure qualité pour la production. Le modèle rapide est utile pour le prototypage, mais la qualité visuelle est inférieure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Puis-je utiliser Seedance 2.0 en dehors de la Chine ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, même si l’API est hébergée à Pékin (latence accrue possible). Vérifiez les conditions Volcengine selon votre compte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Comment enchaîner plusieurs clips pour une vidéo longue ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Activez &lt;code&gt;return_last_frame: true&lt;/code&gt; pour chaque génération. Passez la dernière image comme première image du clip suivant. Assemblez les vidéos en post-production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : La génération audio native coûte-t-elle plus cher ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, légèrement, car la génération audio-vidéo conjointe consomme plus de jetons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Peut-on recevoir un webhook au lieu d’interroger ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, ajoutez &lt;code&gt;callback_url&lt;/code&gt; lors de la soumission. L’API POSTera le résultat à cette URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Que se passe-t-il si je dépasse la limite de 9 images ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Erreur 400 (validation). Réduisez à 9 images ou moins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Le paramètre &lt;code&gt;seed&lt;/code&gt; garantit-il une reproduction exacte ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pas à 100 %, mais la sortie sera très proche, sauf changement de version serveur ou de paramètres.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Comment suivre les dépenses sur plusieurs tâches ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Lisez &lt;code&gt;completion_tokens&lt;/code&gt; dans chaque réponse, multipliez par le tarif, stockez dans une base de données. Pas de dashboard intégré : implémentez votre suivi dès le début.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comment utiliser l'API Grok de texte en vidéo : le guide complet</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:49:32 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/comment-utiliser-lapi-grok-de-texte-en-video-le-guide-complet-2knb</link>
      <guid>https://dev.to/antoine_laurentt/comment-utiliser-lapi-grok-de-texte-en-video-le-guide-complet-2knb</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;L'API Grok de conversion texte-vidéo permet de générer des vidéos à partir d'une invite textuelle. Appelez &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; pour recevoir immédiatement un &lt;code&gt;request_id&lt;/code&gt;, puis interrogez &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; jusqu'à ce que le statut soit &lt;code&gt;"done"&lt;/code&gt;. Le modèle utilisé est &lt;code&gt;grok-imagine-video&lt;/code&gt;, la tarification commence à 0,05 $ par seconde en 480p. Le SDK Python xAI gère l'interrogation automatiquement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;xAI a généré 1,2 milliard de vidéos en janvier 2026, le mois suivant le lancement de l'API Grok texte-vidéo (28 janvier 2026). Le modèle s'est classé numéro un sur le classement texte-vidéo d'Artificial Analysis ce même mois, preuve de la robustesse de l'infrastructure à grande échelle.&lt;/p&gt;

&lt;p&gt;Ce guide vous détaille chaque étape d'intégration : première requête, interrogation, réglage des paramètres, rédaction d'invites efficaces, utilisation d'images de référence, extension/édition de vidéos existantes, et choix du mode texte-vidéo. Vous apprendrez aussi à tester sans consommer de crédits grâce à Apidog Smart Mock.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 L'API fonctionne en mode asynchrone : votre frontend ne peut pas attendre que la vidéo soit prête pour afficher du contenu. Pour développer une interface utilisateur de génération vidéo sans dépenser de crédits à chaque test, simulez les points de terminaison de génération et d'interrogation avec Smart Mock d'Apidog. Votre équipe frontend peut avancer pendant que le backend se construit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qu'est-ce que l'API Grok de conversion texte-vidéo ?
&lt;/h2&gt;

&lt;p&gt;L'API Grok texte-vidéo fait partie de la suite xAI (&lt;a href="https://api.x.ai" rel="noopener noreferrer"&gt;https://api.x.ai&lt;/a&gt;). Envoyez une invite textuelle, le modèle &lt;code&gt;grok-imagine-video&lt;/code&gt; génère un clip vidéo à partir de zéro, aucune image source requise.&lt;/p&gt;

&lt;p&gt;Elle complète un endpoint de génération d'images synchrone (&lt;code&gt;POST /v1/images/generations&lt;/code&gt;, modèle &lt;code&gt;grok-imagine-image&lt;/code&gt;, 0,02 $/image) et propose aussi des endpoints d’extension et d’édition vidéo.&lt;/p&gt;

&lt;p&gt;Différence clé avec image-vidéo : le texte-vidéo ne prend que des mots, créant entièrement la scène et l’animation. Si vous souhaitez animer une image source, voir le &lt;a href="http://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guide de l'API Grok image-vidéo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonctionnement : génération texte-vidéo asynchrone
&lt;/h2&gt;

&lt;p&gt;Le flux d’appel est asynchrone (idéal pour les tâches longues) :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Envoyez une requête POST avec votre invite.&lt;/li&gt;
&lt;li&gt;L’API retourne immédiatement un &lt;code&gt;request_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La vidéo est générée côté xAI.&lt;/li&gt;
&lt;li&gt;Interrogez le endpoint GET avec ce &lt;code&gt;request_id&lt;/code&gt; à intervalle régulier.&lt;/li&gt;
&lt;li&gt;Quand le statut devient &lt;code&gt;"done"&lt;/code&gt;, l’URL vidéo est disponible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ce modèle est standard pour les API génératives multimédia. Votre frontend doit donc afficher un indicateur de chargement jusqu’à réception de l’URL vidéo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prérequis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compte xAI&lt;/strong&gt; : &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clé API&lt;/strong&gt; : Créez-la dans la console xAI, copiez-la et passez-la dans l’en-tête Authorization de chaque requête.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple d’utilisation comme variable d’environnement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"votre_clé_api_ici"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Facultatif : installez le SDK Python xAI pour accélérer l’intégration :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.png" alt="Une capture d'écran de l'interface de la console xAI montrant la création d'une clé API."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Votre première requête texte-vidéo
&lt;/h2&gt;

&lt;p&gt;Endpoint : &lt;code&gt;POST https://api.x.ai/v1/videos/generations&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Champs obligatoires : &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;prompt&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilisation de curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "Un golden retriever courant à travers les feuilles d'&lt;/span&gt;automne au ralenti, éclairage cinématographique&lt;span class="s2"&gt;"
  }'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Réponse immédiate :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilisation de Python (requests)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Un golden retriever courant à travers les feuilles d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;automne au ralenti, éclairage cinématographique&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Génération démarrée. ID de requête : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Interroger pour le résultat vidéo
&lt;/h2&gt;

&lt;p&gt;Une fois le &lt;code&gt;request_id&lt;/code&gt; obtenu, interrogez &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; jusqu’à ce que &lt;code&gt;status&lt;/code&gt; soit &lt;code&gt;"done"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Statuts possibles :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"processing"&lt;/code&gt; : génération en cours&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"done"&lt;/code&gt; : vidéo prête (URL dans la réponse)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"failed"&lt;/code&gt; : erreur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Boucle d’interrogation Python :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tentative &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: statut=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, progression=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La génération vidéo a échoué : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vidéo non prête après &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tentatives&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID de requête : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vidéo prête : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;video_url&lt;/span&gt;

&lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Un timelapse d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;une skyline de ville au coucher du soleil passant à la nuit, vue aérienne&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Réponse d’interrogation terminée :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilisation du SDK Python xAI
&lt;/h2&gt;

&lt;p&gt;Le SDK xAI gère l’interrogation et attend que la vidéo soit prête :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Un golden retriever courant à travers les feuilles d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;automne au ralenti&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;URL de la vidéo : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Durée : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilisez le SDK pour accélérer l’intégration. Passez à l’approche &lt;code&gt;requests&lt;/code&gt; pour un contrôle fin sur la logique d’interrogation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rédiger des invites efficaces pour la génération vidéo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Description de la scène&lt;/strong&gt; : Soyez précis sur le sujet et l’environnement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mouvement&lt;/strong&gt; : Décrivez ce qui bouge et comment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style de caméra&lt;/strong&gt; : Utilisez des termes de cinéma ("gros plan", "dolly zoom", etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Éclairage et ambiance&lt;/strong&gt; : Spécifiez l’ambiance ("heure dorée", "lumière studio").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Références de style&lt;/strong&gt; : Citez un style ("anime", "cinématique", etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Structure recommandée :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Un astronaute solitaire flotte devant la Station Spatiale Internationale,
la ligne de vie flottant derrière lui. La caméra suit lentement
à ses côtés, montrant la Terre en dessous. Cinématique, qualité IMAX,
lumière chaude du lever du soleil se reflétant sur la visière.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contrôle des paramètres : résolution, durée, rapport d’aspect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Durée&lt;/strong&gt; : 1 à 15 secondes (&lt;code&gt;"duration": 10&lt;/code&gt;). Par défaut : 6s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Résolution&lt;/strong&gt; : &lt;code&gt;"480p"&lt;/code&gt; (par défaut) ou &lt;code&gt;"720p"&lt;/code&gt; ; 480p pour le prototypage, 720p pour la prod.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspect ratio&lt;/strong&gt; : &lt;code&gt;"16:9"&lt;/code&gt;, &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"3:2"&lt;/code&gt;, &lt;code&gt;"2:3"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rapport&lt;/th&gt;
&lt;th&gt;Idéal pour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16:9&lt;/td&gt;
&lt;td&gt;Bureau, YouTube, présentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9:16&lt;/td&gt;
&lt;td&gt;TikTok, Instagram Reels, mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:1&lt;/td&gt;
&lt;td&gt;Fil Instagram, cartes sociales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:3&lt;/td&gt;
&lt;td&gt;Vidéo classique, présentations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:4&lt;/td&gt;
&lt;td&gt;Contenu mobile portrait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:2&lt;/td&gt;
&lt;td&gt;Rapport photo standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:3&lt;/td&gt;
&lt;td&gt;Photographie portrait&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemple complet :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "Une ville côtière à l'&lt;/span&gt;aube, des vagues déferlant doucement sur un rivage rocheux&lt;span class="s2"&gt;",
    "&lt;/span&gt;duration&lt;span class="s2"&gt;": 10,
    "&lt;/span&gt;resolution&lt;span class="s2"&gt;": "&lt;/span&gt;720p&lt;span class="s2"&gt;",
    "&lt;/span&gt;aspect_ratio&lt;span class="s2"&gt;": "&lt;/span&gt;16:9&lt;span class="s2"&gt;"
  }'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utiliser des images de référence
&lt;/h2&gt;

&lt;p&gt;Le paramètre &lt;code&gt;reference_images&lt;/code&gt; accepte un tableau de jusqu’à 7 URL. Ces images influencent le style et le contenu visuel sans devenir le sujet principal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Une ville côtière à l'aube, des vagues déferlant doucement sur un rivage rocheux"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/ma-reference-de-style.jpg"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/reference-palette-de-couleurs.jpg"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Privilégiez des images cohérentes en style pour de meilleurs résultats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension et édition de vidéos générées
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Étendre une vidéo&lt;/strong&gt; : &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; (ajoute des séquences, utilise le &lt;code&gt;request_id&lt;/code&gt; original et une nouvelle invite).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modifier une vidéo&lt;/strong&gt; : &lt;code&gt;POST /v1/videos/edits&lt;/code&gt; (modifie style, scène ou effets par instruction textuelle).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ces endpoints sont également asynchrones et renvoient un &lt;code&gt;request_id&lt;/code&gt; utilisé pour interroger le résultat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Suivi du coût depuis la réponse API
&lt;/h2&gt;

&lt;p&gt;L’objet &lt;code&gt;usage&lt;/code&gt; contient le coût en "USD ticks" :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Divisez par 10 000 000 pour obtenir le montant en dollars.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_in_usd_ticks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10_000_000&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Coût : $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Sortie : Coût : 0,0500 $
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Résolution&lt;/th&gt;
&lt;th&gt;Prix/seconde&lt;/th&gt;
&lt;th&gt;10s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;0,05 $&lt;/td&gt;
&lt;td&gt;0,50 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;0,07 $&lt;/td&gt;
&lt;td&gt;0,70 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gardez une trace de &lt;code&gt;cost_in_usd_ticks&lt;/code&gt; pour suivre vos coûts sans requêtes supplémentaires.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tester l’API vidéo Grok avec Apidog
&lt;/h2&gt;

&lt;p&gt;Le modèle asynchrone impose de tester trois états frontend : chargement, succès, erreur. Impossible de tout tester en prod sans dépenser des crédits et du temps. Utilisez la fonction Smart Mock d’&lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" alt="Capture d'écran de l'interface d'Apidog montrant la configuration de Smart Mock pour une API."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cas d’utilisation 1 : Smart Mock pour le développement frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simuler le endpoint de génération&lt;/strong&gt; : Créez &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; dans Apidog, schéma de réponse :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simuler le endpoint d’interrogation&lt;/strong&gt; : Créez &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; avec schéma complet et Mock personnalisé :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/mock-video-12345.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400000000&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testez tous les états frontend sans consommer de crédits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cas d’utilisation 2 : Scénarios de test pour la boucle d’interrogation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Étape 1&lt;/strong&gt; : Ajoutez &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; dans le scénario de test, extrayez &lt;code&gt;request_id&lt;/code&gt; avec JSONPath &lt;code&gt;$.request_id&lt;/code&gt; dans une variable &lt;code&gt;videoRequestId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Étape 2&lt;/strong&gt; : Ajoutez &lt;code&gt;GET /v1/videos/{{videoRequestId}}&lt;/code&gt; dans une boucle For, condition d’arrêt : &lt;code&gt;response.body.status == "done"&lt;/code&gt; ; ajoutez un délai entre les itérations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Étape 3&lt;/strong&gt; : Assertion finale : &lt;code&gt;$.video.url&lt;/code&gt; n’est pas vide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automatisez ces tests pour valider votre logique end-to-end à chaque modification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Texte-vers-vidéo ou image-vers-vidéo : quand utiliser quoi
&lt;/h2&gt;

&lt;p&gt;Les deux modes utilisent &lt;code&gt;grok-imagine-video&lt;/code&gt;, mais pour des usages différents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilisez texte-vers-vidéo si :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vous partez d’un concept ou script original&lt;/li&gt;
&lt;li&gt;Le modèle doit composer la scène entièrement&lt;/li&gt;
&lt;li&gt;L’utilisateur saisit une invite textuelle&lt;/li&gt;
&lt;li&gt;Pas d’image source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Utilisez image-vers-vidéo si :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vous animez une photo, illustration ou asset de marque&lt;/li&gt;
&lt;li&gt;Vous devez préserver des détails visuels d’une image&lt;/li&gt;
&lt;li&gt;Animation cohérente à partir d’une série d’images&lt;/li&gt;
&lt;li&gt;Animation d’œuvre d’art/photo existante&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le texte-vidéo crée une scène de zéro ; l’image-vidéo anime une image existante. Pour approfondir le mode image-vidéo, consultez le &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guide de l'API Grok image-vers-vidéo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pour un produit hybride, détectez le type d’entrée à l’exécution et routez vers le bon endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erreurs courantes et solutions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Non autorisé&lt;/strong&gt; : Clé API absente, expirée ou mal formatée. Vérifiez l’en-tête Authorization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429 Trop de requêtes&lt;/strong&gt; : Limite atteinte (60/min, 1/s). Ajoutez un délai entre les requêtes, interrogez toutes les 5s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;statut "failed"&lt;/strong&gt; : Invite rejetée par la modération. Vérifiez/simplifiez votre invite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL vidéo 404&lt;/strong&gt; : Les URL expirent rapidement. Téléchargez la vidéo dès réception.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vidéo figée/vide&lt;/strong&gt; : Invite trop vague, manque de mouvement explicite. Ajoutez des indications précises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interrogation lente&lt;/strong&gt; : Les vidéos 720p et longues sont plus lentes. Pour le développement, utilisez 480p et des durées courtes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;L’API Grok texte-vidéo offre une génération vidéo asynchrone, pilotée par invite. Maîtrisez la boucle d’interrogation, puis ajustez durée, résolution, aspect et images de référence selon vos besoins.&lt;/p&gt;

&lt;p&gt;Pour la production, suivez les coûts via &lt;code&gt;cost_in_usd_ticks&lt;/code&gt;. Simulez vos endpoints dans Apidog pour un développement frontend efficace et des tests automatisés fiables.&lt;/p&gt;

&lt;p&gt;Téléchargez Apidog gratuitement pour configurer vos mocks et scénarios de test pour l’API vidéo Grok.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quel nom de modèle dois-je utiliser pour la génération texte-vidéo ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utilisez &lt;code&gt;grok-imagine-video&lt;/code&gt; dans le champ &lt;code&gt;model&lt;/code&gt; de votre requête POST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combien de temps prend la génération vidéo ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cela dépend de la durée et de la résolution. Un clip court en 480p peut être prêt en moins de 30 secondes. Pour 720p ou des clips longs, prévoir plusieurs minutes. Interrogez toutes les 5-10s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peut-on générer une vidéo de plus de 15 secondes ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Non, la durée maximale est 15s par requête. Pour des séquences plus longues, générez puis étendez avec &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment télécharger la vidéo générée ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Récupérez l’URL dans &lt;code&gt;result.video.url&lt;/code&gt; de la réponse finale et téléchargez immédiatement le MP4 (l’URL est temporaire).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Que se passe-t-il si l’invite enfreint la modération de contenu ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La tâche sera &lt;code&gt;"failed"&lt;/code&gt;. Le champ &lt;code&gt;respect_moderation&lt;/code&gt; indique l’application de la modération. Révisez et reformulez votre invite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existe-t-il un niveau gratuit pour l’API vidéo ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La facturation se fait à la seconde générée. Consultez &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt; pour les éventuelles offres de crédit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quelle différence entre &lt;code&gt;reference_images&lt;/code&gt; et une image source ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt; guide le style pour le texte-vidéo. Pour que l’image soit l’élément principal animé, utilisez le mode image-vidéo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment tester la boucle d’interrogation sans dépenser des crédits ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utilisez Smart Mock d’&lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; pour simuler les endpoints. Configurez des réponses mock pour &lt;code&gt;"processing"&lt;/code&gt; et &lt;code&gt;"done"&lt;/code&gt; et testez votre code sans toucher à l’API réelle.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comment utiliser l'API image en vidéo de Grok : guide pas à pas</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:44:12 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/comment-utiliser-lapi-image-en-video-de-grok-guide-pas-a-pas-42o1</link>
      <guid>https://dev.to/antoine_laurentt/comment-utiliser-lapi-image-en-video-de-grok-guide-pas-a-pas-42o1</guid>
      <description>&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;p&gt;L'API image-vers-vidéo de Grok permet d'animer une image statique en un clip vidéo à l'aide du modèle &lt;code&gt;grok-imagine-video&lt;/code&gt;. Pour l'utiliser, envoyez (POST) l’URL de votre image, un prompt et des paramètres optionnels à &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;. L’API retourne immédiatement un &lt;code&gt;request_id&lt;/code&gt;. Vous devez ensuite interroger (poll) &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; jusqu’à ce que le champ &lt;code&gt;status&lt;/code&gt; passe à &lt;code&gt;"done"&lt;/code&gt;. La génération prend entre 1 et 15 secondes de vidéo. Tarification : à partir de 0,05 $/seconde en 480p.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Le 28 janvier 2026, xAI a lancé le modèle &lt;code&gt;grok-imagine-video&lt;/code&gt; en accès public via API. En un mois, il a généré 1,2 milliard de vidéos et s'est hissé en tête du classement "text-to-video" d’Artificial Analysis. L’animation d’une photo en vidéo est l’une de ses fonctions principales : fournissez une photo et une invite descriptive, et l’API génère un clip MP4 animé à télécharger.&lt;/p&gt;

&lt;p&gt;Ce flux asynchrone — soumission d’une tâche puis interrogation de son état — pose un défi de test que beaucoup de développeurs sous-estiment. Une intégration n’est pas terminée après le premier POST 200, mais lorsque la boucle de polling gère correctement les états &lt;code&gt;"processing"&lt;/code&gt;, &lt;code&gt;"done"&lt;/code&gt; et &lt;code&gt;"failed"&lt;/code&gt; dans des conditions réelles.&lt;/p&gt;

&lt;p&gt;Les Scénarios de Test d’Apidog apportent une solution directe : construisez une séquence chaînée (POST &lt;code&gt;/v1/videos/generations&lt;/code&gt;, extraction du &lt;code&gt;request_id&lt;/code&gt;, boucle d’interrogation jusqu’à &lt;code&gt;status == "done"&lt;/code&gt;, puis assertion sur la présence de l’URL vidéo). Suivez ce guide pour mettre en place votre workflow de test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce que l'API Grok image-vers-vidéo ?
&lt;/h2&gt;

&lt;p&gt;L’API Grok image-vers-vidéo fait partie du produit vidéo de xAI. Elle utilise le modèle &lt;code&gt;grok-imagine-video&lt;/code&gt; et prend une image comme première frame de la vidéo générée. Le modèle analyse l’image et le prompt, puis génère un mouvement naturel pour l’animer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint API :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.x.ai/v1/videos/generations
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Authentification :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer YOUR_XAI_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obtenez votre clé API sur la &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console xAI&lt;/a&gt;. Cette API supporte également le texte-vers-vidéo (sans paramètre &lt;code&gt;image&lt;/code&gt;), l’extension et la modification vidéo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonctionnement du processus image-vers-vidéo
&lt;/h2&gt;

&lt;p&gt;Le paramètre &lt;code&gt;image&lt;/code&gt; du body représente la &lt;strong&gt;première image&lt;/strong&gt; de la vidéo. Le modèle anime la scène depuis cette image, chaque pixel initial provient de votre source. Ensuite, selon votre prompt, la scène évolue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple&lt;/strong&gt; : une photo d’un lac de montagne au lever du soleil, avec le prompt : « De douces ondulations se propagent à la surface de l’eau tandis que la brume matinale s’élève. » La première frame sera la photo ; les frames suivantes montrent l’animation de l’eau et de la brume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Différence par rapport au texte-vers-vidéo&lt;/strong&gt; : le texte-vers-vidéo génère la première image, tandis qu’image-vers-vidéo vous donne un contrôle précis sur la scène initiale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilisez image-vers-vidéo si :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vous souhaitez animer des photos de produits, paysages, portraits existants.&lt;/li&gt;
&lt;li&gt;Votre branding nécessite une identité visuelle cohérente.&lt;/li&gt;
&lt;li&gt;Le mouvement doit partir d’une scène réelle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Utilisez texte-vers-vidéo si :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vous n’avez pas d’image de référence.&lt;/li&gt;
&lt;li&gt;Vous laissez le modèle choisir la composition.&lt;/li&gt;
&lt;li&gt;L’itération rapide prime sur la fidélité à une image.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prérequis
&lt;/h2&gt;

&lt;p&gt;Avant de commencer :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compte xAI&lt;/strong&gt; sur &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clé API&lt;/strong&gt; depuis la console xAI (stockez-la dans une variable d’environnement).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8+&lt;/strong&gt; ou &lt;strong&gt;Node.js 18+&lt;/strong&gt; (exemples pour les deux).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL d’image publique&lt;/strong&gt; ou image encodée en base64 (data URI).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozcnsdoclf1obpc6q6w3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozcnsdoclf1obpc6q6w3.png" alt="image-68.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Définissez la clé API :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"votre_clé_ici"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installez le SDK Python xAI (optionnel) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour les appels HTTP bruts : utilisez &lt;code&gt;requests&lt;/code&gt; (Python) ou &lt;code&gt;fetch&lt;/code&gt; (Node.js).&lt;/p&gt;

&lt;h2&gt;
  
  
  Effectuer votre première requête image-vers-vidéo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Utilisation de curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "De douces vagues se déplacent à la surface, la brume matinale s'&lt;/span&gt;élève lentement&lt;span class="s2"&gt;",
    "&lt;/span&gt;image&lt;span class="s2"&gt;": {
      "&lt;/span&gt;url&lt;span class="s2"&gt;": "&lt;/span&gt;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg&lt;span class="s2"&gt;"
    },
    "&lt;/span&gt;duration&lt;span class="s2"&gt;": 6,
    "&lt;/span&gt;resolution&lt;span class="s2"&gt;": "&lt;/span&gt;720p&lt;span class="s2"&gt;",
    "&lt;/span&gt;aspect_ratio&lt;span class="s2"&gt;": "&lt;/span&gt;16:9&lt;span class="s2"&gt;"
  }'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Réponse immédiate :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La génération est asynchrone. Passez à l’étape d’interrogation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilisation de Python (requêtes brutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;De douces vagues se déplacent à la surface, la brume matinale s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;élève lentement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolution&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aspect_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tâche démarrée : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilisation d'une image Base64
&lt;/h3&gt;

&lt;p&gt;Pour une image locale/non publique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_image.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/jpeg;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Interrogation du résultat
&lt;/h2&gt;

&lt;p&gt;La génération vidéo étant asynchrone, interrogez :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://api.x.ai/v1/videos/{request_id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Statuts possibles :&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Statut&lt;/th&gt;
&lt;th&gt;Signification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"processing"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vidéo en cours de rendu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"done"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vidéo prête, URL disponible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"failed"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Une erreur est survenue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Réponse complète :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Boucle d'interrogation Python complète
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Statut : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Progression : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;La génération vidéo a échoué pour &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Utilisation
&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;URL de la vidéo : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Durée : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gardez un intervalle d’au moins 5 s. Limite d’API : 60 requêtes/minute (1/s).&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilisation du SDK Python xAI
&lt;/h2&gt;

&lt;p&gt;Le package &lt;code&gt;xai-sdk&lt;/code&gt; gère pour vous la logique asynchrone :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;De douces vagues se déplacent à la surface, la brume matinale s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;élève lentement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/landscape.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;URL de la vidéo : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Durée : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le SDK s’occupe du polling, des erreurs, etc. Pour un contrôle granulaire sur la boucle ou les logs, utilisez les requêtes brutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contrôle de la résolution, de la durée et du rapport d’aspect
&lt;/h2&gt;

&lt;p&gt;L’API offre un contrôle précis sur la sortie :&lt;/p&gt;

&lt;h3&gt;
  
  
  Durée
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;duration&lt;/code&gt; : entier de 1 à 15 secondes (par défaut : 6).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus la vidéo est longue, plus le coût augmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Résolution
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"480p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Par défaut. Moins cher, plus rapide.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"720p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qualité supérieure. 0,07 $/sec vs 0,05 $ &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rapport d’aspect
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;th&gt;Cas d'utilisation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"16:9"&lt;/td&gt;
&lt;td&gt;Par défaut, paysage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"9:16"&lt;/td&gt;
&lt;td&gt;Vertical, stories/mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"1:1"&lt;/td&gt;
&lt;td&gt;Carré, réseaux sociaux/thumbnails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"4:3"&lt;/td&gt;
&lt;td&gt;Photo/presentation classique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"3:4"&lt;/td&gt;
&lt;td&gt;Portrait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"3:2"&lt;/td&gt;
&lt;td&gt;Photo standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"2:3"&lt;/td&gt;
&lt;td&gt;Portrait haut&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Par défaut, l’aspect ratio suit celui de l’image source. Spécifiez-le pour forcer un recadrage.&lt;/p&gt;




&lt;h2&gt;
  
  
  Utilisation d’images de référence pour l’orientation stylistique
&lt;/h2&gt;

&lt;p&gt;Le paramètre &lt;code&gt;reference_images&lt;/code&gt; est différent de &lt;code&gt;image&lt;/code&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;image&lt;/code&gt;&lt;/strong&gt; : Première image de la vidéo (point de départ pour l’animation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reference_images&lt;/code&gt;&lt;/strong&gt; : Tableau (max 7) d’images qui guident le style, le contenu ou le contexte. Elles influencent l’apparence, sans être affichées.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple d’usage :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Un produit tournant lentement sur une surface blanche propre"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/product-shot.jpg"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/brand-style-reference-1.jpg"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/lighting-reference.jpg"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ici, &lt;code&gt;product-shot.jpg&lt;/code&gt; est la première image ; les références influencent le style/éclairage.&lt;/p&gt;

&lt;p&gt;Vous pouvez utiliser uniquement des images de référence (sans &lt;code&gt;image&lt;/code&gt;) pour guider un texte-vers-vidéo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension et édition de vidéos
&lt;/h2&gt;

&lt;p&gt;Deux opérations avancées :&lt;/p&gt;

&lt;h3&gt;
  
  
  Extension d’une vidéo
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; : ajoute des secondes à une vidéo existante (max 15 s par appel).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/extensions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "video_id": "votre_request_id_original",
    "prompt": "La brume continue de se lever alors que la lumière du soleil perce",
    "duration": 5
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interrogez ensuite &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; comme précédemment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modification d’une vidéo
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/edits&lt;/code&gt; : modifie le contenu ou le mouvement d’une vidéo existante sur la base d’un nouveau prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/edits &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "video_id": "votre_request_id_original",
    "prompt": "Changer le ciel en un coucher de soleil dramatique avec des tons orange profond"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extensions et modifications utilisent aussi le modèle asynchrone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Détail des prix : combien coûte une vidéo de 10 s ?
&lt;/h2&gt;

&lt;p&gt;L’API facture :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le traitement de l’image d’entrée&lt;/li&gt;
&lt;li&gt;La durée de la vidéo de sortie&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Composant&lt;/th&gt;
&lt;th&gt;Coût&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Image d’entrée&lt;/td&gt;
&lt;td&gt;0,002 $ / image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sortie en 480p&lt;/td&gt;
&lt;td&gt;0,05 $ / seconde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sortie en 720p&lt;/td&gt;
&lt;td&gt;0,07 $ / seconde&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemple (10 s en 720p) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Image d’entrée : 0,002 $&lt;/li&gt;
&lt;li&gt;Sortie : 10 × 0,07 $ = 0,70 $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total : 0,702 $&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple (6 s en 480p) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Image d’entrée : 0,002 $&lt;/li&gt;
&lt;li&gt;Sortie : 6 × 0,05 $ = 0,30 $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total : 0,302 $&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;À chaque génération, le coût de l’image d’entrée s’applique, même avec la même URL.&lt;/p&gt;

&lt;p&gt;Le texte-vers-vidéo ne facture pas de coût d’image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment tester votre intégration de l’API vidéo Grok avec Apidog
&lt;/h2&gt;

&lt;p&gt;Pour tester correctement une API asynchrone, validez :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;La génération retourne bien un &lt;code&gt;request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Le polling gère l’état &lt;code&gt;"processing"&lt;/code&gt; pendant l’attente&lt;/li&gt;
&lt;li&gt;La réponse finale a &lt;code&gt;status == "done"&lt;/code&gt; &lt;strong&gt;et&lt;/strong&gt; une URL vidéo non vide&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les Scénarios de Test d’&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; permettent d’automatiser ce workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 1 : Créer un nouveau scénario de test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dans Apidog, module Tests → bouton &lt;code&gt;+&lt;/code&gt; → nommer (« Flux asynchrone Grok image-vers-vidéo »).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 2 : Ajouter la requête de génération&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL : &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Méthode : POST&lt;/li&gt;
&lt;li&gt;En-tête : &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body JSON :
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Une douce brume s'élève de l'eau tandis que la lumière filtre à travers les arbres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/your-test-image.jpg"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"480p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Étape 3 : Extraire le request_id&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processeur "Extraire Variable" :

&lt;ul&gt;
&lt;li&gt;Nom : &lt;code&gt;video_request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Source : corps de la réponse&lt;/li&gt;
&lt;li&gt;Méthode : JSONPath : &lt;code&gt;$.request_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 4 : Boucle d’interrogation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processeur "For" (boucle) ; à l’intérieur :

&lt;ul&gt;
&lt;li&gt;Requête GET : &lt;code&gt;https://api.x.ai/v1/videos/{{video_request_id}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header : &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Extraction "video_status" : JSONPath &lt;code&gt;$.status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Attendre 5000ms pour éviter la limite de débit&lt;/li&gt;
&lt;li&gt;Condition d’arrêt de boucle : &lt;code&gt;{{video_status}} == "done"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 5 : Assertion sur l’URL vidéo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requête GET finale&lt;/li&gt;
&lt;li&gt;Processeur "Assertion" :

&lt;ul&gt;
&lt;li&gt;Champ : &lt;code&gt;$.video.url&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Condition : "n’est pas vide"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Vous pouvez intégrer ce scénario dans votre pipeline CI/CD avec la CLI Apidog :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; grok-video-async-flow &lt;span class="nt"&gt;--env&lt;/span&gt; production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Erreurs courantes et corrections
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;401 Non autorisé&lt;/strong&gt; : Clé API manquante/invalide. Vérifiez l’en-tête &lt;code&gt;Authorization&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;422 Entité non traitable&lt;/strong&gt; : Body malformé, champ &lt;code&gt;model&lt;/code&gt; ou &lt;code&gt;prompt&lt;/code&gt; manquant, ou image non accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;URL d’image non accessible&lt;/strong&gt; : L’URL doit être publique. Les URLs privées ou &lt;code&gt;localhost&lt;/code&gt; échouent. Pour les images locales, utilisez un data URI base64.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Statut bloqué sur "processing"&lt;/strong&gt; : Patientez jusqu’à 10 min. Si bloqué, renvoyez la requête.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limite de débit (429)&lt;/strong&gt; : Maximum 60 requêtes/minute (1/s). Ajoutez un &lt;code&gt;time.sleep(1)&lt;/code&gt; entre les polls si besoin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erreur Base64&lt;/strong&gt; : Vérifiez que l’URI commence par le bon préfixe MIME (&lt;code&gt;data:image/jpeg;base64,&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mauvais aspect ratio&lt;/strong&gt; : Si le ratio ne correspond pas, le modèle peut recadrer ou ajouter des bandes noires. Idéal : faites correspondre le ratio à l’image source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;L’API Grok image-vers-vidéo transforme une photo statique en clip animé : POST de l’image et du prompt, extraction du &lt;code&gt;request_id&lt;/code&gt;, polling jusqu’à complétion, téléchargement du MP4. Le modèle &lt;code&gt;grok-imagine-video&lt;/code&gt; domine le classement Artificial Analysis (janvier 2026) avec plus d’un milliard de vidéos générées ce mois-là.&lt;/p&gt;

&lt;p&gt;La gestion du polling asynchrone est la principale difficulté d’intégration. Avec Apidog, créez des tests qui extraient les variables, bouclent sur l’état et valident le résultat, pour détecter les problèmes avant la production.&lt;/p&gt;

&lt;p&gt;Commencez à construire votre intégration avec Apidog gratuitement. Aucune carte bancaire requise.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quel nom de modèle pour l’API Grok image-vers-vidéo ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utilisez &lt;code&gt;grok-imagine-video&lt;/code&gt; dans le champ &lt;code&gt;model&lt;/code&gt; du POST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Différence entre &lt;code&gt;image&lt;/code&gt; et &lt;code&gt;reference_images&lt;/code&gt; ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;image&lt;/code&gt; : première image de la vidéo.&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt; : indications de style et de contenu, non utilisées comme frame de départ. Vous pouvez les combiner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temps de génération d’une vidéo ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
6 s en 480p : 1–3 min.&lt;br&gt;&lt;br&gt;
15 s en 720p : 4–8 min.&lt;br&gt;&lt;br&gt;
Interrogez toutes les 5 s pour éviter la limite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utiliser un fichier local ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, encodez-le en base64 : &lt;code&gt;data:image/jpeg;base64,{octets_encodes}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Que se passe-t-il si je ne précise pas &lt;code&gt;aspect_ratio&lt;/code&gt; ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Avec &lt;code&gt;image&lt;/code&gt;, le ratio suit l’image source. Sans image (texte-vers-vidéo), défaut : &lt;code&gt;16:9&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tarif d’une vidéo 10 s 720p ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Image d’entrée : 0,002 $. Sortie : 0,70 $. Total : 0,702 $.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quelles limites de débit ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
60 requêtes/minute, 1/s. POST + GET combinés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prolonger une vidéo &amp;gt;15 s ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, via &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; en générant plusieurs fragments successifs.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Prix de l'API SMS de Bird en 2026 : Combien ça coûte ?</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:12:52 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/prix-de-lapi-sms-de-bird-en-2026-combien-ca-coute--4igo</link>
      <guid>https://dev.to/antoine_laurentt/prix-de-lapi-sms-de-bird-en-2026-combien-ca-coute--4igo</guid>
      <description>&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;p&gt;L'API SMS de Bird commence à &lt;strong&gt;0,00331 $ par message sortant aux États-Unis&lt;/strong&gt; et &lt;strong&gt;0,003 $ par message entrant aux États-Unis&lt;/strong&gt;. C'est l'un des tarifs les plus compétitifs du marché pour une API SMS. Vous disposez également d'un plan gratuit avec 5 SMS/jour pour tester rapidement votre intégration. Le plan Pro à 49 $/mois inclut 1 000 crédits SMS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;MessageBird est devenu Bird en 2023, recentrant la plateforme sur la communication omnicanale (SMS, WhatsApp, e-mail, voix) avec une grille tarifaire transparente et un coût des SMS inférieur à Twilio, Vonage et autres grands acteurs.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Astuce Développeur&lt;/strong&gt; : Pour tout projet d’intégration SMS, il faut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Des données tarifaires précises&lt;/li&gt;
&lt;li&gt;Un moyen simple de tester vos appels API avant la production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; répond à ces deux besoins : construisez vos requêtes API Bird, exécutez vos scénarios de test et validez les réponses sans code additionnel. Testez gratuitement et validez votre intégration SMS Bird en quelques minutes.&lt;/p&gt;

&lt;p&gt;Cet article détaille les coûts des SMS Bird pour 2025/2026, les facteurs d’augmentation de facture et une comparaison avec les alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aperçu des tarifs SMS de Bird
&lt;/h2&gt;

&lt;p&gt;Bird applique une tarification en deux volets :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frais de plan de plateforme&lt;/strong&gt; (abonnement mensuel)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frais par message&lt;/strong&gt; (paiement à l’usage en supplément du plan)&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Coût mensuel&lt;/th&gt;
&lt;th&gt;SMS inclus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;5 SMS/jour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$49&lt;/td&gt;
&lt;td&gt;1 000 SMS/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entreprise&lt;/td&gt;
&lt;td&gt;Personnalisé&lt;/td&gt;
&lt;td&gt;Volume adapté&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Au-delà du quota inclus, les tarifs US sont :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SMS sortants&lt;/strong&gt; : 0,00331 $/message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMS entrants&lt;/strong&gt; : 0,003 $/message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les tarifs CRM/Marketing de Bird sont en EUR sur la &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;page officielle&lt;/a&gt;. Pour le niveau API/développeur, vérifiez toujours la grille tarifaire en vigueur pour éviter les surprises dues aux frais opérateurs ou taux de change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Répartition des tarifs : SMS, MMS, WhatsApp et e-mail
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;US&lt;/strong&gt; : 0,00331 $/message sortant (base opérateur directe)&lt;/li&gt;
&lt;li&gt;Les tarifs varient selon les pays (voir extrait ci-dessous) :&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pays&lt;/th&gt;
&lt;th&gt;Tarif sortant (approx.)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;États-Unis&lt;/td&gt;
&lt;td&gt;~$0.00331&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Royaume-Uni&lt;/td&gt;
&lt;td&gt;~€0.036&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Australie&lt;/td&gt;
&lt;td&gt;~€0.009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allemagne&lt;/td&gt;
&lt;td&gt;~€0.056&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inde&lt;/td&gt;
&lt;td&gt;varie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brésil&lt;/td&gt;
&lt;td&gt;~€0.047&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ Des frais opérateurs (10DLC, numéros verts) s’ajoutent pour les US/Canada. Voir "Coûts cachés".&lt;/p&gt;

&lt;h3&gt;
  
  
  MMS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Plus cher que le SMS : attendez-vous à ~3-5x le coût du SMS.&lt;/li&gt;
&lt;li&gt;Disponible pour US et Canada.&lt;/li&gt;
&lt;li&gt;Consultez &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; pour le tarif exact par pays/plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WhatsApp
&lt;/h3&gt;

&lt;p&gt;Deux éléments de tarification :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frais Bird&lt;/strong&gt; (par 1 000 messages) :&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;| Volume             | Frais/1 000 messages |&lt;br&gt;
   |--------------------|---------------------|&lt;br&gt;
   | 1 – 1 000          | $0.001              |&lt;br&gt;
   | 1 001 – 100 000    | $0.005              |&lt;br&gt;
   | 100 001 – 500 000  | $0.0045             |&lt;br&gt;
   | 500 001+           | $0.004              |&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frais Meta&lt;/strong&gt; (par conversation, varient selon le type/pays) :

&lt;ul&gt;
&lt;li&gt;Marketing : 0,0250 $&lt;/li&gt;
&lt;li&gt;Utilitaire : 0,0034 $&lt;/li&gt;
&lt;li&gt;Authentification : 0,0034 $&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bird répercute les frais Meta sans surcoût.&lt;/p&gt;
&lt;h3&gt;
  
  
  E-mail
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Démarre à 0,001 $/e-mail (faible volume)&lt;/li&gt;
&lt;li&gt;Le plan Pro inclut 10 000 e-mails/mois&lt;/li&gt;
&lt;li&gt;Canal le plus économique&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Voix
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tarification à l’usage, variable selon le pays&lt;/li&gt;
&lt;li&gt;Appels sortants US : 0,013–0,015 $/minute&lt;/li&gt;
&lt;li&gt;Appels entrants US : un peu moins cher&lt;/li&gt;
&lt;li&gt;Pour de gros volumes, contactez le service commercial Bird&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Ce qui influence votre facture Bird
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Pays et routage opérateur
&lt;/h3&gt;

&lt;p&gt;Les tarifs varient fortement par pays. Exemple : Allemagne (~0,056 €), Bangladesh (~0,208 €), Burundi (~0,269 €), soit jusqu'à 80x le tarif US. Consultez toujours la grille par pays.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Type de numéro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Codes longs (10DLC)&lt;/strong&gt; : Numéro standard US, nécessite enregistrement via TCR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codes courts&lt;/strong&gt; : 5-6 chiffres, débit élevé, location mensuelle coûteuse (500–1 000 $/mois).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numéros verts&lt;/strong&gt; : Coût mensuel modéré, débit moyen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Des frais de location mensuels s’ajoutent au tarif par message.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Longueur et encodage du message
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;160 caractères max (GSM-7). Dépassement → segmentation multiple (facturés individuellement).&lt;/li&gt;
&lt;li&gt;Unicode (emoji, accents) : segment = 70 caractères.&lt;/li&gt;
&lt;li&gt;1 emoji dans 200 caractères = 3 segments facturés.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Mix des canaux
&lt;/h3&gt;

&lt;p&gt;Les workflows omnicanaux (ex : bascule SMS → WhatsApp) induisent des coûts WhatsApp en plus. Testez l’impact financier avant d’activer ces automatisations.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Volume
&lt;/h3&gt;

&lt;p&gt;Pas de remises publiques Bird sur le volume. Pour de gros volumes, le plan Enterprise offre des tarifs négociés. Contactez le support commercial.&lt;/p&gt;
&lt;h2&gt;
  
  
  Coûts et frais cachés
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Frais d’opérateur US (10DLC)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enregistrement de marque&lt;/strong&gt; : frais unique (~4 à 44 $)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enregistrement de campagne&lt;/strong&gt; : ~10 $/mois/campagne&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surtaxe opérateur/message&lt;/strong&gt; : quelques centimes ajoutés au tarif Bird&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixés par les opérateurs (AT&amp;amp;T, T-Mobile, Verizon), non par Bird.&lt;/p&gt;
&lt;h3&gt;
  
  
  Location de numéro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Long code US : 1–2 $/mois&lt;/li&gt;
&lt;li&gt;Numéro vert : 2–3 $/mois&lt;/li&gt;
&lt;li&gt;Code court : 500–1 000 $/mois&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Webhooks entrants et traitement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chaque SMS entrant : 0,003 $ (US)&lt;/li&gt;
&lt;li&gt;Les flux automatisés (désabonnement, aide) génèrent des messages entrants facturés.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Abonnement plateforme
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pro : 49 $/mois (1 000 SMS inclus)&lt;/li&gt;
&lt;li&gt;Au-delà, chaque SMS est facturé à l’unité.&lt;/li&gt;
&lt;li&gt;Pour de gros volumes, le forfait inclus est vite dépassé.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Comparatif Bird vs alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fournisseur&lt;/th&gt;
&lt;th&gt;SMS sortants US&lt;/th&gt;
&lt;th&gt;SMS entrants US&lt;/th&gt;
&lt;th&gt;Remarques&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bird&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.00331&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;Tarif de base le plus bas, plateforme omni&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;Plus cher, écosystème riche&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;~$0.004&lt;/td&gt;
&lt;td&gt;~$0.001&lt;/td&gt;
&lt;td&gt;Compétitif, modèle direct opérateur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;Entrant très bas, plateforme simple&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bird propose le tarif sortant US le plus bas. Twilio coûte plus du double au niveau d’entrée, même si ses remises volume réduisent l’écart. Bird regroupe SMS, WhatsApp, e-mail et automatisation – à choisir si vous ciblez l’omnicanal. Si vous cherchez une simple API SMS, Telnyx ou Plivo proposent une grille plus simple.&lt;/p&gt;
&lt;h2&gt;
  
  
  Comment démarrer avec Bird
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Créer un compte gratuit&lt;/strong&gt; sur &lt;a href="https://bird.com" rel="noopener noreferrer"&gt;bird.com&lt;/a&gt;. Profitez de 5 SMS/jour sans carte de crédit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enregistrer votre marque et campagne&lt;/strong&gt; via le dashboard Bird (conformité 10DLC US). Comptez 1–3 jours ouvrés.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obtenir un numéro de téléphone&lt;/strong&gt; via l’API Numbers Bird ou le dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Effectuer votre premier appel API&lt;/strong&gt;. Bird utilise une API REST JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemple d’appel API pour envoyer un SMS :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.bird.com/v1/messages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: AccessKey VOTRE_CLE_API"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "originator": "NUMERO_EMETTEUR",
    "recipients": ["NUMERO_DESTINATAIRE"],
    "body": "Bonjour depuis l’API Bird !"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La &lt;a href="https://docs.bird.com" rel="noopener noreferrer"&gt;documentation Bird&lt;/a&gt; détaille l’authentification, les SDK (Node.js, Python, PHP, Go, Java, Ruby) et la gestion des webhooks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;L’API SMS Bird affiche le tarif de base le plus bas du marché US (0,00331 $/message sortant). Le plan gratuit vous permet de tester sans CB. Le plan Pro (49 $/mois, 1 000 SMS inclus) est adapté aux équipes en phase de démarrage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Points de vigilance&lt;/strong&gt; : frais opérateur 10DLC, location de numéro, tarifs internationaux (jusqu'à 50x le prix US). Intégrez-les dans votre modèle de coût dès le départ.&lt;/p&gt;

&lt;p&gt;Pour évaluer Bird, testez votre intégration de bout en bout avec &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; : création de requêtes, gestion d’environnements, enchaînement de tests et assertions de livraison, tout-en-un.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quel est le prix de l'API SMS de Bird par message aux États-Unis ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
0,00331 $ par SMS sortant US, 0,003 $ par SMS entrant US (tarif API développeur). Des frais opérateur (10DLC) s’ajoutent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bird est-il la même chose que MessageBird ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. MessageBird est devenu Bird en 2023. L’entreprise existe depuis 2011 et a des clients comme Heineken, Booking.com, Uber, eBay. L’API et certaines docs référencent encore MessageBird.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bird facture-t-il les SMS entrants ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, 0,003 $/SMS entrant US. Les réponses désabonnement/aide comptent comme entrants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que le plan gratuit de Bird ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
5 SMS/jour, 10 e-mails/jour, 15 messages IA/jour. Accès API public sans CB, idéal pour tester avant le Pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment la tarification SMS de Bird se compare-t-elle à celle de Twilio ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bird : 0,00331 $/sortant US ; Twilio : 0,0079 $. Pour 100 000 messages/mois, Bird = 331 $ vs Twilio = 790 $. Twilio propose des remises volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Y a-t-il des frais cachés avec les SMS Bird ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui : frais d’enregistrement marque/campagne 10DLC, surtaxes opérateur/message, location numéro (1–2 $/mois), tarifs internationaux élevés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment tester l’API SMS de Bird sans envoyer de vrais messages ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utilisez la fonction Smart Mock d’&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; pour simuler les réponses Bird. Vous pouvez aussi envoyer des tests à votre numéro via le sandbox Bird. Les scénarios Apidog permettent d’enchaîner requêtes et vérifications sans toucher la production.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Prix SMS Twilio API : Analyse Complète des Tarifs 2026</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 04:01:47 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/prix-sms-twilio-api-analyse-complete-des-tarifs-2026-25ok</link>
      <guid>https://dev.to/antoine_laurentt/prix-sms-twilio-api-analyse-complete-des-tarifs-2026-25ok</guid>
      <description>&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SMS code long US (envoi et réception) : &lt;strong&gt;0,0083 $ par message&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;MMS envoi : &lt;strong&gt;0,022 $ par message&lt;/strong&gt; ; MMS réception : &lt;strong&gt;0,0165 $ par message&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;SMS numéro gratuit : &lt;strong&gt;0,0083 $ par message&lt;/strong&gt; plus les frais d'opérateur&lt;/li&gt;
&lt;li&gt;Location de code court : &lt;strong&gt;1 000 $/mois&lt;/strong&gt; pour un code aléatoire ; &lt;strong&gt;1 500 $/mois&lt;/strong&gt; pour un code personnalisé&lt;/li&gt;
&lt;li&gt;Enregistrement de marque 10DLC : &lt;strong&gt;4,50 $ de frais uniques&lt;/strong&gt; (mis à jour en août 2025) ; campagnes de &lt;strong&gt;1,50 $ à 10 $/mois&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Numéro de téléphone (code long) : &lt;strong&gt;1,15 $/mois&lt;/strong&gt; ; numéro gratuit : &lt;strong&gt;2,15 $/mois&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Les frais d'opérateur s'ajoutent à tous les prix de base&lt;/li&gt;
&lt;li&gt;Les remises sur volume s'appliquent automatiquement à partir de 150 000 messages par mois&lt;/li&gt;
&lt;li&gt;Essai gratuit disponible ; aucune carte de crédit requise pour commencer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Twilio est l'API SMS par défaut pour la plupart des équipes de développeurs. Sa documentation est complète, la disponibilité est fiable et l'API REST est bien conçue. Mais dès que vous passez d'un projet annexe à une application de production, la facture augmente rapidement. Vous ne payez pas un seul prix par message, mais le tarif de base Twilio, des frais d'opérateur, des frais de numéro de téléphone et, souvent, des coûts d'enregistrement 10DLC en sus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Astuce&lt;/strong&gt; : Avant de développer votre intégration SMS, testez-la correctement. Apidog vous permet de créer des scénarios de test automatisés pour valider les réponses de vos webhooks Twilio avec votre spécification OpenAPI. Confirmez les codes de statut, validez les schémas de réponse, et exécutez des tests de contrat en CI/CD. Essayez Apidog gratuitement pour vérifier vos workflows SMS avant la production.&lt;/p&gt;

&lt;p&gt;Cet article détaille chaque poste de la tarification Twilio. Vous allez voir ce qui fait grimper la facture, ce qui peut passer inaperçu, et comment Twilio se positionne face aux alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aperçu des tarifs SMS Twilio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/en-us/pricing/messaging" rel="noopener noreferrer"&gt;Twilio utilise une tarification à la consommation&lt;/a&gt;. Vous payez par segment de message, par numéro de téléphone chaque mois, et pour toute fonctionnalité ou enregistrement optionnel. Aucun contrat ni minimum obligatoire, sauf en cas de remise négociée sur de gros volumes.&lt;/p&gt;

&lt;p&gt;Le tarif de base pour les SMS US sur code long est &lt;strong&gt;0,0083 $ par segment&lt;/strong&gt; pour l'envoi et la réception. Mais ce tarif n'inclut ni les frais d'opérateur, ni la location de numéro, ni les frais de conformité.&lt;/p&gt;

&lt;p&gt;Twilio applique également des remises sur volume automatiques à partir de 150 000 messages/mois pour chaque type de numéro – rien à négocier, la remise s’active automatiquement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Détail de la tarification : SMS, MMS, numéros gratuits et codes courts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS via code long (numéros à 10 chiffres)
&lt;/h3&gt;

&lt;p&gt;Les codes longs sont les numéros standards à 10 chiffres utilisés pour la plupart des messageries A2P aux États-Unis.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de message&lt;/th&gt;
&lt;th&gt;Prix par segment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS sortant&lt;/td&gt;
&lt;td&gt;0,0083 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS entrant&lt;/td&gt;
&lt;td&gt;0,0083 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS sortant&lt;/td&gt;
&lt;td&gt;0,022 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS entrant&lt;/td&gt;
&lt;td&gt;0,0165 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;À noter&lt;/strong&gt; : Twilio facture par &lt;strong&gt;segment de message&lt;/strong&gt;, pas par message complet. Un segment = 160 caractères GSM-7. Si vous utilisez Unicode (émojis, accents), un segment = 70 caractères. Par exemple, un message de 200 caractères = 2 segments facturés.&lt;/p&gt;

&lt;h3&gt;
  
  
  Numéros gratuits
&lt;/h3&gt;

&lt;p&gt;Les numéros gratuits appliquent les mêmes tarifs de base SMS : 0,0083 $ par segment envoyé/reçu. MMS sortant : 0,022 $ ; MMS entrant : 0,02 $. Ces numéros sont adaptés au trafic unidirectionnel à fort volume et ne requièrent pas d’enregistrement 10DLC, mais nécessitent une vérification pour le débit maximal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codes courts (numéros à 5-6 chiffres)
&lt;/h3&gt;

&lt;p&gt;Idéaux pour les campagnes à haut débit. Le tarif SMS reste à 0,0083 $ par segment, mais la location du numéro est bien plus élevée.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de code court&lt;/th&gt;
&lt;th&gt;Coût mensuel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code court aléatoire&lt;/td&gt;
&lt;td&gt;1 000 $/mois (facturé trimestriellement)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code court personnalisé&lt;/td&gt;
&lt;td&gt;1 500 $/mois (facturé trimestriellement)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code personnalisé apporté&lt;/td&gt;
&lt;td&gt;500 $/mois (facturé trimestriellement)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tous les codes courts compatibles MMS entraînent aussi des frais uniques de 500 $.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remises sur volume
&lt;/h3&gt;

&lt;p&gt;Twilio applique des remises automatiques pour les SMS par code long, numéro gratuit et code court :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Messages mensuels&lt;/th&gt;
&lt;th&gt;Prix par segment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 à 150 000&lt;/td&gt;
&lt;td&gt;0,0083 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150 001 à 300 000&lt;/td&gt;
&lt;td&gt;0,0081 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300 001 à 500 000&lt;/td&gt;
&lt;td&gt;0,0079 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 001 à 750 000&lt;/td&gt;
&lt;td&gt;0,0077 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;750 001 à 1 000 000&lt;/td&gt;
&lt;td&gt;0,0075 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 000 001+&lt;/td&gt;
&lt;td&gt;0,0073 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Le volume est calculé par type de numéro. Les volumes ne sont pas cumulables entre codes longs et numéros gratuits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qui influence votre facture Twilio
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Type de numéro de téléphone
&lt;/h3&gt;

&lt;p&gt;Le type de numéro (code long, gratuit, code court) détermine la grille tarifaire et les seuils de remise. Répartir le trafic entre plusieurs types peut empêcher d’atteindre les paliers de remise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Segments de message
&lt;/h3&gt;

&lt;p&gt;Chaque segment est facturé. Un texte long ou contenant des caractères Unicode multiplie le coût par message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frais d'opérateur
&lt;/h3&gt;

&lt;p&gt;Les opérateurs US ajoutent leur propre surtaxe par message, en plus du tarif Twilio. Ces frais sont répercutés directement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frais d'opérateur pour les codes longs (SMS sortants) :&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opérateur&lt;/th&gt;
&lt;th&gt;Frais d'envoi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;0,0035 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;0,0045 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;0,004 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;0,005 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tous les autres opérateurs&lt;/td&gt;
&lt;td&gt;0,004 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pour les MMS, ces frais sont plus élevés (AT&amp;amp;T : 0,009 $ par MMS ; T-Mobile : 0,01 $).&lt;/p&gt;

&lt;p&gt;Par exemple, un SMS sortant vers AT&amp;amp;T coûte 0,0083 $ (Twilio) + 0,0035 $ (opérateur) = &lt;strong&gt;0,0118 $ par segment&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pays de destination
&lt;/h3&gt;

&lt;p&gt;Les tarifs internationaux varient fortement. UK : 0,04 $/message ; Inde : 0,0029 $ ; Brésil : 0,075 $. Consultez &lt;a href="https://www.twilio.com/en-us/pricing/messaging" rel="noopener noreferrer"&gt;le CSV des tarifs Twilio&lt;/a&gt; pour tous les détails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enregistrement 10DLC
&lt;/h3&gt;

&lt;p&gt;Le système 10DLC US oblige les entreprises à enregistrer leur marque et leurs campagnes pour les SMS A2P sur code long. Sans cet enregistrement, le trafic est filtré par les opérateurs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coûts et frais cachés
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frais d'enregistrement 10DLC
&lt;/h3&gt;

&lt;p&gt;Depuis août 2025, la tarification a évolué.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enregistrement de marque&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marque individuelle ou standard faible volume : 4,50 $ (frais uniques)&lt;/li&gt;
&lt;li&gt;Marque standard avec vérification secondaire : 46 $ (frais uniques)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enregistrement de campagne&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vérification unique : 15 $ par campagne&lt;/li&gt;
&lt;li&gt;Mensuel récurrent : 1,50 $ à 10 $/mois selon le type&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de campagne&lt;/th&gt;
&lt;th&gt;Frais mensuels&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Entrepreneur individuel&lt;/td&gt;
&lt;td&gt;2 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mixte à faible volume&lt;/td&gt;
&lt;td&gt;1,50 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;td&gt;10 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organisation caritative/501(c)(3)&lt;/td&gt;
&lt;td&gt;3 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Services d'urgence&lt;/td&gt;
&lt;td&gt;5 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La vérification standard coûte 41,50 $. Les appels de vérification coûtent 11 $. Toute révision de soumission erronée coûte 12,50 $.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frais de numéro de téléphone
&lt;/h3&gt;

&lt;p&gt;Chaque numéro a un coût mensuel :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code long : 1,15 $/mois&lt;/li&gt;
&lt;li&gt;Numéro gratuit : 2,15 $/mois&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prévoyez ce coût si vous provisionnez plusieurs numéros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frais sur les messages échoués
&lt;/h3&gt;

&lt;p&gt;Twilio facture &lt;strong&gt;0,001 $ par message&lt;/strong&gt; avec le statut "Échec". Ce coût peut s’accumuler lors de débogages ou de filtrage par opérateur.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modules complémentaires
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raccourcissement de liens et suivi de clics&lt;/strong&gt; : 0,015 $ par message sortant après 1 000 gratuits/mois.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boîte à outils conformité (analyse IA)&lt;/strong&gt; : 0,015 $ par message sortant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Plans de support
&lt;/h3&gt;

&lt;p&gt;Le support gratuit est limité. Les plans payants démarrent à 250 $/mois ("Développeur"). Pour une entreprise qui dépend du SMS, prévoyez un plan de support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment Twilio se compare aux alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fournisseur&lt;/th&gt;
&lt;th&gt;SMS sortant US&lt;/th&gt;
&lt;th&gt;SMS entrant US&lt;/th&gt;
&lt;th&gt;Numéro de téléphone&lt;/th&gt;
&lt;th&gt;10DLC requis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;0,0083 $ + frais d'opérateur&lt;/td&gt;
&lt;td&gt;0,0083 $ + frais d'opérateur&lt;/td&gt;
&lt;td&gt;1,15 $/mois&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;0,005 $&lt;/td&gt;
&lt;td&gt;0,00035 $&lt;/td&gt;
&lt;td&gt;0,80 $/mois&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;0,004 $&lt;/td&gt;
&lt;td&gt;0,004 $&lt;/td&gt;
&lt;td&gt;1,00 $/mois&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bird (ex-MessageBird)&lt;/td&gt;
&lt;td&gt;~0,007 $&lt;/td&gt;
&lt;td&gt;~0,007 $&lt;/td&gt;
&lt;td&gt;Varie&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plivo et Telnyx sont plus économiques par message, surtout en réception. Telnyx intègre les frais d’opérateur différemment, ce qui complique la comparaison, mais leur tarif global est souvent inférieur.&lt;/p&gt;

&lt;p&gt;Twilio reste leader sur la documentation, la qualité API, l’écosystème et les intégrations. Si vous cherchez une expérience développeur optimale ou des fonctions avancées, le surcoût peut se justifier. Pour l’envoi massif à prix réduit, évaluez Telnyx ou Plivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment tester Twilio gratuitement
&lt;/h2&gt;

&lt;p&gt;Twilio propose un compte d’essai gratuit sans carte bancaire. Vous obtenez un petit crédit pour envoyer de vrais messages.&lt;/p&gt;

&lt;p&gt;Pendant l’essai, les messages à des numéros non vérifiés affichent un préfixe "Envoyé depuis votre compte d’essai Twilio". Pour supprimer ce préfixe, activez un compte payant.&lt;/p&gt;

&lt;p&gt;L’essai gratuit permet de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provisionner un numéro de test&lt;/li&gt;
&lt;li&gt;Envoyer et recevoir des SMS via l’API&lt;/li&gt;
&lt;li&gt;Tester la réception de webhooks&lt;/li&gt;
&lt;li&gt;Explorer la console Twilio et les logs d’utilisation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lorsque vous passez en payant, vous ne payez que ce que vous consommez, sans minimum mensuel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment tester votre intégration SMS Twilio avec Apidog
&lt;/h2&gt;

&lt;p&gt;Après configuration des identifiants Twilio et des webhooks, il est crucial de valider votre intégration. L’envoi manuel de messages ne détecte pas les incompatibilités de schéma ou les erreurs de payload.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgcuec6nm1uksjpraul5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgcuec6nm1uksjpraul5p.png" alt="Exemple Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La fonctionnalité &lt;strong&gt;Scénarios de test&lt;/strong&gt; d’&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; permet d’automatiser et d’enchaîner plusieurs requêtes API. Vous pouvez :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Importer la spécification OpenAPI de votre webhook Twilio dans un scénario de test&lt;/li&gt;
&lt;li&gt;Ajouter des étapes pour chaque flux : envoi SMS, réception de callback, gestion d’une réponse entrante&lt;/li&gt;
&lt;li&gt;Orchestrer en séquence via le mode d’orchestration&lt;/li&gt;
&lt;li&gt;Transférer des données entre étapes avec la syntaxe &lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt; (ex : chaîner les SIDs de message)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple de test automatisé Twilio :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Envoyer SMS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"To"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1xxxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"From"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1yyyyyyyyyy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"Body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Message de test"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vérifier callback"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://votre-app.com/webhook"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"MessageSid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{$.Envoyer SMS.response.body.sid}}"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le &lt;strong&gt;Test de Contrat&lt;/strong&gt; d’Apidog ajoute une vérification automatique des réponses API par rapport à votre OpenAPI :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Statut HTTP conforme à la doc&lt;/li&gt;
&lt;li&gt;Champs obligatoires présents dans le webhook&lt;/li&gt;
&lt;li&gt;Types corrects pour chaque champ (ex : SID en string)&lt;/li&gt;
&lt;li&gt;Aucun champ supplémentaire non défini, sauf si &lt;code&gt;additionalProperties&lt;/code&gt; autorisé&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce workflow s’intègre dans vos pipelines CI/CD, sans scripts d’assertion personnalisés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pour démarrer :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Téléchargez Apidog gratuitement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Importez votre spécification d’API Twilio ou définissez votre schéma de webhook&lt;/li&gt;
&lt;li&gt;Construisez un scénario de test qui reflète votre flux SMS&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;La tarification Twilio démarre à 0,0083 $ par segment sur code long US, mais le coût réel inclut les frais d’opérateur, la location de numéro et l’enregistrement 10DLC. Un SMS sortant AT&amp;amp;T revient à environ 0,0118 $ par segment. Pour les campagnes 10DLC standard, ajoutez 10 $/mois/campagne.&lt;/p&gt;

&lt;p&gt;La tarification est transparente et bien documentée, avec remises sur volume automatiques. Mais chaque poste compte : ne vous limitez pas au tarif affiché.&lt;/p&gt;

&lt;p&gt;Après modélisation de vos coûts, intégrez et testez votre solution. Les scénarios et tests de contrat Apidog valident vos flux webhook Twilio et assurent la conformité à votre spécification, sans code de test répétitif.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q : Quel est le prix de base d'un SMS sortant américain sur Twilio ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : 0,0083 $ par segment de message sur code long américain. Des frais d’opérateur s’ajoutent (ex : AT&amp;amp;T +0,0035 $).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Twilio facture-t-il les SMS entrants ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : Oui. 0,0083 $ par segment, code long et numéro gratuit. Des frais d’opérateur peuvent s’appliquer selon l’origine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Qu'est-ce que le 10DLC et dois-je le payer ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : 10DLC = système d’enregistrement US pour SMS A2P sur code long. Obligatoire pour les messages d’application à consommateurs US. Enregistrement de marque : 4,50 $ (frais uniques). Frais de campagne : 1,50 $ à 10 $/mois.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Combien coûte un code court Twilio ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : Code court aléatoire : 1 000 $/mois (trimestriel). Code court personnalisé : 1 500 $/mois. Frais de config MMS : 500 $. Tarif SMS : 0,0083 $/segment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Twilio offre-t-il des remises sur volume ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : Oui, automatiquement à partir de 150 000 messages/mois par type de numéro. Le tarif baisse par paliers jusqu’à 0,0073 $ pour 1M+ messages/mois. Des remises entreprise sont disponibles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Y a-t-il un essai gratuit pour Twilio ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : Oui. Compte d’essai avec crédits inclus, sans carte bancaire. Les messages sortants incluent un préfixe d’essai jusqu’à activation payante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q : Quelle est l’alternative Twilio la moins chère pour les SMS ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;R : Plivo (0,005 $ sortant, 0,00035 $ entrant) et Telnyx (0,004 $/message) sont moins chers. 10DLC requis pour l’A2P US. Twilio se distingue par sa documentation, son support et ses fonctionnalités avancées.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Prix API SMS Vonage : Tarifs 2026</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:54:49 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/prix-api-sms-vonage-tarifs-2026-32ng</link>
      <guid>https://dev.to/antoine_laurentt/prix-api-sms-vonage-tarifs-2026-32ng</guid>
      <description>&lt;h2&gt;
  
  
  EN BREF
&lt;/h2&gt;

&lt;p&gt;La tarification de l'API SMS Vonage commence à &lt;strong&gt;0,00809 $ par message sortant&lt;/strong&gt; et à &lt;strong&gt;0,00649 $ par message entrant&lt;/strong&gt; aux États-Unis. Aucun minimum mensuel : vous payez uniquement ce que vous consommez. Les tarifs internationaux varient selon le pays et peuvent dépasser 1,00 $ sur certains marchés. Pour développer ou tester une intégration SMS Vonage, &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; simplifie l'envoi de requêtes de test, la validation des réponses et la détection des erreurs avant le déploiement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Si vous avez déjà entendu parler de Nexmo, vous connaissez Vonage. Depuis l'acquisition de Nexmo par Vonage en 2016, la plateforme développeur est accessible via &lt;a href="https://developer.vonage.com" rel="noopener noreferrer"&gt;developer.vonage.com&lt;/a&gt;. En 2022, Ericsson a intégré Vonage tout en conservant la marque et l’activité API.&lt;/p&gt;

&lt;p&gt;Aujourd'hui, Vonage dessert plus de 100 000 entreprises et 1,6 million de développeurs enregistrés. La plateforme propose un modèle à l'usage, sans engagement, avec une couverture mondiale de plus de 190 pays.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Avant d'aller plus loin avec votre intégration, il est crucial de disposer d’un outil de test d’API fiable. &lt;strong&gt;Apidog&lt;/strong&gt; vous permet de créer des scénarios de test pour vos requêtes SMS Vonage, de valider les réponses selon des schémas prédéfinis et d’enchaîner plusieurs appels API dans un seul flux. Essayez Apidog gratuitement. Aucune carte de crédit requise.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Aperçu des tarifs SMS Vonage
&lt;/h2&gt;

&lt;p&gt;Vonage fonctionne en paiement à l'usage : pas de frais de plateforme, pas d'abonnement. Vous payez par message, selon le pays de destination et le type de numéro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principaux tarifs aux États-Unis :&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de message&lt;/th&gt;
&lt;th&gt;Prix par message&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS sortant (LVN américain)&lt;/td&gt;
&lt;td&gt;0,00809 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS entrant (LVN américain)&lt;/td&gt;
&lt;td&gt;0,00649 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS sortant (numéro gratuit américain)&lt;/td&gt;
&lt;td&gt;Contacter le service commercial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS entrant (numéro gratuit américain)&lt;/td&gt;
&lt;td&gt;Gratuit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LVN&lt;/strong&gt; = Numéro Virtuel Local (code long à 10 chiffres/10DLC).&lt;/li&gt;
&lt;li&gt;Téléchargez la feuille de tarifs mondiale depuis votre tableau de bord Vonage pour planifier vos campagnes internationales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ventilation des tarifs : sortant, entrant, MMS et WhatsApp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS sortant
&lt;/h3&gt;

&lt;p&gt;Envoyez des SMS depuis votre application vers les utilisateurs finaux. Tarif : &lt;strong&gt;0,00809 $/message&lt;/strong&gt; depuis un LVN US. Vérifiez toujours le tarif actuel sur le dashboard Vonage.&lt;/p&gt;

&lt;h3&gt;
  
  
  SMS entrant
&lt;/h3&gt;

&lt;p&gt;Réception sur un numéro Vonage loué : &lt;strong&gt;0,00649 $/message&lt;/strong&gt; aux US pour les LVN. Les numéros gratuits peuvent recevoir des SMS gratuitement — à vérifier selon votre compte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tarification MMS
&lt;/h3&gt;

&lt;p&gt;Les MMS sont pris en charge via l’API Messages. Pas de tarif public : contactez le service commercial pour obtenir les tarifs MMS selon vos marchés.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp via Vonage
&lt;/h3&gt;

&lt;p&gt;Vonage permet l'envoi de messages WhatsApp via son API Messages. Deux types de frais :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frais Meta&lt;/strong&gt; : Selon la catégorie de conversation (marketing, utilitaire, OTP, service). Consultez la tarification officielle WhatsApp de Meta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frais Vonage&lt;/strong&gt; : À partir de 0,00015 $/message, selon volume et catégorie.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Facebook Messenger
&lt;/h3&gt;

&lt;p&gt;Supporté à &lt;strong&gt;0,0011 $/message livré&lt;/strong&gt; via l’API Messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  RCS (Rich Communication Services)
&lt;/h3&gt;

&lt;p&gt;Tarifs RCS aux États-Unis, selon l’opérateur :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opérateur&lt;/th&gt;
&lt;th&gt;RCS Rich (texte)&lt;/th&gt;
&lt;th&gt;RCS Rich Media&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;0,00620 $&lt;/td&gt;
&lt;td&gt;0,01250 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;0,00400 $&lt;/td&gt;
&lt;td&gt;0,00600 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;0,00450 $&lt;/td&gt;
&lt;td&gt;0,01000 $&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;0,00620 $&lt;/td&gt;
&lt;td&gt;0,01350 $&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Frais de configuration unique de &lt;strong&gt;600 $/pays&lt;/strong&gt; pour le RCS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qui affecte votre facture Vonage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pays de destination
&lt;/h3&gt;

&lt;p&gt;Le coût varie fortement selon le pays. Consultez la feuille de tarifs avant de lancer une campagne internationale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type de numéro
&lt;/h3&gt;

&lt;p&gt;Trois types principaux (US) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code long (10DLC)&lt;/strong&gt; : Numéro local standard, idéal P2P/A2P.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numéro gratuit&lt;/strong&gt; : Débit élevé, entrant souvent gratuit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code court&lt;/strong&gt; : Pour très gros volumes, nécessite enregistrement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chaque type a ses tarifs par message et de location.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frais de location de numéro
&lt;/h3&gt;

&lt;p&gt;À partir de quelques dollars/mois pour un LVN US. Plus cher pour les numéros gratuits et les codes courts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encodage des messages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GSM-7 (standard)&lt;/strong&gt; : 160 caractères/SMS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unicode&lt;/strong&gt; : 70 caractères/SMS. Les messages plus longs sont facturés comme plusieurs SMS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Surcoûts des opérateurs
&lt;/h3&gt;

&lt;p&gt;Les opérateurs US appliquent des surcoûts (notamment en 10DLC A2P). Vonage les répercute : surveillez votre facture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coûts cachés à surveiller
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Niveaux de support
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gratuit : forums/doc.&lt;/li&gt;
&lt;li&gt;Commercial : forfait payant.&lt;/li&gt;
&lt;li&gt;Premium (24/7 + account manager) : &lt;strong&gt;3 300 $/mois&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  API additionnelles
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module complémentaire&lt;/th&gt;
&lt;th&gt;Coût mensuel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API d'audit&lt;/td&gt;
&lt;td&gt;550 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-rédaction (PII)&lt;/td&gt;
&lt;td&gt;1 100 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API de rapports&lt;/td&gt;
&lt;td&gt;495 $/mois (ou 0,00049 $/CDR à l'usage)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Coûts de l'API Verify
&lt;/h3&gt;

&lt;p&gt;Authentification à deux facteurs : &lt;strong&gt;0,0572 $/vérification réussie&lt;/strong&gt; + coûts SMS/voix pour chaque tentative.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enregistrement de numéro (10DLC US)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enregistrement de marque&lt;/strong&gt; : frais unique.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enregistrement de campagne&lt;/strong&gt; : frais mensuel récurrent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obligatoire pour l’envoi A2P via codes longs aux US.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonage contre les alternatives
&lt;/h2&gt;

&lt;p&gt;Tarifs SMS sortants/entrants US :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fournisseur&lt;/th&gt;
&lt;th&gt;SMS sortant US&lt;/th&gt;
&lt;th&gt;SMS entrant US&lt;/th&gt;
&lt;th&gt;Essai gratuit&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vonage&lt;/td&gt;
&lt;td&gt;0,00809 $&lt;/td&gt;
&lt;td&gt;0,00649 $&lt;/td&gt;
&lt;td&gt;Oui (numéros vérifiés uniquement)&lt;/td&gt;
&lt;td&gt;Niveaux payants ; 3 300 $/mois pour 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;0,0079 $&lt;/td&gt;
&lt;td&gt;0,0075 $&lt;/td&gt;
&lt;td&gt;Oui (crédit 15 $)&lt;/td&gt;
&lt;td&gt;Support payant dès 250 $/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;0,0055 $&lt;/td&gt;
&lt;td&gt;0,0005 $&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Basique gratuit ; payants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;0,004 $&lt;/td&gt;
&lt;td&gt;0,002 $&lt;/td&gt;
&lt;td&gt;Oui (crédit 5 $)&lt;/td&gt;
&lt;td&gt;Email 24/7 gratuit ; téléphone payant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;À retenir :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telnyx = le moins cher, mais plateforme jeune.&lt;/li&gt;
&lt;li&gt;Plivo = bons tarifs et réputé chez les développeurs.&lt;/li&gt;
&lt;li&gt;Twilio = écosystème et documentation les plus riches.&lt;/li&gt;
&lt;li&gt;Vonage = fiable, soutenu par Ericsson, tarifs intermédiaires.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le prix n'est qu'un critère : prenez aussi en compte la conformité, le support, la fiabilité et la qualité des outils.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment essayer Vonage gratuitement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.vonage.com/communications-apis/pricing/" rel="noopener noreferrer"&gt;Vonage propose un compte d’essai gratuit.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ce que vous obtenez
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Numéro virtuel Vonage pour tests&lt;/li&gt;
&lt;li&gt;Identifiants API (clé + secret)&lt;/li&gt;
&lt;li&gt;Accès à la documentation et aux SDK&lt;/li&gt;
&lt;li&gt;Crédits de test pour envoyer un nombre limité de messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ce qui est restreint
&lt;/h3&gt;

&lt;p&gt;Vous ne pouvez tester qu’avec des numéros que vous avez vérifiés sur votre compte, jusqu’à upgrade vers un compte payant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comment commencer
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Rendez-vous sur &lt;a href="https://dashboard.nexmo.com" rel="noopener noreferrer"&gt;dashboard.nexmo.com&lt;/a&gt; ou &lt;a href="https://www.vonage.com/communications-apis/" rel="noopener noreferrer"&gt;vonage.com/communications-apis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Créez un compte gratuit avec email&lt;/li&gt;
&lt;li&gt;Vérifiez votre numéro de téléphone&lt;/li&gt;
&lt;li&gt;Récupérez votre clé API et votre secret dans le dashboard&lt;/li&gt;
&lt;li&gt;Effectuez votre premier appel API via REST ou un SDK officiel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ueumbyjp6vt2xicifxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ueumbyjp6vt2xicifxk.png" alt="Interface Apidog pour la création de requêtes de test API avec les détails de l'API SMS Vonage." width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDKs disponibles pour Node.js, Python, PHP, Ruby, Java, .NET, Go, ou utilisez directement l’API REST avec n’importe quel client HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment tester votre intégration SMS Vonage avec Apidog
&lt;/h2&gt;

&lt;p&gt;Après avoir obtenu votre clé API et votre secret Vonage, vous devez valider votre intégration localement avant passage en production. Apidog automatise ces tests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi04oh5iormtlr02zuvt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi04oh5iormtlr02zuvt3.png" alt="Interface de scénario de test d'Apidog montrant les étapes d'envoi et de validation de messages SMS." width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration d’un scénario de test
&lt;/h3&gt;

&lt;p&gt;Dans Apidog, module &lt;strong&gt;Tests&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Importez votre spec API (OpenAPI pour SMS Vonage)&lt;/li&gt;
&lt;li&gt;Ajoutez une requête personnalisée vers &lt;code&gt;https://rest.nexmo.com/sms/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ou importez une commande cURL depuis la doc Vonage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple de payload POST :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VOTRE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api_secret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VOTRE_API_SECRET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NUMERO_DESTINATAIRE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NUMERO_EXPEDITEUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Message de test"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validation de la réponse
&lt;/h3&gt;

&lt;p&gt;Définissez vos assertions dans Apidog :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code HTTP = 200&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].status&lt;/code&gt; == &lt;code&gt;"0"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].message-id&lt;/code&gt; non vide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Toute erreur (status ≠ 0) fait échouer explicitement le test : vous voyez la réponse complète pour le débogage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transmission de données entre requêtes
&lt;/h3&gt;

&lt;p&gt;Pour chaîner des tests (ex. envoyer un SMS puis vérifier son statut), utilisez la syntaxe :&lt;br&gt;&lt;br&gt;
&lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Exemple : extraire &lt;code&gt;message-id&lt;/code&gt; d’une réponse et l’utiliser dans une étape suivante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exécution des tests en CI/CD
&lt;/h3&gt;

&lt;p&gt;Apidog s’intègre à GitHub Actions, GitLab CI, Jenkins. Exportez votre scénario de test et exécutez-le en CLI pour détecter toute régression d’intégration SMS avant production.&lt;/p&gt;

&lt;p&gt;Essayez gratuitement sur &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;apidog.com&lt;/a&gt;. Aucune carte de crédit requise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;La tarification SMS Vonage est à l’usage, sans minimum mensuel. SMS sortant US : 0,00809 $/message ; entrant : 0,00649 $. Les coûts varient selon le pays, le type de numéro et l’encodage. Les modules premium (audit, auto-rédaction, support 24/7) ajoutent des frais mensuels : budgétez-les dès le départ.&lt;/p&gt;

&lt;p&gt;En alternative, Telnyx et Plivo sont moins chers, Twilio domine en intégrations. Vonage combine fiabilité et couverture internationale grâce à Ericsson.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avant production, créez des scénarios de test Apidog pour valider chaque flux Vonage.&lt;/strong&gt; Testez, validez, détectez les erreurs avant la mise en ligne.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vonage est-il identique à Nexmo ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Vonage a acquis Nexmo en 2016. La plateforme développeur reste accessible via &lt;a href="https://developer.vonage.com" rel="noopener noreferrer"&gt;developer.vonage.com&lt;/a&gt;, et beaucoup d'intégrations utilisent encore &lt;code&gt;rest.nexmo.com&lt;/code&gt; comme endpoint API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage facture-t-il des frais mensuels pour les SMS ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Non : pas de frais mensuels pour l’API SMS elle-même. Vous payez à l’usage et pour la location de numéro. Les modules complémentaires (audit, auto-rédaction) sont facturés mensuellement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combien coûte un numéro de téléphone Vonage ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Numéro local US : quelques dollars/mois. Numéro gratuit ou code court : plus cher. Consultez le dashboard pour les tarifs à jour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quels pays sont pris en charge par les SMS Vonage ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Plus de 190 pays. Tarifs très variables : certains marchés &amp;gt;0,50 $/message. Téléchargez la feuille de tarifs mondiale pour le détail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage offre-t-il des réductions de volume ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, pour les gros volumes. Contactez le service commercial pour un tarif personnalisé. Le tarif à l'usage s'applique par défaut.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puis-je recevoir des SMS entrants gratuitement ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Souvent gratuit pour les numéros gratuits US. LVN US : 0,00649 $/message entrant. Consultez la tarification selon votre pays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment Vonage se compare-t-il à Twilio pour les SMS ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Vonage (0,00809 $) est légèrement plus cher que Twilio (0,0079 $) pour le SMS sortant US. Twilio a plus d’intégrations et un plus grand écosystème. Vonage se distingue par la fiabilité réseau (Ericsson) et ses tarifs internationaux compétitifs. Pour l’A2P pur US, la différence est minime : l’expérience développeur et le support feront souvent la différence.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cursor 3 : Implications pour les développeurs d'API</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:50:31 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/cursor-3-implications-pour-les-developpeurs-dapi-g5o</link>
      <guid>https://dev.to/antoine_laurentt/cursor-3-implications-pour-les-developpeurs-dapi-g5o</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR :&lt;/strong&gt; Cursor 3, lancé le 2 avril 2026, remplace l’interface centrée IDE par un espace de travail piloté par agents. Pour les développeurs d’API, les nouveautés clés sont l’exécution parallèle d’agents, des sorties d’outils MCP enrichies, et un transfert cloud/local sans interruption de workflow. Connecté au serveur MCP d’Apidog, vos agents IA peuvent lire la spécification API en direct et générer du code conforme, sans copier-coller.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Le changement attendu : agents au centre
&lt;/h2&gt;

&lt;p&gt;Les éditeurs de code IA ont progressé, mais Cursor 3 n’est pas une simple mise à jour. Il redéfinit l’environnement de développement IA.&lt;/p&gt;

&lt;p&gt;Avant Cursor 3 : vous utilisiez l’IDE classique, faisiez appel à un agent ponctuellement, puis repreniez la main sur le code. Les agents étaient des assistants optionnels.&lt;/p&gt;

&lt;p&gt;Avec Cursor 3 : les agents deviennent l’unité de travail principale. Gérez-les comme des onglets de navigateur, lancez-les en parallèle, vérifiez leurs résultats, et promouvez le meilleur.&lt;/p&gt;

&lt;p&gt;Pour les développeurs d’API, c’est particulièrement pertinent. Les tâches d’API exigent coordination et parallélisme : endpoints, tests de contrat, documentation, gestion des schémas. Cursor 3 permet de gérer ces tâches comme elles se produisent en réalité.&lt;/p&gt;

&lt;p&gt;💡Cursor 3 ne connaît pas votre spécification API par défaut. Connectez le serveur MCP d'Apidog pour permettre à vos agents d’extraire vos schémas OpenAPI, définitions de endpoints, et scénarios de test directement depuis Apidog. Résultat : moins d’hallucinations, du code généré conforme.&lt;/p&gt;

&lt;p&gt;Cet article détaille les évolutions majeures de Cursor 3 pour le développement d’API, et propose un workflow concret liant Cursor 3 au serveur MCP d’Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quoi de neuf dans Cursor 3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cursor.com/blog/cursor-3" rel="noopener noreferrer"&gt;Cursor 3&lt;/a&gt; introduit la Fenêtre des Agents, mais aussi plusieurs fonctionnalités clés pour les développeurs d’API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fenêtre des Agents
&lt;/h3&gt;

&lt;p&gt;La Fenêtre des Agents remplace l’éditeur comme centre du workflow. Lancez des agents sur plusieurs dépôts (local, worktree git, cloud Cursor, SSH distant) en parallèle.&lt;/p&gt;

&lt;p&gt;Accès rapide : &lt;code&gt;Cmd+Shift+P -&amp;gt; Agents Window&lt;/code&gt;. L’IDE reste disponible à côté si besoin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4oyy02bv4kn9xdm2zubf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4oyy02bv4kn9xdm2zubf.png" alt="Fenêtre des Agents" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cas d’utilisation :&lt;/strong&gt; lancez un agent pour scaffolder un endpoint, pendant qu’un autre corrige un bug ailleurs. Observez, intervenez, validez les diffs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mode Conception
&lt;/h3&gt;

&lt;p&gt;Dans la Fenêtre des Agents, le Mode Conception permet d’annoter l’interface web directement. Sélectionnez, surlignez des éléments, ajoutez-les au contexte d’agent sans écrire de descriptions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cmd+Shift+D&lt;/code&gt; pour basculer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Shift+glisser&lt;/code&gt; pour sélectionner une zone&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+L&lt;/code&gt; pour ajouter au chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pfv5dbgfl43dnkza119.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pfv5dbgfl43dnkza119.png" alt="Mode Conception" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Applications MCP : sorties structurées
&lt;/h3&gt;

&lt;p&gt;Les applications MCP supportent désormais les sorties structurées. Avant, les retours d’outils étaient du texte ; maintenant, ils peuvent renvoyer des données typées.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F479ffyk6lfbdc6dsuua9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F479ffyk6lfbdc6dsuua9.png" alt="Sortie structurée" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour le serveur MCP d’Apidog, cela signifie que les définitions de endpoints, schémas, résultats de test sont accessibles dans un format exploitable par les agents Cursor. Moins d’ambiguïtés.&lt;/p&gt;

&lt;h3&gt;
  
  
  Worktrees, /best-of-n et isolation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/worktree&lt;/code&gt; : crée un worktree git isolé. Testez des modifications sans impacter la branche principale.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/best-of-n&lt;/code&gt; : exécute une tâche sur plusieurs modèles (Claude, GPT-4o, Gemini, etc.) en parallèle, chacun dans son worktree. Comparez, sélectionnez le meilleur résultat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple :&lt;/strong&gt; implémenter un endpoint complexe, comparer trois solutions générées.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transfert cloud/local
&lt;/h3&gt;

&lt;p&gt;Lancez une tâche longue dans le cloud Cursor, puis rapatriez-la localement pour tester sur vos services. Ou poussez une session dans le cloud avant de fermer votre session. Flexibilité totale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impact sur le développement d’API : workflows pratiques
&lt;/h2&gt;

&lt;p&gt;Le développement d’API implique beaucoup de changements de contexte : spécification, client API (&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;), éditeur, terminal, docs. Cursor 3 améliore la coordination et le parallélisme côté agents, mais le vrai gain vient de la couche MCP connectée à vos outils.&lt;/p&gt;

&lt;h3&gt;
  
  
  Développement parallèle d’endpoints
&lt;/h3&gt;

&lt;p&gt;Plus besoin d’échafauder vos endpoints un par un. Décrivez chaque endpoint à une instance d’agent distincte, laissez-les travailler en parallèle, puis révisez et fusionnez les meilleures solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Génération de code sensible au schéma
&lt;/h3&gt;

&lt;p&gt;Sans accès à la spécification OpenAPI, l’agent devine la structure. Avec le serveur MCP d’&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, l’agent extrait la structure réelle : champs, types, énumérations, objets imbriqués. Moins de corrections manuelles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test de contrat dans l’éditeur
&lt;/h3&gt;

&lt;p&gt;Les agents Cursor 3 peuvent exécuter la CLI Apidog dans leur workflow :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; &amp;lt;test-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Décrivez le comportement, l’agent génère l’implémentation, exécute les tests, itère automatiquement en cas d’échec. Vous supervisez.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation synchronisée
&lt;/h3&gt;

&lt;p&gt;Les agents Cursor 3 peuvent lire la documentation Apidog via MCP et comparer la spéc avec le code. Ils signalent les divergences pour action immédiate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Nécessite une configuration initiale, mais les fondations sont là pour garder doc et code alignés.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ce qui ne change pas
&lt;/h3&gt;

&lt;p&gt;Cursor 3 ne remplace pas vos outils de test avancés : pas de détection automatique d’erreurs d’auth, ou de test de montée en charge. La qualité des sorties MCP dépend aussi du serveur utilisé : le serveur MCP d’Apidog gère le contenu structuré, d’autres non.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow concret : Cursor 3 + Serveur MCP Apidog
&lt;/h2&gt;

&lt;p&gt;Voici comment utiliser Cursor 3 avec le serveur MCP d’&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; pour automatiser vos tâches API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;Ajoutez le serveur MCP Apidog dans Cursor :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apidog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_access_token"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Récupérez votre token dans Apidog &amp;gt; Paramètres du compte &amp;gt; Jeton d’accès API. Les agents Cursor peuvent alors appeler des outils MCP comme &lt;code&gt;get_endpoint_detail&lt;/code&gt;, &lt;code&gt;list_endpoints&lt;/code&gt;, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemple : scaffolder un endpoint depuis la spécification
&lt;/h3&gt;

&lt;p&gt;Supposons que vous ajoutiez &lt;code&gt;POST /invoices&lt;/code&gt; à votre spéc Apidog. Dans la Fenêtre des Agents, lancez une session :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Recherchez l’endpoint POST /invoices dans le projet Apidog. Lisez ses schémas de requête et de réponse. Générez un handler Node.js/Express conforme. Puis exécutez le scénario de test associé."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L’agent va :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Appeler &lt;code&gt;get_endpoint_detail&lt;/code&gt; via MCP.&lt;/li&gt;
&lt;li&gt;Générer le code selon le schéma réel.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exécuter :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; invoice-creation-test &lt;span class="nt"&gt;--env&lt;/span&gt; staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Corriger si les assertions échouent.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vous validez le diff final.&lt;/p&gt;

&lt;h3&gt;
  
  
  /best-of-n pour endpoints complexes
&lt;/h3&gt;

&lt;p&gt;Pour un endpoint compliqué, utilisez &lt;code&gt;/best-of-n&lt;/code&gt; : trois agents génèrent chacun une version, tous lisant la même spéc Apidog via MCP. Comparez les branches worktree, gardez la meilleure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Garder la documentation à jour
&lt;/h3&gt;

&lt;p&gt;Après déploiement :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Vérifiez la documentation Apidog pour POST /invoices. Comparez-la au code dans invoices.js. Signalez toute divergence. Si besoin, mettez à jour la spéc Apidog."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L’agent lit les deux via MCP, propose des corrections. La synchronisation doc/code devient une étape du cycle de revue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Démarrage rapide : configuration étape par étape
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Mettre à niveau Cursor
&lt;/h3&gt;

&lt;p&gt;Téléchargez la dernière version sur &lt;a href="https://cursor.com" rel="noopener noreferrer"&gt;cursor.com&lt;/a&gt;. Vérifiez &lt;code&gt;Agents Window&lt;/code&gt; dans la palette de commandes (&lt;code&gt;Cmd+Shift+P&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 2 : Générer un jeton d’accès Apidog
&lt;/h3&gt;

&lt;p&gt;Connectez-vous à &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;. Générer un nouveau jeton (Paramètres du compte &amp;gt; Jeton d’accès API). Copiez-le.&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 3 : Ajouter le serveur MCP Apidog à Cursor
&lt;/h3&gt;

&lt;p&gt;Dans Paramètres Cursor &amp;gt; MCP :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apidog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_PROJECT_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_project_id"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L’ID projet est dans l’URL Apidog. Sauvegardez, redémarrez Cursor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 4 : Vérifier la connexion
&lt;/h3&gt;

&lt;p&gt;Dans la Fenêtre des Agents :&lt;br&gt;&lt;br&gt;
Tapez « Listez les endpoints de mon projet Apidog. »&lt;br&gt;&lt;br&gt;
L’agent doit afficher vos endpoints : c’est prêt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 5 : Installer et configurer la CLI Apidog
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depuis Apidog, ouvrez un scénario de test, onglet CI/CD : copiez la commande CLI générée. Exécutez-la dans le terminal intégré Cursor, ou demandez à un agent de le faire.&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 6 : Exécuter votre première tâche agent/MCP
&lt;/h3&gt;

&lt;p&gt;Dans la Fenêtre des Agents :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Recherchez le schéma de l’objet Utilisateur dans Apidog. Générez une interface TypeScript qui y correspond exactement."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Comparez le résultat à la spécification réelle.&lt;/p&gt;

&lt;p&gt;À partir de là, automatisez : lecture de spéc, génération de code, exécution de tests, le tout dans une session d’agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour conclure
&lt;/h2&gt;

&lt;p&gt;Cursor 3 fait passer le développement IA d’un workflow centré éditeur à une orchestration par agents, en phase avec la réalité du développement d’API moderne : endpoints multiples, services variés, environnements parallèles.&lt;/p&gt;

&lt;p&gt;La sortie structurée MCP, peu visible dans le changelog, est un atout majeur pour les développeurs d’API. Avec des données propres issues d'&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, vos agents Cursor génèrent du code plus fiable, avec moins de corrections et d’itérations.&lt;/p&gt;

&lt;p&gt;Associer Cursor 3 au serveur MCP et à la CLI Apidog, c’est obtenir un agent IA qui connaît réellement votre API, lit la spécification, génère le code adéquat, et exécute les tests pour vérifier. Ce n’est pas une démo : c’est un workflow exploitable au quotidien.&lt;/p&gt;

&lt;h2&gt;
  
  
  Foire aux questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Est-ce que Cursor 3 remplace l’interface IDE existante ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Non. La Fenêtre des Agents est une nouvelle interface. L’IDE reste accessible à tout moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Différence clé entre Cursor 3 et l’ancienne version ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cursor 3 est centré sur les agents : exécution parallèle, transfert cloud/local, Mode Conception, &lt;code&gt;/worktree&lt;/code&gt;, &lt;code&gt;/best-of-n&lt;/code&gt;. L’éditeur reste disponible en complément.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connexion du serveur MCP Apidog à Cursor 3 ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ajoutez la configuration MCP dans les paramètres Cursor. Le serveur expose endpoints, schémas et scénarios Apidog comme outils utilisables par les agents. Le support du contenu structuré permet à Cursor de recevoir des données typées.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exécution automatique de scénarios de test Apidog par les agents Cursor 3 ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, via la CLI : les agents peuvent exécuter des commandes terminal, lire les sorties, et ajuster le code en fonction des résultats de test. Boucle code/validation resserrée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Faut-il un abonnement payant à Cursor pour utiliser la Fenêtre des Agents ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
La Fenêtre des Agents est incluse pour tous les forfaits. L’exécution cloud (agents actifs hors ligne) requiert un abonnement payant. Les agents locaux fonctionnent en gratuit. Voir &lt;a href="https://cursor.com/pricing" rel="noopener noreferrer"&gt;cursor.com/pricing&lt;/a&gt; pour les détails.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comment exécuter Gemma 4 comme API Backend ?</title>
      <dc:creator>Antoine Laurent</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:43:05 +0000</pubDate>
      <link>https://dev.to/antoine_laurentt/comment-executer-gemma-4-comme-api-backend--3ic3</link>
      <guid>https://dev.to/antoine_laurentt/comment-executer-gemma-4-comme-api-backend--3ic3</guid>
      <description>&lt;p&gt;En bref :&lt;br&gt;&lt;br&gt;
Google a lancé Gemma 4 en avril 2026, une famille de quatre modèles ouverts sous licence Apache 2.0 qui surpasse des modèles 20 fois plus grands sur les benchmarks standards. Vous pouvez appeler l'API Gemma 4 via Google AI Studio, Vertex AI, ou l'exécuter localement avec Ollama et vLLM. Associez-le à Smart Mock d'Apidog pour générer automatiquement des réponses API réalistes à partir de vos schémas OpenAPI sans écrire une seule règle de mock.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Essayez Apidog dès aujourd'hui&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;La plupart des modèles d'IA open-source vous obligent à choisir : capacité brute ou déployabilité. Soit vous obtenez un modèle trop grand pour fonctionner sur votre ordinateur portable, soit un petit modèle qui ne peut pas gérer le raisonnement en plusieurs étapes. Gemma 4 brise ce compromis.&lt;/p&gt;

&lt;p&gt;Gemma 4 est la famille de modèles ouverts la plus performante de Google DeepMind à ce jour. Le modèle 31B Dense se classe 3e parmi tous les modèles ouverts sur le classement d'Arena AI, battant des concurrents 20 fois plus grands. Le 26B Mixture of Experts (MoE) occupe la 6e place. Les deux fonctionnent sur un seul GPU de 80 Go. Les modèles légers E2B et E4B fonctionnent complètement hors ligne sur les téléphones et les appareils périphériques.&lt;/p&gt;

&lt;p&gt;Pour les développeurs d'API, cela est plus important qu'il n'y paraît. Gemma 4 prend en charge nativement l'appel de fonctions, la sortie JSON structurée et des fenêtres de contexte de 256K. Cela en fait un choix pratique pour construire des outils d'API basés sur l'IA, de la génération de données de test à l'écriture de mocks en passant par l'analyse des réponses API.&lt;/p&gt;

&lt;p&gt;💡Si vous développez avec Gemma 4 et avez besoin de valider ces réponses générées par l'IA par rapport à votre spécification OpenAPI, le moteur Smart Mock d'Apidog peut générer automatiquement des réponses de mock conformes au schéma à partir de votre définition d'API. Vous n'avez pas besoin d'écrire des règles de mock individuelles ; Smart Mock lit votre schéma et produit instantanément des données contextuellement appropriées. Téléchargez Apidog gratuitement et connectez-le à votre flux de travail d'API Gemma 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce que Gemma 4 et quoi de neuf
&lt;/h2&gt;

&lt;p&gt;Gemma 4 est la quatrième génération de modèles de langage ouverts de Google DeepMind. Le nom « Gemma » vient du latin pour pierre précieuse. Depuis début 2024, les modèles Gemma ont été téléchargés plus de 400 millions de fois et la communauté a construit plus de 100 000 variantes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzbpjh1grry85motv4r3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzbpjh1grry85motv4r3.png" alt="image-52.png" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma 4 est lancé sous une &lt;a href="https://goo.gle/gemma-4-apache-2" rel="noopener noreferrer"&gt;licence Apache 2.0&lt;/a&gt;, un changement crucial pour l'usage et la distribution commerciale.&lt;/p&gt;

&lt;p&gt;L'innovation majeure de Gemma 4 est l’« intelligence par paramètre » : le modèle 31B Dense offre des performances proches de GPT-4 ou Claude 3 Sonnet à une fraction du coût de calcul, surclassant même des modèles de plus de 600B de paramètres sur Arena AI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l4n6u3rs2tmchuq8rcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l4n6u3rs2tmchuq8rcy.png" alt="image-51.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nouveautés principales par rapport à Gemma 3 :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entrée multimodale native.&lt;/strong&gt; Traitement natif des images et vidéos (E2B/E4B ajoutent l’audio pour la reconnaissance vocale).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fenêtres de contexte étendues.&lt;/strong&gt; Jusqu’à 256K tokens sur les modèles 26B/31B.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support agents &amp;amp; appel de fonctions natif.&lt;/strong&gt; Sortie JSON structurée et instructions système incluses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raisonnement avancé.&lt;/strong&gt; 31B excelle en mathématiques et instructions multi-étapes, utile pour la génération de tests d’API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support multilingue natif (140+ langues).&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Licence Apache 2.0&lt;/strong&gt; pour une exploitation commerciale sans friction juridique.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variantes et capacités des modèles Gemma 4
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modèle&lt;/th&gt;
&lt;th&gt;Paramètres&lt;/th&gt;
&lt;th&gt;Paramètres actifs (inférence)&lt;/th&gt;
&lt;th&gt;Contexte&lt;/th&gt;
&lt;th&gt;Idéal pour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E2B&lt;/td&gt;
&lt;td&gt;2B effectifs&lt;/td&gt;
&lt;td&gt;~2B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Mobile, IoT, périphérie hors ligne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B&lt;/td&gt;
&lt;td&gt;4B effectifs&lt;/td&gt;
&lt;td&gt;~4B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Téléphones, Raspberry Pi, Jetson Orin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26B MoE&lt;/td&gt;
&lt;td&gt;26B au total&lt;/td&gt;
&lt;td&gt;~3.8B actifs&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Tâches serveur sensibles à la latence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31B Dense&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Qualité maximale, recherche, affinage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Les modèles E2B/E4B utilisent une architecture Mixture of Experts pour optimiser la consommation de ressources sur appareils contraints. Le 26B MoE active 3.8B paramètres à l’inférence : idéal pour le serveur à faible latence. Le 31B Dense est dédié à la qualité maximale, notamment pour la génération de réponses API complexes ou l’affinage domaine-spécifique.&lt;/p&gt;

&lt;p&gt;Pour un usage API, privilégiez le 26B MoE pour l’équilibre vitesse/qualité, ou le 31B Dense pour la génération de JSON structuré. Tous supportent l'appel de fonctions et la sortie JSON native.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration de l'API Gemma 4 : étape par étape
&lt;/h2&gt;

&lt;p&gt;Trois méthodes pour utiliser Gemma 4 selon vos besoins :&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1 : Google AI Studio (prototypage rapide)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Créez un compte sur &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt; et générez une clé API.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installez le SDK Python :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;google-genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Premier appel simple :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a JSON object for a user account with id, email, and created_at fields.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pour forcer une sortie JSON structurée :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_mime_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate 3 sample user objects for an e-commerce API. 
Each user should have: id (integer), email (string), username (string), 
created_at (ISO 8601 timestamp), and subscription_tier (free|pro|enterprise).
Return as a JSON array.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 2 : Déploiement local avec Ollama
&lt;/h3&gt;

&lt;p&gt;Exécutez Gemma 4 localement :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installez Ollama depuis &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Téléchargez le modèle :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Démarrez le serveur :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Appel via API OpenAI-compatible :&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a valid JSON response for a REST API /products endpoint. Include id, name, price, and stock fields.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 3 : Appel de fonction pour l'orchestration d’API
&lt;/h3&gt;

&lt;p&gt;Utilisez l'appel de fonctions natif pour orchestrer des pipelines automatisés :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function_declarations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_api_schema&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retrieve the OpenAPI schema for a given endpoint path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoint_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The API endpoint path, e.g. /users/{id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                        &lt;span class="p"&gt;},&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PUT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DELETE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PATCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoint_path&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I need to test the GET /users/{id} endpoint. What schema should the response follow?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model called function: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;With args: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ce schéma permet d’intégrer Gemma 4 dans des pipelines de test d’API automatisés.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construire des mocks d'API basés sur l'IA avec Gemma 4
&lt;/h2&gt;

&lt;p&gt;Pour générer des données de mock à partir d’un schéma OpenAPI :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_mime_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pattern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;^ORD-[0-9]{6}$&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delivered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancelled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unit_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date-time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Generate 5 realistic mock responses for an order management API.
Each response must conform exactly to this JSON Schema:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Make the data realistic: use realistic prices, product IDs, and varied statuses.
Return as a JSON array of 5 order objects.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mock_orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gemma 4 comprend et respecte les contraintes de votre schéma JSON : énumérations, motifs, plages de valeurs, etc. Pour aller plus loin, vous pouvez fournir le schéma complet de votre endpoint ou l’ensemble de votre spec OpenAPI pour générer des mocks sur plusieurs endpoints.&lt;/p&gt;

&lt;p&gt;Workflow recommandé : exportez votre collection Apidog comme spéc OpenAPI, collez-la dans le prompt, et demandez à Gemma 4 de générer 10 cas de test réalistes par endpoint. Vous obtenez un jeu de mock complet en quelques secondes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tester les réponses de l'API Gemma 4 avec Apidog
&lt;/h2&gt;

&lt;p&gt;Pour valider automatiquement les réponses générées par Gemma 4 :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuylv8atrfpes4nysaff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzuylv8atrfpes4nysaff.png" alt="image-53.png" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 1 :&lt;/strong&gt; Importez votre endpoint d'API Gemma 4 dans Apidog.&lt;br&gt;&lt;br&gt;
Définissez l’URL (Google AI Studio ou wrapper custom) et le schéma de réponse attendu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 2 :&lt;/strong&gt; Utilisez Smart Mock d'Apidog pour générer des réponses de référence directement depuis le schéma.&lt;br&gt;&lt;br&gt;
Smart Mock infère des données réalistes selon les noms et types de champs (par exemple, un champ &lt;code&gt;email&lt;/code&gt; reçoit une adresse e-mail valide).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F397ntwjhpdvd3crnuv5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F397ntwjhpdvd3crnuv5d.png" alt="image-54.png" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 3 :&lt;/strong&gt; Créez un Scénario de Test dans Apidog.&lt;br&gt;&lt;br&gt;
Ajoutez l’appel API Gemma 4, puis des assertions pour vérifier la réponse.&lt;/p&gt;

&lt;p&gt;Exemple de scénario :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authentification (obtenir un token)&lt;/li&gt;
&lt;li&gt;Appel à Gemma 4 avec ce token&lt;/li&gt;
&lt;li&gt;Extraction du JSON généré&lt;/li&gt;
&lt;li&gt;Validation du JSON selon le schéma&lt;/li&gt;
&lt;li&gt;Passage du résultat à un endpoint POST suivant&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Étape 4 :&lt;/strong&gt; Ajoutez vos assertions (codes statut, headers, structure JSON).&lt;br&gt;&lt;br&gt;
Utilisez le processeur d’extraction de variable pour réutiliser la sortie Gemma 4 dans les étapes suivantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 5 :&lt;/strong&gt; Exécutez en mode Data-driven.&lt;br&gt;&lt;br&gt;
Importez un CSV/JSON de jeux de données, lancez 50 variations de tests d'un clic.&lt;br&gt;&lt;br&gt;
Le setup complet prend 15 minutes et s’automatise via la CLI Apidog dans un pipeline CI/CD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cas d'utilisation concrets
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Génération de données de test API.&lt;/strong&gt;
Générez des centaines de fixtures réalistes via le schéma OpenAPI et le mode JSON natif de Gemma 4.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mocking API intelligent.&lt;/strong&gt;
Réponses dynamiques selon la requête, sans coder chaque cas à la main.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Génération de documentation API.&lt;/strong&gt;
Gemma 4 peut lire l’intégralité d’une base code ou d’une spec pour produire la documentation OpenAPI manquante.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation du schéma de réponse.&lt;/strong&gt;
Analysez les réponses d’API tierces pour détecter les écarts de schéma.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Écriture automatisée de tests de régression.&lt;/strong&gt;
Donnez à Gemma 4 vos specs et rapports de bugs, il génère des cas de test avancés.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 vs autres modèles ouverts pour l'utilisation d'API
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modèle&lt;/th&gt;
&lt;th&gt;Paramètres&lt;/th&gt;
&lt;th&gt;Contexte&lt;/th&gt;
&lt;th&gt;Sortie JSON&lt;/th&gt;
&lt;th&gt;Appel de fonction&lt;/th&gt;
&lt;th&gt;Licence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 26B MoE&lt;/td&gt;
&lt;td&gt;26B (3.8B actifs)&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3 70B&lt;/td&gt;
&lt;td&gt;70B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Via requête&lt;/td&gt;
&lt;td&gt;Via requête&lt;/td&gt;
&lt;td&gt;Communauté&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral 7B&lt;/td&gt;
&lt;td&gt;7B&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;Via requête&lt;/td&gt;
&lt;td&gt;Limité&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 2.5 72B&lt;/td&gt;
&lt;td&gt;72B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pour l’outillage API, les critères essentiels sont : sortie JSON native, appel de fonction, longueur du contexte, et licence claire. Gemma 4 coche toutes les cases avec une efficacité GPU supérieure à Llama et un coût d’infrastructure plus bas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Gemma 4 est une solution ouverte puissante pour automatiser la génération et la validation de réponses API. Licence Apache 2.0, appel de fonctions natif, sortie JSON structurée : adoptez-le pour vos outils API modernes.&lt;/p&gt;

&lt;p&gt;Associez Gemma 4 à Apidog pour un workflow complet :  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Génération de données de test et de mocks avec Gemma 4
&lt;/li&gt;
&lt;li&gt;Prototypage de schémas et mocks via Smart Mock
&lt;/li&gt;
&lt;li&gt;Validation automatisée via les Scénarios de Test Apidog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Facile à mettre en place, et prêt pour l’intégration CI/CD. Passez à l’action sur vos API dès aujourd’hui.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce que Gemma 4 ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Gemma 4 est la dernière famille de modèles de langage ouverts de Google DeepMind, lancée en avril 2026. Elle est disponible en quatre tailles (E2B, E4B, 26B MoE, 31B Dense) et est sous licence Apache 2.0. Le modèle 31B se classe actuellement 3e parmi tous les modèles ouverts sur le classement de texte d'Arena AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Est-ce que Gemma 4 est gratuit ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Les poids du modèle sont téléchargeables et utilisables gratuitement sous la licence Apache 2.0. Vous payez pour le calcul lorsque vous l'exécutez vous-même. Si vous utilisez Google AI Studio, il existe un niveau gratuit avec des limites de débit. Vertex AI facture les tarifs de calcul standard de Google Cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 peut-il produire du JSON structuré ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Gemma 4 prend en charge un paramètre natif &lt;code&gt;response_mime_type: "application/json"&lt;/code&gt; via le SDK Google Generative AI. Cela force le modèle à renvoyer du JSON valide à chaque fois, ce qui est essentiel pour les intégrations d'API où vous analysez la sortie par programmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment Gemma 4 se compare-t-il à GPT-4o pour le développement d'API ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GPT-4o est un modèle propriétaire sans option de déploiement local et avec des coûts d'API plus élevés. Gemma 4 31B est gratuit à déployer localement, et ses scores de benchmark sont compétitifs avec GPT-4o sur les tâches de raisonnement. Pour les équipes qui ont besoin de confidentialité des données ou de contrôle des coûts, Gemma 4 mérite une évaluation sérieuse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puis-je affiner Gemma 4 avec mes propres données d'API ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui. Google prend en charge l'affinage de Gemma 4 via Google AI Studio, Vertex AI et des outils tiers comme Hugging Face TRL. L'affinage sur des schémas d'API spécifiques à un domaine et des modèles de réponse peut améliorer considérablement la qualité de la sortie pour des cas d'utilisation spécialisés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quel matériel est nécessaire pour exécuter Gemma 4 localement ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Les modèles 31B et 26B tiennent sur un seul NVIDIA H100 de 80 Go en bfloat16. Les versions quantifiées fonctionnent sur des GPU grand public avec 16 à 24 Go de VRAM. Les modèles E4B et E2B fonctionnent sur les téléphones et les appareils périphériques, y compris Raspberry Pi et NVIDIA Jetson.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 prend-il en charge l'appel de fonctions ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Oui, tous les modèles Gemma 4 prennent en charge l'appel de fonctions natif. Vous définissez des outils comme des objets JSON avec un nom, une description et un schéma de paramètres. Le modèle décide quand appeler un outil et transmet des arguments structurés sur lesquels vous pouvez agir dans le code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment tester automatiquement les réponses de l'API Gemma 4 ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Utilisez les Scénarios de Test d'Apidog pour construire un flux de travail de test en chaîne. Importez votre endpoint d'API Gemma 4, configurez les étapes de requête et ajoutez des assertions pour valider la structure de la réponse. Vous pouvez exécuter le scénario localement, via la CLI, ou automatiquement dans votre pipeline CI/CD à chaque push de code.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
