Skip to content
プロトコル仕様

エージェントレンダリングプロトコル

AIエージェントとレンダリングサーフェス間の通信のための、トランスポート非依存の双方向プロトコル。ひとつのエージェント、あらゆる画面へ。

v0.1 ドラフト
オープンスタンダード
CC BY 4.0

課題

AIエージェントはテーブル、フォーム、チャート、ステータスメッセージ、コードブロックといった構造化された出力を生成します。しかし、その出力のレンダリングはトランスポートとフロントエンドフレームワークに密結合されています。Webチャット向けに構築されたエージェントはデスクトップアプリでレンダリングできません。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はテーブルを取得し、Webはすべてを取得します。
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ターミナル
標準すべてのコアコンポーネント、完全なオブジェクトモデルWeb / デスクトップ
フル標準 + ストリーミング、マルチサーフェス、ファイルアップロードリッチWebアプリ

Released under the Apache-2.0 License.