Chargement

Streaming des appels d'outils : fini les indicateurs de chargement figés

Leçon 48 min
Chargement

Streaming des appels d'outils : fini les indicateurs de chargement figés

RésuméTranscription

Un appel d'outil diffusé arrive avec d'abord le nom de l'outil, puis son entrée en plusieurs morceaux, afin que l'écran puisse indiquer ce qui se passe. La vidéo montre deux versions de l'écran chez Meridian, un cabinet de conseil en ingénierie fictif, côte à côte. L'une n'a pas de streaming et l'autre en a. La démonstration est simulée et se déroule au tiers de la vitesse normale.

Cette vidéo a été enregistrée en septembre 2026, et son code utilise Claude Sonnet 5 (claude-sonnet-5). Vos résultats peuvent différer avec des modèles plus récents.

Imaginez que votre utilisateur regarde un indicateur de chargement pendant huit secondes. Cela se produit parce que votre boucle d'outils envoie chaque requête, attend, puis reçoit une réponse terminée.

Pendant ce temps, Claude choisit un outil et rédige son entrée, votre code exécute l'outil, puis Claude rédige la réponse. Votre code ne voit chaque réponse qu'une fois celle-ci terminée, de sorte que votre interface utilisateur n'a rien à afficher pendant que Claude rédige.

Meridian rencontre ce problème aujourd'hui. Son agent de support est écrit en Python et répond aux questions des employés concernant les projets. Lorsqu'un employé demande « Quel est le statut du chantier de la station de pompage ? », l'écran affiche « réflexion en cours... » jusqu'à ce que la réponse arrive.

Le streaming change ce que cet employé voit. Avec le streaming, votre code reçoit la réponse morceau par morceau, avant qu'elle ne soit terminée. Ainsi, l'écran de Meridian peut afficher « Recherche du projet... » dès que Claude choisit l'outil.

À quoi ressemble un appel d'outil diffusé en streaming

Là où votre boucle d'outils envoie sa requête, remplacez client.messages.create(...) par client.messages.stream(...). La réponse arrive alors sous forme d'une série d'événements envoyés par le serveur, de petits messages JSON qui possèdent chacun un type.

Une réponse est constituée de blocs de contenu, ou blocs pour faire court, avec un bloc pour chaque portion de texte de Claude et un pour chaque appel d'outil. Le bloc d'un appel d'outil a pour type tool_use. Les modèles actuels peuvent aussi ajouter des blocs de réflexion, que le code de cette leçon ignore.

Imaginez un ami qui vous lit un numéro de téléphone au téléphone. Il vous dit d'abord à qui appartient ce numéro : « Voici le numéro du plombier. » Puis il le lit quelques chiffres à la fois, s'arrêtant où bon lui semble. Enfin, il dit « Voilà, c'est tout. »

Le bloc d'un appel d'outil arrive de la même manière que ce numéro de téléphone. Un événement l'ouvre, un ou plusieurs événements le remplissent, et un événement le referme. Voici les événements de l'appel d'outil de Meridian.

text
{"type": "content_block_start", "index": 0,
 "content_block": {"type": "tool_use", "id": "toolu_01",
                   "name": "lookup_project_status", "input": {}}}
{"type": "content_block_delta", "index": 0,
 "delta": {"type": "input_json_delta", "partial_json": "{\"project_"}}
{"type": "content_block_delta", "index": 0,
 "delta": {"type": "input_json_delta", "partial_json": "id\": \"MEG-2"}}
{"type": "content_block_delta", "index": 0,
 "delta": {"type": "input_json_delta", "partial_json": "026-0142\"}"}}
{"type": "content_block_stop", "index": 0}

Affichez l'outil choisi dès l'ouverture de son bloc

Le nom de l'outil se trouve dans content_block_start, le premier événement du bloc. Lorsque cet événement arrive, votre code peut mettre à jour la ligne de statut, cette unique ligne de texte que votre interface utilisateur affiche pendant que votre utilisateur attend.

Meridian conserve un petit dictionnaire, STATUS, qui fait correspondre le nom de chaque outil à des mots destinés à l'utilisateur, de sorte que lookup_project_status devienne « Recherche du projet... » à l'écran.

Assemblez la requête en streaming

Lorsque le flux se termine, appelez stream.get_final_message() pour obtenir la réponse terminée, le même type d'objet que celui renvoyé par client.messages.create(...). Ainsi, le reste de votre boucle d'outils reste inchangé.

Voici la requête en streaming de Meridian. on_status est une fonction que vous écrivez et qui affiche une chaîne de caractères comme ligne de statut.

Chargement

Points clés à retenir

  • Un appel d'outil diffusé en streaming arrive avec d'abord le nom de l'outil, puis son entrée en plusieurs morceaux.
  • Dès que content_block_start arrive, affichez l'outil choisi avec des mots compréhensibles pour votre utilisateur.
  • stream.get_final_message() renvoie la réponse terminée, de sorte que le reste de votre boucle d'outils ne change pas.