Llamadas a herramientas con streaming: no más spinners congelados
Una llamada a herramienta transmitida mediante streaming llega primero con el nombre de la herramienta y su entrada en partes, de modo que la pantalla pueda indicar lo que está sucediendo. El video muestra dos versiones de la pantalla en Meridian, una consultoría de ingeniería ficticia, una al lado de la otra. Una no tiene streaming y la otra sí. La demostración es simulada y se ejecuta a un tercio de la velocidad.
Este video se grabó en septiembre de 2026, y su código usa Claude Sonnet 5 (claude-sonnet-5). Tus resultados pueden diferir en modelos más nuevos.
Supón que tu usuario observa un spinner durante ocho segundos. Eso ocurre porque tu bucle de herramientas envía cada solicitud, espera y recibe de vuelta una respuesta terminada.
En ese tiempo, Claude elige una herramienta y escribe su entrada, tu código ejecuta la herramienta y Claude escribe la respuesta. Tu código ve cada respuesta solo una vez que está terminada, así que tu interfaz de usuario no tiene nada que mostrar mientras Claude escribe.
Meridian tiene este problema hoy en día. Su agente de soporte está escrito en Python y responde preguntas de los empleados sobre proyectos. Cuando un empleado pregunta "¿Cuál es el estado del trabajo de la estación de bombeo?", la pantalla dice "pensando..." hasta que llega la respuesta.
El streaming cambia lo que ve ese empleado. Con streaming, tu código recibe la respuesta pieza por pieza, antes de que esté terminada. Así, la pantalla de Meridian puede decir "Buscando proyecto..." tan pronto como Claude elige la herramienta.
Cómo se ve una llamada a herramienta transmitida mediante streaming
Donde tu bucle de herramientas envía su solicitud, reemplaza client.messages.create(...) con client.messages.stream(...)(se abre en una pestaña nueva). La respuesta llega entonces como una serie de eventos enviados por el servidor(se abre en una pestaña nueva), pequeños mensajes JSON que tienen cada uno un type.
Una respuesta está compuesta de bloques de contenido, o bloques para abreviar, con un bloque para cada fragmento de texto de Claude y uno para cada llamada a herramienta. El bloque de una llamada a herramienta tiene el tipo tool_use. Los modelos actuales también pueden añadir bloques de pensamiento, que el código de esta lección ignora.
Imagina a un amigo leyéndote un número de teléfono por el teléfono. Primero te dice de quién es el número: "Aquí está el número del plomero". Luego lo lee unos cuantos dígitos a la vez, deteniéndose donde quiera. Finalmente dice "Eso es todo".
El bloque de una llamada a herramienta llega de la misma forma en que llegó el número de teléfono. Un evento lo abre, uno o más eventos lo llenan, y un evento lo cierra. Aquí están los eventos de la llamada a herramienta de Meridian.
{"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}Muestra la herramienta elegida tan pronto como se abre su bloque
El nombre de la herramienta está en content_block_start, el primer evento del bloque. Cuando llega ese evento, tu código puede actualizar la línea de estado, la única línea de texto que muestra tu interfaz mientras tu usuario espera.
Meridian mantiene un pequeño diccionario, STATUS, que asigna a cada nombre de herramienta palabras para el usuario, así lookup_project_status se convierte en "Buscando proyecto..." en la pantalla.
Arma la solicitud de streaming
Cuando el stream termina, llama a stream.get_final_message() para obtener la respuesta terminada, el mismo tipo de objeto que devuelve client.messages.create(...). Así, el resto de tu bucle de herramientas permanece como estaba.
Aquí está la solicitud de streaming de Meridian. on_status es una función que escribes tú y que muestra una cadena como línea de estado.
Puntos clave
- Una llamada a herramienta transmitida mediante streaming llega primero con el nombre de la herramienta, y luego su entrada en partes.
- Tan pronto como llega
content_block_start, muestra la herramienta elegida con palabras que tu usuario entienda. stream.get_final_message()devuelve la respuesta terminada, así que el resto de tu bucle de herramientas no cambia.