Guía

¿Qué es Generative UI? La guía completa

Todo lo que necesitas saber sobre los sistemas AI que generan componentes de interfaz interactivos, no solo texto.

Alex20 min de lectura

Introducción

Cuando le haces una pregunta a ChatGPT, obtienes texto de vuelta — a veces formateado, a veces no, pero fundamentalmente una cadena de caracteres renderizada en una burbuja de chat. Ese modelo de interacción humano-AI ya empieza a sentirse anticuado.

Generative UI es el paradigma donde un sistema AI no solo devuelve texto — devuelve componentes de interfaz renderizados. Pídele que te muestre un desglose de ventas y genera un gráfico interactivo. Pídele que te ayude a reservar un vuelo y renderiza un formulario de reserva inline. Pídele que resuma un contrato y produce una tarjeta estructurada con cláusulas desplegables.

El cambio importa porque el texto es un medio de mínimo común denominador. Una pared de texto describiendo un conjunto de datos es siempre inferior a una visualización bien construida de esos datos. GenUI cierra la brecha entre lo que una AI sabe y qué tan efectivamente puede comunicarlo — dándole acceso al vocabulario completo de un toolkit de UI moderno.

Esta guía cubre cómo funciona Generative UI técnicamente, los principales frameworks que lo permiten hoy, casos de uso del mundo real, compromisos honestos y un punto de partida práctico para tu primera implementación.

Cómo funciona Generative UI

El mecanismo detrás de Generative UI es un pipeline de cuatro etapas. Entender cada etapa es esencial para depurar y extender sistemas GenUI en producción.

1. El LLM produce salida estructurada

En lugar de indicarle a un LLM que produzca texto libre, lo induces a producir datos estructurados — ya sea mediante function calling / tool use, o instruyendo al modelo para emitir JSON. Esta salida describe qué renderizar, no el contenido en bruto en sí.

Por ejemplo, en lugar de devolver «Los ingresos de este trimestre fueron $1,2M», el modelo devuelve algo como:

{
  "component": "RevenueChart",
  "props": {
    "period": "Q1 2026",
    "value": 1200000,
    "change": 0.14,
    "chartType": "bar"
  }
}

2. Un registro de componentes mapea la salida a la UI

Un registro de componentes en el cliente o servidor mapea nombres de componentes a componentes reales de React, Vue o Svelte. Cuando el modelo emite «component»: «RevenueChart», el registro lo resuelve en un componente RevenueChart real, pasa las props y lo renderiza.

El registro es la frontera clave de seguridad y calidad. Tú decides qué componentes están disponibles para el modelo — solo puede renderizar lo que hayas registrado explícitamente. Esto es fundamentalmente diferente de permitir que un LLM genere HTML arbitrario, lo que sería peligroso e impredecible.

3. El streaming entrega componentes progresivamente

Las mejores implementaciones de GenUI transmiten datos de componentes a medida que se generan. En lugar de esperar a que el LLM termine su respuesta completa, los componentes se envían al cliente tan pronto como sus datos están completos. Esto da a los usuarios una experiencia de revelación progresiva que se siente rápida incluso para respuestas multi-componente complejas.

El modelo de streaming de React (a través de Server Components y Suspense) es particularmente adecuado para este patrón. El primitivo streamUI del Vercel AI SDK se construye sobre él. SSE (Server-Sent Events) es una alternativa más simple que funciona en cualquier framework.

4. La UI se renderiza y el usuario interactúa

Una vez renderizados, los componentes se comportan exactamente como cualquier otro componente de UI — pueden tener estado interno, llamar a APIs, despachar eventos y desencadenar llamadas adicionales al LLM. Esto permite UIs «agénticas» de múltiples turnos donde la AI y el usuario colaboran iterativamente a través de una secuencia de interfaces renderizadas.

Frameworks clave

