Un protocole bidirectionnel indépendant du transport pour la communication entre agents IA et surfaces de rendu. Un seul agent, tous les écrans.
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é.
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.
Agent (backend) Renderer (web, CLI, mobile)
─────────────── ──────────────────────────
Owns surfaces ── render / delta ──► Owns display
Owns UI state ◄── input events ──── Owns input routingtable avec headers et rows — pas du HTML.Chaque message ARP est du JSON avec au minimum { v: 1, type: "<type>" }.
| Type | Utilité |
|---|---|
hello | Poignée de main des capacités à la connexion |
delta | Fragment de texte incrémental |
tool_start | Exécution d'outil démarrée |
tool_end | Exécution d'outil terminée |
render | Composant UI génératif |
patch | Mise à jour incrémentale d'un composant |
error | Événement d'erreur |
commit | Flux terminé |
| Type | Type d'Entrée | Utilité |
|---|---|---|
input | text | Message texte de l'utilisateur |
input | action | Clic sur bouton / action UI |
input | form_submit | Soumission de formulaire |
Tout renderer conforme ARP doit supporter au minimum text. Les composants déclarent des chaînes de repli — chart revient à table, qui revient à text.
/_arp/v1import { 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')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.
Chaque serveur Haira parle ARP nativement. Aucune configuration requise.
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)
}Les nouveaux composants suivent un cycle de vie en trois phases inspiré de Wayland :
x-vendor-names-name| Niveau | Composants Requis | Cible |
|---|---|---|
| Minimal | text + entrée texte | Assistants vocaux, IoT |
| Basique | text, table, form, confirm, choices | Terminaux CLI |
| Standard | Tous les composants noyau, modèle objet complet | Web / desktop |
| Complet | Standard + streaming, multi-surfaces, téléchargement de fichiers | Applications web riches |