Skip to content
Spécification du Protocole

Protocole de Rendu Agentique

Un protocole bidirectionnel indépendant du transport pour la communication entre agents IA et surfaces de rendu. Un seul agent, tous les écrans.

v0.1 Brouillon
Standard Ouvert
CC BY 4.0

Le Problème

Les agents IA produisent des sorties structurées — tableaux, formulaires, graphiques, messages de statut, blocs de code — mais le rendu de ces sorties est étroitement couplé au transport et au framework frontend. Un agent conçu pour un chat web ne peut pas s'afficher dans une application desktop. Un agent derrière un flux SSE ne peut pas servir un client mobile attendant un protocole différent.

Chaque nouvelle surface de rendu nécessite un code d'intégration personnalisé.

La Solution

ARP définit un protocole — pas un framework, pas une bibliothèque. De la même façon que Wayland a découplé les applications des serveurs d'affichage, ARP découple les agents des renderers.

L'agent décide quoi afficher. Le renderer décide comment l'afficher.

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

Principes de Conception

01
Pas d'intermédiaire
L'agent envoie des commandes de rendu directement. Le renderer envoie les entrées directement. Pas de framework intermédiaire.
02
Asynchrone & non-bloquant
Tous les messages sont asynchrones. Aucun côté ne bloque en attendant une réponse.
03
Chaque image est parfaite
Commits atomiques. L'état de rendu s'accumule dans un tampon en attente et s'applique atomiquement. Pas de scintillement.
04
Piloté par les capacités
Les renderers déclarent ce qu'ils supportent. Les agents s'adaptent. Le CLI reçoit des tableaux, le web reçoit tout.
05
Indépendant du transport
Messages logiques, pas formats filaires. WebSocket, SSE, gRPC, sockets Unix, stdio.
06
Composants typés
Les agents émettent des descripteurs typés comme table avec headers et rows — pas du HTML.

Messages du Protocole

Chaque message ARP est du JSON avec au minimum { v: 1, type: "<type>" }.

Serveur vers Client
TypeUtilité
helloPoignée de main des capacités à la connexion
deltaFragment de texte incrémental
tool_startExécution d'outil démarrée
tool_endExécution d'outil terminée
renderComposant UI génératif
patchMise à jour incrémentale d'un composant
errorÉvénement d'erreur
commitFlux terminé
Client vers Serveur
TypeType d'EntréeUtilité
inputtextMessage texte de l'utilisateur
inputactionClic sur bouton / action UI
inputform_submitSoumission de formulaire

14 Composants Intégrés

Tout renderer conforme ARP doit supporter au minimum text. Les composants déclarent des chaînes de repli — chart revient à table, qui revient à text.

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

Transports

Disponible
WebSocket
/_arp/v1
Transport principal. Connexion bidirectionnelle persistante avec reconnexion automatique.
Disponible
SSE
Server-Sent Events
Transport de repli. Requis pour les téléchargements de fichiers via multipart/form-data.
Prévu
gRPC
Haute performance
Pour les applications desktop et mobiles natives.
Prévu
stdio
Tramage NDJSON
Pour les renderers CLI et les intégrations par tube.

SDKs Client

@haira/arp — Core (zéro dépendances)
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 — Interface Chat Prête à l'Emploi
tsx
import { ArpChat } from '@haira/arp-react'

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

Également disponibles : @haira/arp-vue pour Vue 3 et github.com/haira-lang/arp-go pour les backends Go.

Intégration Haira

Chaque serveur Haira parle ARP nativement. Aucune configuration requise.

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)
}

Cycle de Vie des Extensions

Les nouveaux composants suivent un cycle de vie en trois phases inspiré de Wayland :

1. Expérimental
x-vendor-name
Créé par le fournisseur. Modifications incompatibles autorisées.
2. Mise en scène
s-name
Nécessite 2+ implémentations de renderer. Revue de gouvernance.
3. Noyau
Sans préfixe
Fait partie de la spécification ARP. Uniquement des modifications additives.

Niveaux de Conformité

NiveauComposants RequisCible
Minimaltext + entrée texteAssistants vocaux, IoT
Basiquetext, table, form, confirm, choicesTerminaux CLI
StandardTous les composants noyau, modèle objet completWeb / desktop
CompletStandard + streaming, multi-surfaces, téléchargement de fichiersApplications web riches

Released under the Apache-2.0 License.