Ilustración editorial para Streaming de respuestas de IA: cómo mostrar progreso sin ejecutar datos o acciones antes de tener una salida válida
Imagen generada con gpt-image-2.5-sunburst para InferamaFuente ↗
01

Un fragmento visible no equivale a una salida utilizable

Una interfaz puede mostrar texto conforme llega desde un modelo y, aun así, mantener una frontera estricta entre ese texto y el estado del sistema. Esa frontera es importante porque un delta de streaming solo comunica que se ha recibido una parte de una generación. No demuestra que el mensaje haya terminado, que su significado no vaya a cambiar, que un objeto estructurado esté completo ni que una llamada a herramienta tenga argumentos válidos.

La latencia percibida y la validez son propiedades distintas. El streaming puede reducir el tiempo hasta el primer fragmento y dar señales útiles de actividad al usuario. Pero el resultado que activa una operación debe satisfacer requisitos adicionales: recepción de una terminación inequívoca, ensamblado completo, validación sintáctica y semántica, asociación con una generación concreta y, cuando el riesgo lo requiere, confirmación humana. Una aplicación que confunde estas capas puede crear registros incompletos, indexar afirmaciones retractadas o ejecutar dos veces una acción tras un corte.

Conviene tratar lo que se pinta durante la transmisión como una proyección provisional. Puede ser útil para lectura, revisión y cancelación, pero debe estar identificada como borrador. El estado de negocio, en cambio, ha de derivar de una representación final controlada por el servidor o por un componente confiable. Esta regla se aplica tanto a asistentes conversacionales como a extracción documental, generación de código, automatización administrativa y agentes con herramientas.

Las API de proveedores no usan todas los mismos nombres de eventos ni ofrecen exactamente las mismas garantías. Algunas documentan eventos incrementales, identificadores de respuesta y un evento de finalización; otras describen estados de ejecución o una señal de resultado. La integración debe basarse en el contrato concreto de la API elegida y no inferir la completitud porque deje de llegar tráfico durante unos segundos.

02

Diseñar una máquina de estados explícita

La forma más clara de impedir que la interfaz se convierta en una vía de ejecución es modelar el ciclo de vida de cada generación. El identificador interno de la generación debe crearse antes de abrir la conexión y vincularse, cuando exista, al identificador devuelto por el proveedor. También debe relacionarse con la sesión, el usuario o principal autorizado, la versión del prompt o configuración aplicable y la operación de negocio solicitada.

El primer estado es recibido: ha llegado un evento con metadatos de transporte, pero todavía no se ha aceptado su contenido. A continuación, el evento pasa a buffer provisional, donde se conserva por orden de secuencia o por la posición que defina el protocolo. El cliente puede leer este buffer para renderizar un borrador. Si el flujo entrega partes de varios elementos, como texto, razonamiento no expuesto y argumentos de herramienta, deben mantenerse buffers separados por elemento y tipo.

En ensamblado, el consumidor transforma los fragmentos en una representación completa candidata: texto final, objeto estructurado o solicitud de herramienta. Este paso no es una validación. Por ejemplo, que una concatenación pueda interpretarse como JSON no prueba que contenga los campos permitidos, que los valores estén en rangos aceptables o que el usuario haya autorizado la acción resultante.

Una salida pasa a validada solo tras comprobar el evento terminal o estado final documentado, el orden y la integridad de los eventos necesarios, el esquema esperado y las reglas de negocio. Resultado confirmado significa además que el sistema ha persistido la versión validada con una clave estable y ha registrado la decisión. Acción ejecutada es un estado posterior, no un sinónimo de validada: requiere una política de autorización, una clave de idempotencia y una evidencia de su resultado.

Los estados terminales alternativos merecen tratamiento propio. Cancelada indica que el usuario o el sistema pidió detener la experiencia; incompleta indica que faltó una parte necesaria o que el proveedor informó una finalización no satisfactoria; fallida representa un error procesable; expirada indica que ya no es seguro reanudar. Ninguno de ellos debe promocionar el buffer provisional a resultado final.