El ecosistema GenUI se ha consolidado en torno a un puñado de frameworks maduros. Aquí hay una comparación honesta de las opciones líderes a principios de 2026.

FrameworkLenguajeCaracterística claveLicenciaEstrellas
Vercel AI SDKTypeScript / ReactstreamUI + React Server ComponentsApache 2.013k+
CopilotKitTypeScript / ReactHooks headless, copiloto integrado en la appMIT17k+
ThesysTypeScript (cualquier framework)Protocolo de componentes agnóstico de frameworkApache 2.02k+
Custom SSECualquieraControl total, sin dependenciasN/AN/A

Vercel AI SDK

El Vercel AI SDK es el framework GenUI más ampliamente adoptado para equipos de React/Next.js. Su función streamUI te permite definir un mapa de herramientas donde cada herramienta especifica un esqueleto de carga, un componente final y la definición de herramienta del LLM — todo en un solo lugar. El framework maneja el streaming, la hidratación y los límites de Suspense automáticamente.

El SDK está orientado hacia React Server Components, lo que lo hace extremadamente poderoso para aplicaciones Next.js pero menos ergonómico fuera de ese contexto. Soporta todos los principales proveedores de LLM a través de una interfaz unificada.

CopilotKit

CopilotKit adopta un enfoque diferente, centrándose en incrustar un «copiloto» dentro de una aplicación existente en lugar de construir una interfaz chat-first desde cero. Proporciona hooks de React headless (useCopilotAction, useCopilotReadable) que permiten a la AI leer el estado de tu aplicación y desencadenar acciones en ella — incluyendo renderizar componentes de UI como parte de la respuesta de acción.

CopilotKit es particularmente adecuado para herramientas internas y dashboards donde quieres añadir asistencia AI a una interfaz existente sin reconstruirla.

Thesys (anteriormente LivebenchAI)

Thesys es un nuevo participante que proporciona un enfoque agnóstico de framework para GenUI. En lugar de estar vinculado a los primitivos de streaming de React, usa su propio protocolo de componentes que funciona en múltiples frameworks. Esto lo convierte en la opción práctica para entornos de Vue, Svelte o agnósticos de framework. La compensación es un ecosistema y comunidad más pequeños en comparación con el Vercel SDK.

Implementaciones SSE personalizadas

Para equipos con requisitos específicos — frameworks particulares, infraestructura de streaming existente o presupuestos de latencia ajustados — una implementación personalizada usando Server-Sent Events y un registro de componentes hecho a mano es una opción válida. El patrón central es sencillo: el servidor emite tokens JSON sobre SSE, el cliente los analiza en descriptores de componentes, y un registro los resuelve en componentes reales.

Las implementaciones personalizadas ofrecen el máximo control pero requieren que construyas y mantengas la infraestructura de streaming, la recuperación de errores y la seguridad de tipos que los frameworks proporcionan sin configuración adicional.

Casos de uso

Generative UI añade más valor en contextos donde la presentación óptima de la UI varía significativamente según la entrada o intención del usuario. Aquí están los casos de uso de producción más claros.

Visualización de datos y analítica

Un usuario pregunta «muéstrame cómo cambió nuestro embudo de conversión este mes.» Un chatbot tradicional devuelve una tabla markdown. Un sistema GenUI devuelve un gráfico de embudo interactivo con capacidad de drill-down — porque el modelo puede decidir que estos datos se representan mejor como un embudo, y renderizar el componente adecuado para ello.

Este caso de uso es donde GenUI tiene el mayor ROI. La brecha entre texto y una visualización bien elegida es enorme para datos analíticos.

Interfaces conversacionales con respuestas ricas

El soporte al cliente, los flujos de incorporación y el descubrimiento de productos se transforman cuando la AI puede responder con formularios de reserva, tarjetas de producto, diálogos de confirmación y cuestionarios interactivos en lugar de paredes de texto instructivo. Las tasas de completación de respuestas mejoran porque la acción requerida se presenta directamente en lugar de describirse.

