Skip to content
프로토콜 사양

에이전트 렌더링 프로토콜

AI 에이전트와 렌더링 표면 간의 양방향 통신을 위한 전송 계층 독립적 프로토콜. 하나의 에이전트, 모든 화면.

v0.1 초안
오픈 표준
CC BY 4.0

문제

AI 에이전트는 구조화된 출력 — 표, 폼, 차트, 상태 메시지, 코드 블록 — 을 생성하지만, 해당 출력의 렌더링은 전송 계층 및 프론트엔드 프레임워크에 긴밀하게 결합되어 있습니다. 웹 채팅용으로 구축된 에이전트는 데스크톱 앱에서 렌더링할 수 없습니다. SSE 스트림 뒤에 있는 에이전트는 다른 프로토콜을 기대하는 모바일 클라이언트에 서비스할 수 없습니다.

새로운 렌더링 표면마다 맞춤형 통합 코드가 필요합니다.

해결책

ARP는 프로토콜을 정의합니다 — 프레임워크도, 라이브러리도 아닙니다. Wayland가 애플리케이션을 디스플레이 서버로부터 분리한 것처럼, ARP는 에이전트를 렌더러로부터 분리합니다.

에이전트는 무엇을 표시할지 결정합니다. 렌더러는 어떻게 표시할지 결정합니다.

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

설계 원칙

01
중간자 없음
에이전트가 렌더 명령을 직접 전송합니다. 렌더러가 입력을 직접 전송합니다. 중간 프레임워크 없음.
02
비동기 & 논블로킹
모든 메시지는 비동기입니다. 어느 쪽도 응답을 기다리며 블로킹하지 않습니다.
03
모든 프레임은 완벽
원자적 커밋. 렌더 상태는 대기 버퍼에 누적되고 원자적으로 적용됩니다. 깜빡임 없음.
04
기능 기반
렌더러가 지원하는 기능을 선언합니다. 에이전트가 적응합니다. CLI는 표를, 웹은 모든 것을 받습니다.
05
전송 계층 독립
논리적 메시지, 와이어 포맷이 아닙니다. WebSocket, SSE, gRPC, Unix 소켓, stdio.
06
타입이 있는 컴포넌트
에이전트는 HTML이 아닌 headersrows가 있는 table 같은 타입 디스크립터를 내보냅니다.

프로토콜 메시지

모든 ARP 메시지는 최소한 { v: 1, type: "<type>" }을 포함하는 JSON입니다.

서버 → 클라이언트
타입목적
hello연결 시 기능 핸드셰이크
delta증분 텍스트 청크
tool_start도구 실행 시작
tool_end도구 실행 완료
render생성형 UI 컴포넌트
patch증분 컴포넌트 업데이트
error오류 이벤트
commit스트림 완료
클라이언트 → 서버
타입입력 타입목적
inputtext사용자 텍스트 메시지
inputaction버튼 클릭 / UI 액션
inputform_submit폼 제출

14가지 기본 컴포넌트

ARP 적합 렌더러는 최소한 text를 지원해야 합니다. 컴포넌트는 폴백 체인을 선언합니다 — charttable로, tabletext로 폴백됩니다.

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

전송 계층

사용 가능
WebSocket
/_arp/v1
기본 전송 계층. 자동 재연결이 있는 지속적 양방향 연결.
사용 가능
SSE
Server-Sent Events
폴백 전송 계층. multipart/form-data를 통한 파일 업로드에 필수.
예정
gRPC
고성능
네이티브 데스크톱 및 모바일 애플리케이션용.
예정
stdio
NDJSON 프레이밍
CLI 렌더러 및 파이프 기반 통합용.

클라이언트 SDK

@haira/arp — 코어 (의존성 없음)
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
tsx
import { ArpChat } from '@haira/arp-react'

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

Vue 3용 @haira/arp-vue 및 Go 백엔드용 **github.com/haira-lang/arp-go**도 사용 가능합니다.

Haira 통합

모든 Haira 서버는 기본적으로 ARP를 지원합니다. 별도의 설정이 필요 없습니다.

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

확장 수명 주기

새 컴포넌트는 Wayland에서 영감을 받은 3단계 수명 주기를 따릅니다:

1. 실험적
x-vendor-name
벤더가 생성. 파괴적 변경 허용.
2. 스테이징
s-name
2개 이상의 렌더러 구현 필요. 거버넌스 검토.
3. 코어
접두사 없음
ARP 사양의 일부. 추가적 변경만 허용.

적합성 수준

수준필수 컴포넌트대상
최소text + 텍스트 입력음성 어시스턴트, IoT
기본text, table, form, confirm, choicesCLI 터미널
표준모든 코어 컴포넌트, 전체 객체 모델웹 / 데스크톱
전체표준 + 스트리밍, 멀티 표면, 파일 업로드리치 웹 앱

Released under the Apache-2.0 License.