Transición recomendada de una generación

  1. 01Crear una generación interna y registrar el propósito de la operación.
  2. 02Recibir eventos y verificar que pertenecen a la generación esperada.
  3. 03Ordenar o deduplicar eventos antes de añadirlos a buffers provisionales.
  4. 04Mostrar únicamente la proyección provisional permitida por la interfaz.
  5. 05Tras la señal terminal documentada, ensamblar la representación candidata.
  6. 06Validar integridad, esquema, reglas de negocio y autorización.
  7. 07Persistir una versión confirmada e inmutable de la salida validada.
  8. 08Si hay una herramienta, solicitar confirmación cuando aplique y ejecutar con una clave de idempotencia.
03

Decidir qué se puede mostrar, guardar, indexar o ejecutar

La política no debe depender solo de si el contenido parece razonable. Debe depender de su estado y de la clase de flujo. Un chat informativo tolera que el usuario vea un borrador marcado como tal. Una extracción que alimenta una base de conocimiento exige una versión final antes de indexar. Una herramienta que crea una reserva, envía una comunicación o modifica permisos necesita controles adicionales, incluso si sus argumentos ya superaron un esquema.

Guardar telemetría de transporte no equivale a persistir la salida como contenido de negocio. Puede ser legítimo retener un registro mínimo de evento recibido para depurar cortes y reconciliar sesiones, respetando las políticas de privacidad y retención aplicables. Debe distinguirse de almacenar el texto parcial como respuesta aprobada. Asimismo, un log no debe convertir secretos, datos personales o instrucciones potencialmente sensibles en una copia sin controles.

La indexación requiere una decisión especialmente conservadora. Los fragmentos parciales pueden contener una conclusión intermedia que desaparece al terminar la respuesta. Indexarlos crea recuperación futura de material no confirmado y hace más difícil explicar qué vio una persona y qué versión fue adoptada por el sistema. Indexe la versión validada, con su identificador de generación y de versión, y permita retirar o reemplazar esa versión de forma auditable.

Matriz de decisión por estado

EstadoMostrar a la personaPersistir como resultadoIndexarEjecutar una acción externa
Evento recibidoNo necesariamente; primero comprobar pertenencia y formatoNoNoNo
Buffer provisionalSí, como borrador y con cancelación disponibleSolo trazas técnicas mínimas si la política lo permiteNoNo
Objeto ensambladoOpcionalmente, aún como provisionalNo como resultado confirmadoNoNo
Salida validadaSí, como resultado finalSí, con versión e identificadorSí, si el flujo lo requiereTodavía no por defecto
Resultado confirmadoSíSíSí, cuando procedaSolo si la política de acción lo autoriza
Acción ejecutadaSí, con estado y comprobante disponibleSí, registrar la decisión y el resultadoNo aplicaYa realizada; no repetir sin idempotencia
04

Consumir el transporte sin asumir que los paquetes son mensajes

En un flujo basado en eventos enviados por el servidor, el protocolo define cómo se forman los eventos y contempla reconexiones. El transporte usa texto codificado en UTF-8 y el límite de un paquete de red no equivale al límite de un carácter, de una línea de evento ni de un objeto JSON. Por ello, el consumidor debe usar un decodificador incremental y un analizador de eventos; no debe convertir cada lectura de bytes en una cadena independiente y asumir que contiene un evento completo.

Después de reconstruir un evento del protocolo, aún queda interpretar el contrato de la API. Un texto puede llegar por deltas; los argumentos de una llamada a función pueden llegar repartidos; los elementos de salida pueden intercalarse. El consumidor debe agrupar por los identificadores documentados, como generación, elemento o índice de salida, y aplicar números de secuencia cuando estén disponibles. Una llegada repetida no debe duplicar caracteres, crear dos objetos ni provocar una segunda ejecución.

El fin de la conexión tampoco es una prueba suficiente de éxito. La conexión puede cerrarse por una cancelación, un proxy, un límite de tiempo o un error. Solo la señal terminal y el estado que documente el proveedor permiten clasificar la generación como completada, incompleta o fallida. Si falta esa evidencia, el estado correcto es incierto o incompleto y se bloquean la promoción y la ejecución.

No todas las APIs proporcionan checksum, versión final o un mecanismo de reanudación. Si existe un identificador de respuesta y un cursor de secuencia, consérvelos junto con el último evento aceptado. Si no existe, una reconexión puede requerir crear una nueva generación desde el punto de vista de negocio. No es seguro deducir que dos secuencias semejantes son la misma respuesta solo por su contenido.

05

Tool calling: completar no es autorizar

Las llamadas a herramientas merecen una barrera independiente porque transforman texto generado en efectos fuera del modelo. El hecho de que aparezca el nombre de una función o parte de sus argumentos no constituye una petición ejecutable. Los argumentos deben acumularse hasta la señal de finalización correspondiente, convertirse a una representación estructurada y validarse contra un esquema estricto. Los campos desconocidos, las conversiones implícitas y los valores fuera de política deben rechazarse o requerir una nueva interacción.

La validación de esquema es necesaria pero insuficiente. Una herramienta de transferencia puede recibir un importe con formato correcto y aun así exceder un límite, carecer de autorización o dirigirse a un destinatario no permitido. Las reglas de negocio deben ejecutarse en el servicio que controla la acción, no solo en el cliente que renderiza la conversación. Para operaciones significativas, una confirmación de usuario debe mostrar una descripción estable de la acción derivada de los argumentos ya validados.

La ejecución debe llevar una clave de idempotencia calculada o asignada por el servidor. Esa clave ha de estar ligada a la intención confirmada, no a cada reintento de red. Antes de reintentar, el ejecutor consulta el registro de operaciones para saber si esa clave ya tiene un resultado. Esto es relevante porque HTTP advierte que el reintento de una operación no idempotente es inseguro cuando no puede saberse si la solicitud original llegó a aplicarse.

El resultado de la herramienta también necesita reconciliación. Si el proveedor externo acepta la operación pero la respuesta se pierde, el estado no es «no ejecutada»: es desconocido hasta consultar un identificador de operación o aplicar un procedimiento de compensación. Diseñar este caso desde el principio evita que un botón de reintento se convierta en una orden duplicada.

Controles para una herramienta externa

EtapaControl mínimoResultado si falla
Argumentos parcialesAcumular por identificador de llamada; no interpretar para ejecutarMantener borrador o descartar
Argumentos completosValidar JSON, esquema y campos permitidosRechazar la llamada
IntenciónAplicar autorización, límites y reglas de negocioBloquear y explicar el motivo
ConfirmaciónPedirla cuando la política de riesgo lo exijaNo crear la orden externa
EjecuciónUsar clave de idempotencia y registrar el intentoConsultar estado antes de reintentar
Respuesta externaGuardar identificador y resultado verificableMarcar como estado desconocido o pendiente de reconciliación
06

Cortes, cancelaciones, reanudación y experiencia de producto

Ante un corte, la aplicación debe preservar la distinción entre lo visto y lo confirmado. Puede dejar el borrador visible con un aviso de interrupción, ofrecer reintento o intentar reanudar cuando el protocolo y el proveedor lo soporten. Si se reanuda, debe solicitar o procesar únicamente eventos posteriores al último cursor confirmado y deduplicar cualquier repetición. Si no puede probarse continuidad, es preferible iniciar una nueva generación y etiquetarla como tal.

La cancelación del usuario requiere dos operaciones diferentes: dejar de mostrar o de solicitar más contenido y decidir qué ocurre con el trabajo ya iniciado. Cancelar la suscripción no implica necesariamente que el proveedor haya detenido el cómputo. El sistema debe registrar la solicitud de cancelación, evitar promociones posteriores no deseadas y tratar cualquier evento que llegue después según una política definida. Una acción externa ya enviada exige consulta o compensación, no una suposición basada en que la interfaz se cerró.