Generación de formularios y workflows multi-paso

En lugar de pre-construir cada posible permutación de formulario, un sistema GenUI puede generar el formulario apropiado según la necesidad expresada del usuario. Una admisión de seguros que genera diferentes campos para diferentes tipos de póliza. Una presentación de gastos que adapta su esquema al rol del empleado y a la categoría de gasto. Los formularios que tardarían semanas en diseñarse pueden generarse bajo demanda.

Herramientas de creación de contenido

Los asistentes de escritura, herramientas de generación de código y sistemas de diseño se benefician de GenUI cuando la salida de la AI debe mostrarse en contexto en lugar de en una interfaz de chat separada. Un editor de documentos donde la AI inserta un bloque de cita formateado. Un asistente de código que renderiza una vista de diff inline. Una herramienta de diseño que genera una vista previa de componente junto al código.

Herramientas internas y paneles de administración

Las herramientas internas son quizás el caso de uso más infravalorado. Los ingenieros y los equipos de operaciones frecuentemente necesitan interfaces ad-hoc para consultar datos, ejecutar operaciones o revisar registros. En lugar de construir estas interfaces manualmente, un sistema GenUI puede generar la UI apropiada en tiempo de consulta — una tabla cuando el resultado es tabular, un formulario cuando se necesita una acción, una tarjeta de estado cuando el resultado es una sola entidad.

Beneficios

Tiempo de desarrollo reducido para UIs con muchos datos

Cada visualización de datos o formulario personalizado que genera un sistema GenUI es uno que un ingeniero no tiene que construir manualmente. Para productos con alta variabilidad de UI — dashboards que necesitan docenas de tipos de gráficos, formularios que varían por segmento de usuario — esto representa una reducción significativa en el trabajo de frontend.

Interfaces personalizadas por contexto de usuario

Las UIs tradicionales están diseñadas para el usuario promedio. GenUI permite que la interfaz misma se adapte a lo que cada usuario está haciendo y lo que ya sabe. Un usuario experimentado obtiene una tabla de datos densa; un nuevo usuario obtiene una tarjeta guiada con anotaciones explicativas. La AI infiere el nivel apropiado de detalle del contexto.

Respuestas AI ricas más allá del texto plano

El texto tiene pérdidas. Describir un gráfico con palabras siempre es menos efectivo que mostrar el gráfico. GenUI cierra la brecha semántica entre lo que la AI entiende y lo que puede comunicar. Cuando la AI conoce la estructura de los datos, puede elegir la codificación visual más apropiada para ellos.

Revelación progresiva de la complejidad

Los sistemas complejos pueden hacerse accesibles haciendo que la AI exponga el nivel adecuado de detalle en el momento adecuado. Un componente puede comenzar colapsado con un resumen y expandirse bajo demanda. La navegación de drill-down puede generarse dinámicamente basándose en lo que el usuario enfoca. Esto es difícil de lograr con UIs estáticas sin construir máquinas de estado explícitas; GenUI lo hace emergente.

Desafíos

GenUI es genuinamente poderoso, pero viene con compromisos de ingeniería reales que vale la pena entender antes de comprometerte con el patrón.

Complejidad de pruebas

Probar UIs tradicionales es bien entendido: renderizas un componente con props dadas y haces aserciones sobre la salida. Probar GenUI es más difícil porque la salida renderizada depende de las salidas del LLM, que son no deterministas. Necesitas una estrategia de pruebas que cubra el registro de componentes (pruebas unitarias para cada componente registrado), la integración del LLM (pruebas de snapshot con respuestas simuladas) y el flujo end-to-end (pruebas de integración que tratan al LLM como una caja negra con entradas bien controladas).

Sobrecarga de rendimiento del streaming

