Skip to content
Especificación del Protocolo

Protocolo de Renderizado Agéntico

Un protocolo bidireccional y agnóstico al transporte para la comunicación entre agentes de IA y superficies de renderizado. Un agente, cada pantalla.

v0.1 Borrador
Estándar Abierto
CC BY 4.0

El Problema

Los agentes de IA producen salidas estructuradas — tablas, formularios, gráficos, mensajes de estado, bloques de código — pero el renderizado de esa salida está fuertemente acoplado al transporte y al framework de frontend. Un agente construido para un chat web no puede renderizarse en una aplicación de escritorio. Un agente detrás de un flujo SSE no puede servir a un cliente móvil que espera un protocolo diferente.

Cada nueva superficie de renderizado requiere código de integración personalizado.

La Solución

ARP define un protocolo — no un framework, no una biblioteca. Igual que Wayland desacopló las aplicaciones de los servidores de pantalla, ARP desacopla los agentes de los renderizadores.

El agente decide qué mostrar. El renderizador decide cómo mostrarlo.

Arquitectura
Agent (backend)                              Renderer (web, CLI, mobile)
───────────────                              ──────────────────────────
Owns surfaces         ── render / delta ──►  Owns display
Owns UI state         ◄── input events ────  Owns input routing

Principios de Diseño

01
Sin intermediario
El agente envía comandos de renderizado directamente. El renderizador envía entradas directamente. Sin framework intermedio.
02
Asíncrono y no bloqueante
Todos los mensajes son asíncronos. Ningún lado bloquea esperando una respuesta.
03
Cada fotograma es perfecto
Confirmaciones atómicas. El estado de renderizado se acumula en un búfer pendiente y se aplica de forma atómica. Sin parpadeos.
04
Orientado a capacidades
Los renderizadores declaran lo que soportan. Los agentes se adaptan. La CLI obtiene tablas, la web obtiene todo.
05
Agnóstico al transporte
Mensajes lógicos, no formatos de cable. WebSocket, SSE, gRPC, sockets Unix, stdio.
06
Componentes tipados
Los agentes emiten descriptores tipados como table con headers y rows — no HTML.

Mensajes del Protocolo

Cada mensaje ARP es JSON con al menos { v: 1, type: "<type>" }.

Servidor a Cliente
TipoPropósito
helloNegociación de capacidades al conectar
deltaFragmento de texto incremental
tool_startEjecución de herramienta iniciada
tool_endEjecución de herramienta finalizada
renderComponente de UI generativa
patchActualización incremental de componente
errorEvento de error
commitStream completo
Cliente a Servidor
TipoTipo de EntradaPropósito
inputtextMensaje de texto del usuario
inputactionClic de botón / acción de UI
inputform_submitEnvío de formulario

14 Componentes Integrados

Todo renderizador conforme a ARP debe soportar al menos text. Los componentes declaran cadenas de respaldo — chart recurre a table, que recurre a text.

text
markdown
status-card
table
code-block
diff
key-value
progress
chart
form
confirm
choices
product-cards
image

Transportes

Disponible
WebSocket
/_arp/v1
Transporte principal. Conexión bidireccional persistente con reconexión automática.
Disponible
SSE
Server-Sent Events
Transporte de respaldo. Requerido para subida de archivos mediante multipart/form-data.
Planificado
gRPC
Alto rendimiento
Para aplicaciones nativas de escritorio y móviles.
Planificado
stdio
Enmarcado NDJSON
Para renderizadores CLI e integraciones basadas en tuberías.

SDKs de Cliente

@haira/arp — Núcleo (sin dependencias)
typescript
import { ArpClient } from '@haira/arp'

const client = new ArpClient('ws://localhost:8080/_arp/v1', {
  onDelta: (text) => appendToChat(text),
  onRender: (event) => renderComponent(event.component, event.props),
  onDone: () => markStreamComplete(),
})

client.connect()
client.sendText('Show me the sales data')
@haira/arp-react — UI de Chat Lista para Usar
tsx
import { ArpChat } from '@haira/arp-react'

function App() {
  return (
    <ArpChat
      url="ws://localhost:8080/_arp/v1"
      theme="dark"
      title="Data Explorer"
    />
  )
}

También disponibles: @haira/arp-vue para Vue 3 y github.com/haira-lang/arp-go para backends en Go.

Integración con Haira

Todo servidor Haira habla ARP de forma nativa. Sin configuración necesaria.

haira
import "ui"

tool query_database(query: string) -> any {
    """Executes a SQL query and displays results."""
    rows, err = postgres.query(db, query)
    if err != nil {
        return ui.status_card("error", "Query Failed", conv.to_string(err))
    }
    return ui.table("Query Results", headers, rows)
}

agent DataExplorer {
    provider: OpenAI
    tools: [query_database]
    ui: ui
}

@webhook("/chat")
workflow Chat(message: string, session_id: string) -> stream {
    return DataExplorer.stream(message, session: session_id)
}

Ciclo de Vida de Extensiones

Los nuevos componentes siguen un ciclo de vida de tres fases inspirado en Wayland:

1. Experimental
x-vendor-name
Creado por el proveedor. Se permiten cambios disruptivos.
2. Preparación
s-name
Requiere 2 o más implementaciones de renderizador. Revisión de gobernanza.
3. Núcleo
Sin prefijo
Parte de la especificación ARP. Solo cambios aditivos.

Niveles de Conformidad

NivelComponentes RequeridosObjetivo
Mínimotext + entrada de textoAsistentes de voz, IoT
Básicotext, table, form, confirm, choicesTerminales CLI
EstándarTodos los componentes del núcleo, modelo de objeto completoWeb / escritorio
CompletoEstándar + streaming, multi-superficie, subida de archivosAplicaciones web ricas

Released under the Apache-2.0 License.