En producto, los indicadores deben comunicar actividad sin prometer finalización. Un cursor de escritura, un estado de «generando» y una opción de detener son adecuados para el borrador. Una etiqueta de «resultado listo» debe reservarse para la salida validada. Si se permite editar el borrador, la edición humana debe crear una rama o versión separada: no debe confundirse con la respuesta confirmada por el sistema.

La recuperación de una sesión debe poder explicar qué ocurrió. Conserve la relación entre la generación, los eventos aceptados, el último cursor, la versión validada y, si la hubo, la operación externa. Esta trazabilidad no exige almacenar todo el texto indefinidamente; el nivel de detalle debe ajustarse a la sensibilidad de los datos y a las obligaciones de retención.

Respuesta ante una desconexión

  1. 01Marcar la transmisión como interrumpida sin declarar éxito.
  2. 02Conservar el último identificador o cursor aceptado y el estado de los buffers.
  3. 03Intentar reanudar solo con el mecanismo documentado por el proveedor.
  4. 04Deduplicar eventos mediante secuencia, identificador de evento o ambos.
  5. 05Exigir de nuevo una señal terminal válida antes de validar la salida.
  6. 06Si no hay continuidad demostrable, cerrar como incompleta y ofrecer una nueva generación.
  7. 07Bloquear cualquier herramienta pendiente hasta reconstruir y validar una intención completa.
07

Telemetría y pruebas antes del despliegue

Las métricas deben separar rapidez percibida y corrección. Registre el tiempo hasta el primer fragmento, el tiempo hasta la terminación, el tiempo hasta la validación y, en flujos con herramientas, el tiempo hasta la confirmación y la ejecución. Registre también abandonos, cancelaciones, reconexiones, eventos descartados por duplicado, generaciones incompletas y discrepancias entre el contenido provisional y la versión confirmada. Estas señales permiten detectar si una mejora visual está ocultando una degradación de completitud.

No use el texto completo como única base de observabilidad. Un identificador de generación, el identificador del proveedor cuando exista, la secuencia, el tipo de evento, las transiciones de estado y los motivos de rechazo suelen ser suficientes para investigar muchos incidentes. Cuando se necesite conservar contenido para auditoría, aplique controles de acceso, minimización y una política explícita de retención.

Las pruebas de caos deben intervenir en cada frontera, no solo desconectar antes del primer token. Simule cortes dentro de un carácter multibyte, entre líneas de evento, dentro de JSON, tras argumentos de herramienta aparentemente completos y justo antes de la señal terminal. Simule reenvíos de eventos, cambios de orden cuando el contrato no lo prohíba, respuestas terminales de error, cancelaciones tardías y pérdida de la respuesta del sistema externo. El criterio principal es que ningún caso convierta contenido incompleto en resultado confirmado ni cause una segunda acción por el mismo propósito.

Como comprobación de despliegue, revise que el cliente no tenga credenciales con capacidad de ejecutar directamente acciones sensibles; que la validación esté centralizada; que el almacén de idempotencia sobreviva a reinicios razonables; y que los paneles distingan una generación abandonada de una acción confirmada. Consulte también las rutas internas de Aprender, Comparar y Descubrir para alinear esta decisión de integración con los patrones y capacidades del producto.

Qué sigue abierto

  • La disponibilidad de identificadores de secuencia, cursores de reanudación y eventos terminales inequívocos varía entre APIs y versiones.
  • La posibilidad de reanudar una transmisión y el comportamiento ante eventos repetidos debe verificarse en el contrato específico del proveedor.
  • Las reglas que exigen confirmación humana dependen del riesgo de la herramienta, de la autorización del usuario y de las políticas de cada organización.
  • La retención de buffers, trazas y contenido confirmado debe definirse conforme a la sensibilidad de los datos y a los requisitos aplicables.
08

Continúa explorando

08

Fuentes consultadas

03

Correcciones y transparencia

Si detectas un dato incorrecto o desactualizado, puedes enviarnos una corrección indicando la página y la fuente que debemos revisar.

Proponer una corrección