El streaming de componentes introduce latencia en el primer pintado significativo: el usuario no ve nada hasta que el LLM empieza a emitir el primer descriptor de componente. Esto suele ser mejor que esperar una carga de página completa, pero requiere un manejo cuidadoso de los estados de carga y pantallas de esqueleto para evitar una experiencia brusca de en blanco y luego aparición. El tiempo hasta el primer token varía significativamente entre proveedores de LLM y tamaños de modelo.

Problemas de accesibilidad

Las UIs generadas dinámicamente presentan desafíos reales de accesibilidad. La gestión del foco durante las actualizaciones de streaming, etiquetas ARIA significativas en los componentes generados y la navegación por teclado a través de elementos insertados dinámicamente requieren ingeniería deliberada. Los componentes auto-generados no tendrán accesibilidad bien considerada incorporada a menos que diseñes tu registro de componentes con esto en mente.

Determinismo y reproducibilidad

Los LLMs son probabilísticos. La misma consulta de usuario puede producir selecciones de componentes diferentes entre solicitudes. Esto suele ser deseable — significa que la AI se adapta a diferencias sutiles en la formulación — pero hace que la depuración sea más difícil y puede llevar a confusión del usuario cuando un flujo «funcional» de repente se renderiza diferente. Establecer temperatura a 0 y usar definiciones de herramientas precisas reduce pero no elimina esta varianza.

Primeros pasos

El camino más rápido hacia un prototipo GenUI funcional usa el Vercel AI SDK con Next.js. Aquí hay un ejemplo mínimo que demuestra el patrón central.

Instalar dependencias

npm install ai @ai-sdk/openai zod

Definir una server action con streamUI

// app/actions.tsx
'use server'

import { streamUI } from 'ai/rsc'
import { openai } from '@ai-sdk/openai'
import { z } from 'zod'
import { WeatherCard } from '@/components/WeatherCard'
import { StockChart } from '@/components/StockChart'

export async function chat(userMessage: string) {
  const result = await streamUI({
    model: openai('gpt-4o'),
    messages: [{ role: 'user', content: userMessage }],
    text: ({ content }) => <p>{content}</p>,
    tools: {
      showWeather: {
        description: 'Show current weather for a location',
        parameters: z.object({
          location: z.string(),
          unit: z.enum(['celsius', 'fahrenheit']).default('celsius'),
        }),
        generate: async ({ location, unit }) => {
          // Fetch real data here
          const data = await fetchWeather(location, unit)
          return <WeatherCard {...data} />
        },
      },
      showStockChart: {
        description: 'Show a stock price chart',
        parameters: z.object({
          ticker: z.string(),
          period: z.enum(['1d', '1w', '1m', '3m', '1y']),
        }),
        generate: async ({ ticker, period }) => {
          const data = await fetchStockData(ticker, period)
          return <StockChart ticker={ticker} data={data} />
        },
      },
    },
  })

  return result.value
}

Transmitir la respuesta en un componente React

// app/chat/page.tsx
'use client'

import { useState } from 'react'
import { readStreamableValue } from 'ai/rsc'
import { chat } from '../actions'

export default function ChatPage() {
  const [messages, setMessages] = useState<React.ReactNode[]>([])
  const [input, setInput] = useState('')

  async function handleSubmit(e: React.FormEvent) {
    e.preventDefault()
    const userMessage = input
    setInput('')

    const response = await chat(userMessage)
    setMessages(prev => [...prev, response])
  }

  return (
    <div>
      <div className="messages">
        {messages.map((msg, i) => (
          <div key={i}>{msg}</div>
        ))}
      </div>
      <form onSubmit={handleSubmit}>
        <input
          value={input}
          onChange={e => setInput(e.target.value)}
          placeholder="Ask anything..."
        />
        <button type="submit">Send</button>
      </form>
    </div>
  )
}

La clave de este patrón es el objeto tools. Cada entrada define la herramienta del LLM (nombre, descripción, esquema de parámetros) junto al componente React a renderizar cuando se llama a esa herramienta. El modelo decide qué herramienta llamar según la entrada del usuario; tu código decide qué renderizar.

