Comment ajouter des réponses en streaming avec l’API Gemini étape par étape
L’API Gemini a rapidement attiré l’attention des développeurs pour ses capacités avancées dans les modèles de langage et ses options d’intégration flexibles. L’une des fonctionnalités les plus intéressantes qu’offre l’API Gemini est les réponses en streaming. Au lieu d’attendre l’arrivée de la réponse complète, le streaming permet de recevoir des tokens ou du contenu partiel de manière incrémentielle, améliorant considérablement l’expérience utilisateur, en particulier dans les applications interactives comme les chatbots ou les assistants en temps réel.
Dans ce guide détaillé, nous allons vous expliquer comment implémenter les réponses en streaming de l’API Gemini étape par étape, avec des exemples de code pratiques, un tableau comparatif mettant en avant le streaming par rapport au non-streaming, et des conseils pour optimiser votre mise en œuvre.
Comprendre les réponses en streaming dans l’API Gemini
Les appels d’API traditionnels aux modèles de langage suivent un schéma de demande-réponse : vous envoyez une invite et attendez la génération complète avant de pouvoir l’afficher ou la traiter. Le streaming change cela en décomposant la réponse en morceaux plus petits livrés de manière séquentielle. Cela est analogue à la façon dont le streaming vidéo délivre des parties d’une vidéo pendant que vous regardez, plutôt que de télécharger toute la vidéo à l’avance.
Les avantages des réponses en streaming incluent :
- Latence réduite : Commencez à traiter ou à afficher les tokens instantanément.
- Expérience utilisateur améliorée : Les utilisateurs voient le résultat se générer en temps réel.
- Meilleure gestion des ressources : Votre application peut réagir de manière dynamique, potentiellement annuler plus tôt et gérer les tokens à mesure qu’ils arrivent.
Étape 1 : Configuration de votre environnement API Gemini
Avant d’explorer le streaming, assurez-vous d’avoir accès à l’API Gemini avec les identifiants appropriés, et que votre environnement de développement est configuré avec les bibliothèques nécessaires pour effectuer des requêtes HTTPS et gérer les flux.
Pour la démonstration, nous utiliserons Node.js avec le client HTTP populaire axios (avec prise en charge du streaming) et les modules natifs http/https. Cependant, les concepts s’appliquent également de manière similaire en Python, Go, ou d’autres langages.
Pré-requis
- Node.js installé (v14+ recommandé)
- Une clé API pour l’API Gemini
- Installer axios avec
npm install axios
Étape 2 : Faire une demande de complétion standard (non-streaming)
Tout d’abord, considérons un exemple simple où vous envoyez une invite et attendez la réponse complète :
const axios = require('axios');
async function getCompletion() {
const API_KEY = 'YOUR_GEMINI_API_KEY';
const url = 'https://api.gemini.com/v1/completions';
const data = {
model: 'gemini-1',
prompt: 'Écrire un poème sur l'océan',
max_tokens: 100
};
const response = await axios.post(url, data, {
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
}
});
console.log('Complétion :', response.data.choices[0].text);
}
getCompletion();
Cela retournera la complétion entière uniquement après que le modèle a terminé de la générer. Bien que cela soit simple, cela peut entraîner un délai perceptible dans les applications nécessitant une réactivité en temps réel.
Étape 3 : Activer les réponses en streaming avec l’API Gemini
L’API Gemini prend en charge un mode de streaming via son point de terminaison des complétions. Pour activer le streaming, vous devez définir un paramètre de requête spécifique et gérer la réponse HTTP comme un flux plutôt que d’attendre le corps complet.
Points clés pour activer le streaming :
- Définissez
stream: truedans votre charge utile de requête. - Utilisez une méthode de requête HTTP qui prend en charge la gestion des morceaux en streaming.
- Écoutez les événements de données sur le flux de réponse.
Exemple : Streaming avec Axios et Node.js
const axios = require('axios');
async function streamCompletion() {
const API_KEY = 'YOUR_GEMINI_API_KEY';
const url = 'https://api.gemini.com/v1/completions';
const data = {
model: 'gemini-1',
prompt: 'Écrire une histoire sur un chevalier courageux',
max_tokens: 150,
stream: true // Activer les réponses en streaming
};
const response = await axios({
method: 'post',
url: url,
data: data,
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
responseType: 'stream'
});
response.data.on('data', (chunk) => {
// Chaque morceau est un objet Buffer
const payloads = chunk.toString().split('nn');
for (const payload of payloads) {
if (payload.includes('[DONE]')) return; // Fin du flux
if (payload.trim() === '') continue;
try {
const data = JSON.parse(payload);
const token = data.choices[0].delta?.content;
if (token) {
process.stdout.write(token);
}
} catch (err) {
// Gérer les erreurs de parsing si nécessaire
console.error('Erreur lors du parsing du morceau :', err);
}
}
});
response.data.on('end', () => {
console.log('nn[Flux terminé]');
});
}
streamCompletion();
Dans cet exemple, les tokens arrivent sous forme de morceaux encodés en JSON, et votre code analyse et affiche immédiatement chaque token.
Étape 4 : Analyse du format de données en streaming
Le format de réponse en streaming de l’API Gemini suit généralement un style Server-Sent Events (SSE) ou des charges utiles JSON segmentées où chaque morceau contient des mises à jour sur les nouveaux tokens générés.
Un morceau typique ressemble à :
{
"id": "completion-123",
"object": "text_completion",
"created": 1688749214,
"model": "gemini-1",
"choices": [
{
"delta": {
"content": "Bonjour"
},
"index": 0,
"finish_reason": null
}
]
}
Le champ delta.content contient le nouveau morceau de texte pour ce morceau. Votre code doit accumuler ou diffuser ce contenu vers l’interface de votre application.
Étape 5 : Gérer la fin du flux et les erreurs
Lorsque le flux se termine, le serveur envoie un token ou un message spécial comme [DONE], indiquant qu’aucun autre contenu ne sera envoyé. Votre gestionnaire de flux doit écouter ce token et fermer la connexion en douceur.
Préparez-vous également à gérer les erreurs réseau intermittentes ou les exceptions de parsing. Mettez en place une logique de nouvelle tentative ou des affichages d’erreur conviviaux si les données du streaming sont interrompues.
Tableau de comparaison : réponses en streaming vs non-streaming dans l’API Gemini
| Caractéristique | Réponse non-streaming | Réponse en streaming |
|---|---|---|
| Livraison de la réponse | Livraison par lot après génération complète | Livraison incrémentielle de tokens/morceaux au fur et à mesure de leur génération |
| Latence | Latence élevée, attendre toute la réponse | Latence réduite, sortie partielle disponible rapidement |
| Expérience utilisateur | Retard, affichage statique | Affichage dynamique en temps réel |
| Complexité de mise en œuvre | Simple à mettre en œuvre | Complexité modérée en raison de la gestion du streaming |
| Gestion des erreurs | Plus facile, réponse unique | Plus approfondie, gérer les interruptions de flux |
| Cas d’utilisation | Traitement par lot, tâches non en temps réel | Chatbots, assistants interactifs, génération de données en direct |
Conseils pratiques pour mettre en œuvre les réponses en streaming de l’API Gemini
1. Tamponner les tokens de manière appropriée
En fonction de vos besoins en matière d’interface utilisateur ou de backend, vous pourriez envisager de collecter des tokens et de les afficher par lots (par exemple, par mot ou phrase) au lieu de raw token par token pour éviter des mises à jour saccadées ou écrasantes.
2. Mettre en œuvre la gestion de la pression arrières
Si votre interface ou d’autres systèmes ne peuvent pas gérer des rafales de tokens rapides, mettez en place des mécanismes de pression arrières ou de limitation pour réguler le flux et éviter de submerger les utilisateurs ou les ressources système.
3. Utiliser des signaux d’abandon ou des tokens d’annulation
Le streaming permet une interruption anticipée si un utilisateur annule une opération. Intégrez des signaux d’abandon dans vos requêtes HTTP pour arrêter le streaming et libérer immédiatement des ressources.
4. Journalisation et surveillance détaillées
Le streaming est état et plus complexe, donc ajoutez des logs détaillés pour surveiller le flux de données, les erreurs et les complétions de flux, aidant au débogage et aux perspectives opérationnelles.
5. Considérations de sécurité
Protégez toujours votre clé API et ne l’exposez pas publiquement. Pour les scénarios de streaming côté front-end, propagez le streaming via le backend pour éviter l’exposition de la clé.
Exemple concret : Créer une interface de chatbot en direct en utilisant le streaming Gemini
Imaginez une fenêtre de chat où les messages des utilisateurs sont envoyés à l’API Gemini et où les réponses apparaissent token par token :
const readline = require('readline');
const axios = require('axios');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
async function chat() {
const API_KEY = 'YOUR_GEMINI_API_KEY';
rl.question('Vous : ', async (prompt) => {
console.log('Gemini :');
const url = 'https://api.gemini.com/v1/completions';
const data = {
model: 'gemini-1',
prompt,
max_tokens: 200,
stream: true
};
try {
const response = await axios({
method: 'post',
url: url,
data: data,
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
responseType: 'stream'
});
response.data.on('data', (chunk) => {
const lines = chunk.toString().split('nn');
for (const line of lines) {
if (line.trim() === '') continue;
if (line.includes('[DONE]')) {
rl.close();
return;
}
try {
const parsed = JSON.parse(line);
const content = parsed.choices[0].delta?.content;
if (content) {
process.stdout.write(content);
}
} catch (e) {
// ignorer les morceaux JSON mal formés
}
}
});
response.data.on('end', () => {
console.log('n[Fins de la réponse]');
rl.close();
});
response.data.on('error', (err) => {
console.error('Erreur de flux :', err.message);
rl.close();
});
} catch (err) {
console.error('Échec de la requête :', err.message);
rl.close();
}
});
}
chat();
Ce script permet aux utilisateurs de taper des messages et de voir les réponses en streaming de Gemini en direct sur le terminal.
Résumé
Intégrer les réponses en streaming de l’api gemini peut considérablement améliorer l’interactivité et la réactivité de vos applications alimentées par l’IA. En activant le streaming, en gérant les données incrémentales et en traitant des cas particuliers comme les erreurs et la terminaison du flux, vous pouvez créer des interfaces qui semblent plus fluides et dynamiques.
N’oubliez pas les étapes clés :
- Définissez le paramètre
stream: truedans le corps de votre requête - Faites une requête qui prend en charge le streaming (traitez la réponse comme un flux)
- Parsez les morceaux de données incrémentales, en extrayant les tokens des charges utiles JSON
- Mettez à jour progressivement l’interface utilisateur de votre application ou le consommateur backend
- Traitez la fin du flux et les erreurs avec soin
Avec le code d’exemple et les meilleures pratiques partagées dans cet article, vous êtes bien préparé pour commencer à ajouter des fonctionnalités de streaming à vos projets d’API Gemini. Bon codage !
Articles connexes
- Erreur de taux dépassé de Claude AI : Pourquoi cela se produit et comment y remédier
- Sécurité des bots : Protégez votre automatisation contre les attaques
- J’ai dompté mes bots asynchrones : Voici comment je l’ai fait
🕒 Published: