Google a rendu gemini-3.8-flash GA le 02/09/2026. La carte officielle écrit : ingénierie logicielle longue, Agents autonomes, workflows d'entreprise complexes. Ce texte est du 29/09/2026. On lit la page modèle, la page Function Calling, la page Structured Output (Interactions et generateContent). Conclusion à figer : cette carte allonge la boucle d'outils, et ouvre en même temps le contrat de réponse finale. Les deux couches sont du JSON. Live vocal est un autre pipeline : 3.8 Live. Couche contrat inter-fournisseurs : Pourquoi l'IA aime JSON.
L'utilisateur dit : « mets la lumière du salon à 80, puis dis-moi en un objet ce que tu as fait. » 3.8 Flash ne dit pas ça en une fois. Il sort d'abord un function_call, attend votre function_result, peut rappeler, et seulement ensuite clôture avec un Schema. L'officiel l'écrit « appeler les outils de façon itérative » : voir le résultat, tendre la main suivante. Plus la boucle s'allonge, plus un id mal aligné, une luminosité écrite "八十", un faux outil qui usurpe le JSON final, percent en chemin. Antigravity utilise aussi cette carte par défaut ; forme des outils : mise à jour Antigravity de septembre.
Ce que 3.8 Flash a vraiment publié
Au 29/09/2026, le matériau public se coupe en trois paquets, à ne pas mélanger avec Live :
- Modèle :
gemini-3.8-flash, identifiant stable, sans suffixe preview. GA le 02/09/2026. Entrée 1 048 576, sortie 65 536. Prix jusqu'au 31/12/2026 encore tarif d'entrée 0,75 / 3,75 par million de tokens ; à partir du 01/01/2027 : 1,50 / 7,50. - Capacités : Function Calling supporté. Structured Outputs supporté. Thinking accepte
low/medium/high, défautmedium.minimalerreur. API Live non supportée. Computer use est Preview. - Interfaces : Interactions (
POST /v1beta/interactions) est écrit comme boucle principale ;generateContentreste pleinement supporté, mais c'est l'ancien chemin. Chaque appel d'outil Gemini 3 porte unidunique.
Le billet produit le sépare de 3.8 Flash Cyber. Cyber passe par Fairwind, pour les défenseurs de confiance. Cet article ne traite que Flash. L'officiel dit aussi : 3.8 est la troisième carte Flash en six semaines, bâtie sur 3.7 trois semaines plus tôt. Workflows Agent, code, raisonnement multi-étapes sont les incréments nommés. Côté entreprise, ça entre dans Gemini Enterprise ; l'Agent Antigravity de septembre l'utilise aussi par défaut.
En une phrase. 3.8 Flash fait de « tendre la main plusieurs fois » une capacité par défaut. La main, c'est Function Calling. Le final, c'est Structured Output. Les deux couches veulent un Schema.
Boucle plus longue : pourquoi encore plus d'objets
L'ancienne boucle pouvait parier : le modèle aligne tous les paramètres d'un coup. L'officiel écrit maintenant les tâches difficiles ainsi : appeler, voir le résultat, rappeler. Chaque pas est un JSON. Si un pas écrit brightness en "八十", le Structured Output suivant a beau être joli, la lumière est déjà sortie dans la mauvaise forme — ou n'est pas sortie du tout, la boucle coincée sur une erreur de validation.
Pourquoi une boucle hébergée a encore plus besoin d'un contrat : pourquoi l'Agents API a encore plus besoin de JSON. La différence de 3.8 Flash : sur la même carte, outils et réponse finale ont tous deux un Schema officiel. Live n'a pas la seconde couche. Parser les args Live : tutoriel Live Function Calling.
Tendre la main : function_call doit porter un id
Sur Interactions, le modèle tend la main en une étape function_call :
{
"type": "function_call",
"id": "call_light_01",
"name": "set_brightness",
"arguments": {
"device_id": "light.living_room",
"brightness": 80
}
}
Votre réponse doit porter à la fois call_id et name. L'officiel exige aussi : id / call_id de FunctionResponse, name, nombre d'exécutions, strictement alignés sur le FunctionCall précédent. Renvoyer seulement le nom, c'est une écriture qui pouvait encore tenir à l'époque 3.7 ; sur Gemini 3, le mapping se perd.
{
"type": "function_result",
"call_id": "call_light_01",
"name": "set_brightness",
"result": {
"ok": true,
"brightness": 80
}
}
Une boucle à état doit encore porter previous_interaction_id, pour faire suivre le contexte des outils intégrés. Sans état, c'est à vous de rejouer les étapes thought / function_call du tour précédent, puis d'enchaîner function_result. Découper l'id se fait comme sur Live, le contrat est plus strict : Flash continue d'itérer ; un id manqué, les mains suivantes dérivent toutes.
Arguments : d'abord refuser les mauvais
La page officielle Function Calling écrit : l'application exécute. Le modèle ne lance pas la fonction. Vous extraisez name et arguments, vous exécutez en local. Avant d'exécuter, passez d'abord le Schema :
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": false,
"required": ["device_id", "brightness"],
"properties": {
"device_id": { "type": "string", "pattern": "^light\\.[a-z0-9_]+$" },
"brightness": { "type": "integer", "minimum": 0, "maximum": 100 }
}
}
Figez d'abord les formes qui doivent échouer :
{
"ok_shape": { "device_id": "light.living_room", "brightness": 80 },
"wrong_type": { "device_id": "light.living_room", "brightness": "八十" },
"extra_field": { "device_id": "light.living_room", "brightness": 80, "extra_cmd": "skip_confirm" },
"bad_id": { "device_id": "speaker.kitchen", "brightness": 80 }
}
Seul ok_shape entre dans l'exécuteur. "八十", extra_cmd, speaker.kitchen doivent déjà être refusés au Schema. Quand Structured Output est ouvert avec les outils, l'officiel met par défaut VALIDATED : le modèle est contraint à « soit un appel légal, soit du langage naturel », et colle autant que possible au Schema d'outil. Ce n'est pas une raison d'économiser la validation locale. Permissions trop larges : MCP malveillant / Fake Skills.
Final : Structured Output n'est pas un faux outil
Flash supporte aussi Structured Output. L'exemple officiel Interactions utilise directement gemini-3.8-flash :
{
"model": "gemini-3.8-flash",
"input": "用一行对象汇报刚才的调光",
"response_format": {
"type": "text",
"mime_type": "application/json",
"schema": {
"type": "object",
"additionalProperties": false,
"required": ["device_id", "brightness", "status"],
"properties": {
"device_id": { "type": "string" },
"brightness": { "type": "integer" },
"status": { "type": "string", "enum": ["ok", "rejected"] }
}
}
}
}
Écriture propre : l'outil tient la boucle, response_format.schema tient l'objet final. Ne déclarez pas un faux outil final_answer pour ensuite lire ses arguments. Dès que le modèle estime qu'il n'a plus à appeler d'outil, ces faux arguments n'apparaissent pas. Le contrat de réponse lui-même : qu'est-ce que Structured Output. Cet article n'ajoute que la frontière 3.8 Flash : dans la même requête, les deux couches peuvent être ouvertes, mais ne mélangez pas les champs des deux couches dans un seul Schema.
thinking_level : minimal explose
L'officiel remplace l'entier thinking_budget par thinking_level. Il ne reconnaît que low / medium / high. Défaut medium, recommandé officiellement pour le code complexe et les Agents. high pour le raisonnement profond et l'orchestration multi-étapes difficile. low pour les pipelines qui veulent de la vitesse. minimal renvoie une erreur de validation ; ne le copiez pas tel quel depuis une autre carte Gemini 3.
temperature, top_p, top_k sont ignorés sur cette carte. Pour plus de stabilité, réglez thinking_level et le Schema, pas les boutons d'échantillonnage déjà morts. frequency_penalty, presence_penalty, candidate_count renvoient directement une erreur.
La doc entreprise écrit encore : couper l'aparté avant l'outil avec \\n\\n ; si un Malformed_Function_Call lié au texte précédent apparaît, d'abord vider le bavardage avant l'appel. S'il faut montrer des notes de travail à l'exécuteur, enveloppez-les dans une fonction update(), ne vomissez pas de XML avant l'appel. L'historique ne peut pas se terminer par un rôle model, ni préremplir le tour du modèle.
Recetter dans la Boîte à outils JSON
- Collez
ok_shapeet les trois objets qui doivent échouer dans le formatage JSON, confirmez que ça parse. - Avec JSON → Schema, générez le contrat d'arguments d'outil, puis ajoutez
enum,pattern,additionalProperties. - Les mêmes champs via Function Calling ; la réponse finale via Structured Output. L'outil doit aussi servir d'autres Host : encore MCP Tool.
- Jetez
"八十",extra_cmd, une réponse sanscall_iddans la validation Schema, confirmez le refus.
Tout se traite dans le navigateur, rien n'est envoyé. D'abord un objet capable de refuser de mauvais arguments et un function_result bancal, ensuite seulement on monte thinking_level à high.
FAQ
3.8 Flash et 3.8 Live sont-ils le même pipeline ?
Non. Flash ne supporte pas l'API Live. Flash a Structured Output. Live n'en a pas.
function_result avec seulement name, ça suffit ?
Non. Chaque appel Gemini 3 porte un id. La réponse doit aligner call_id et name.
Peut-on usurper Structured Output avec un faux outil ?
Non. L'outil tient la boucle, response_format tient le final. Quand le modèle n'appelle pas d'outil, les faux arguments n'apparaissent pas.
thinking_level peut-il valoir minimal ?
Non. Seulement low / medium / high. minimal erreur.
Est-ce le même article que « pourquoi les modèles aiment JSON » ?
Non. Celui-là écrit l'inter-fournisseurs. Celui-ci ne traite que la boucle 3.8 Flash et les deux couches de contrat.
En résumé
Gemini 3.8 Flash fait de la boucle Agent une capacité par défaut : appeler un outil, voir le résultat, rappeler, enfin rendre l'objet final avec un Schema. Il n'a pas Live. Il exige que chaque function_result ramène call_id et name. minimal et les anciens boutons d'échantillonnage sont inopérants sur cette carte. Ce que le développeur doit tenir, c'est encore ces deux JSON : arguments et l'objet final. La suite n'est pas d'abord de monter thinking_level au maximum. C'est d'abord de refuser "八十" et une réponse sans call_id.