Para entornos Vue/Nuxt, el mismo patrón es alcanzable con SSE y un registro de componentes manual. El framework Thesys proporciona una abstracción de nivel superior para esto si prefieres no construirlo desde cero.

FAQ

¿Es Generative UI lo mismo que HTML generado por AI?
No, y esta distinción importa. El HTML generado por AI permite al LLM escribir marcado arbitrario, lo que es un riesgo de seguridad (XSS) y produce resultados inconsistentes. Generative UI usa un registro de componentes controlado — el LLM elige qué componente pre-construido renderizar y qué props pasar. Los componentes en sí son escritos por ingenieros. Piénsalo como la diferencia entre dejar que un invitado reorganice los muebles (seguro) versus dejar que renueven la casa (no seguro).
¿Qué proveedores de LLM funcionan mejor con GenUI?
Cualquier proveedor con soporte robusto de function/tool calling funciona bien. GPT-4o y los modelos de la serie o de OpenAI, Claude 3.5+ de Anthropic y Gemini 1.5 Pro de Google tienen un fuerte tool calling bien adaptado a GenUI. El criterio clave es la salida estructurada confiable — el modelo debe devolver consistentemente JSON válido que coincida con tus esquemas de parámetros. Los modelos de código abierto más pequeños pueden funcionar pero requieren más ingeniería de prompts y producen tasas de error más altas en la selección de herramientas.
¿Cómo manejo los errores del LLM en una interfaz GenUI?
El manejo de errores de GenUI tiene dos capas. Primero, maneja los errores de la API del LLM (límites de tasa, tiempos de espera, respuestas inválidas) con lógica de reintento estándar y fallback a una respuesta solo de texto. Segundo, maneja los casos donde el modelo llama a una herramienta inexistente o pasa props inválidas — valida toda la salida del LLM contra tus esquemas de parámetros antes de pasarla a los componentes, y renderiza un componente de error elegante cuando la validación falla. Nunca dejes que la salida bruta del LLM llegue a un componente sin validación.
¿Puedo usar Generative UI sin React?
Sí. El streamUI del Vercel AI SDK es específico de React, pero el patrón subyacente es agnóstico de framework. Thesys soporta múltiples frameworks. Para Vue, Svelte o vanilla JS, implementa el patrón con streaming SSE y un registro de componentes mapeado al sistema de componentes de tu framework. La lógica del lado del servidor (tool calling del LLM, emisión de JSON) es idéntica; solo cambia la capa de renderizado.
¿Cuál es la diferencia de costo frente a un chatbot estándar?
Los costos de tokens son similares — una respuesta GenUI usa aproximadamente el mismo número de tokens que una respuesta de texto equivalente, a veces menos porque el JSON estructurado es más conciso que la prosa verbosa. El costo adicional principal es la latencia: las llamadas a herramientas añaden un ida y vuelta al pipeline del LLM. Para workflows multi-paso donde el modelo llama a varias herramientas secuencialmente, esto puede añadir 2–5 segundos al tiempo total de respuesta. El tool calling paralelo (soportado por GPT-4o y Claude 3.5+) mitiga esto significativamente.
generative-uiaiframeworkstutorial

Alex

Ingeniero independiente y fundador de GenerativeUI. Construyo y escribo sobre Generative UI en producción — interfaces de streaming, integraciones AI y los frameworks que las hacen posibles.

Acerca de Alex

Suscríbete al newsletter

Artículos quincenales sobre patrones de Generative UI, actualizaciones de frameworks y perspectivas de implementación. Únete a más de 500 ingenieros.

Respetamos tu privacidad. Baja en cualquier momento.

¿Construyendo Generative UI para producción?

Revisión de arquitectura, implementación full-stack o liderazgo técnico fraccionado — obtén ayuda experta sin la sobrecarga.

Ver cómo trabajamos