대화형 UI(render_ui)
Myrm은 선언적 UI 아티팩트 파이프라인을 제공합니다. 에이전트는 render_ui을 호출하고, 서버는 UI_UPDATE SSE 이벤트를 내보내고, WebUI는 채팅에서 대화형 구성 요소를 인라인으로 렌더링합니다.
도구 활성화
- 채팅에서 에이전트 설정을 엽니다.
- 대화형 UI(
render_ui)를 켭니다. - 작업공간을 처음 실행할 때 서버는
.agent/docs/A2UI_REFERENCE.md(전체 소품 매뉴얼)을 시드합니다.
서피스 게이트(웹/데스크탑 전용)
인라인 A2UI는 웹 채팅 및 Tauri 데스크톱 클라이언트(client_surface: web 또는 tauri)에만 마운트됩니다. Telegram, Discord, cron 및 기타 웹이 아닌 채널은 Turn1에서 render_ui_tool / update_ui_data_tool을 로드하지 않습니다. 대신 에이전트가 일반 텍스트로 응답하므로 해당 표면에서 턴당 최대 318개의 프롬프트 토큰이 저장됩니다. Voice(OpenAI Realtime, Gemini Live 및 에이전트 브리지)도 인라인 A2UI를 생략합니다. 세션 내 UI 렌더러가 없으므로 render_ui를 노출하면 토큰만 낭비되고 손상된 도구 호출이 발생하게 됩니다. 대화형 UI가 활성화되면 에이전트 설정에 힌트가 표시됩니다. 채팅 내 양식 및 라이브 패널에 웹 채팅 또는 데스크톱 앱을 사용하세요.
검증됨(2026년 7월 20일): Chrome E2E — 설정 힌트 + client_surface=web 후크, window.__TAURI__가 있는 경우 client_surface=tauri, 채팅의 라이브 인라인 카드(READ 2/2 + LIVE 1/1); 에이전트 스트림 통합은 표면당 마운트/생략을 주장합니다. 레인 확인자는 READ 테스트가 LIVE 임대를 차단하지 않도록 보장합니다.
render_ui이 꺼진 경우(기본값)
render_ui은 프롬프트 캐시를 간결하게 유지하기 위해 기본값은 OFF입니다. 활성화하지 않고 채팅 양식(예: 배포 체크리스트)을 요청하는 경우:
- 프리플라이트는 에이전트가 실행되기 전에
capability_gapSSE을 내보냅니다. - WebUI에 알림 메시지가 표시됩니다. 활성화 및 재전송을 탭합니다.
- 첫 번째 스트림이 여전히 로드 중인 경우 **
pendingGapRetry**은 MESSAGE_END, ERROR 또는 CANCEL까지 기다린 다음render_ui을 켜서 자동 재전송합니다. - Turn 2는 A2UI 양식을 인라인으로 렌더링합니다. 설정으로 이동할 필요가 없습니다.
A2UI v3.1 동작
전달 파이프라인(SSE)
도구 실행은ArtifactContext ContextVars가 표시되지 않는 LangGraph 하위 asyncio 작업에서 실행될 수 있습니다. Myrm은 보조자 message_id(실행 수준 바인드 + post_run pop)에 의해 UI 아티팩트를 숨기므로 UI_UPDATE SSE는 여전히 MESSAGE_END 이전에 WebUI에 도달합니다.
회귀 적용 범위(2026-07-10): 20개의 SSE 배선 사례 + 13개의 스트림 수집기 테스트 + 12개의 프런트엔드 Vitest(심층 병합 data_update 포함) + 아키텍처 열거형 패리티 + 1개의 실제 LLM 에이전트 스트림 E2E(minimax/MiniMax-M3) — 66개의 중요 경로에서 녹색 테스트. GUI 및 UX 감사: 65개의 A2UI 대화형 구성 요소 테스트 + 105개의 ArtifactCard 테스트 + 68개의 ProgressSteps 테스트 + 73개의 승인 시스템 테스트 + 6개의 gapEvents 테스트 = 317개의 프런트엔드 테스트 통과.
증분 데이터 업데이트(update_ui_data)
수명이 긴 UI(진행률 표시줄, 작업 목록, 실시간 측정 항목)는 매 턴 전체 render_ui 다시 그리기를 요구해서는 안 됩니다. 에이전트는 **update_ui_data**을 호출하여 data_update 이벤트를 내보냅니다. WebUI 심층 병합 data 모델 필드(중첩 객체는 형제 키를 유지하고 배열은 키로 대체됨)
사용자 이점: 배포 체크리스트, 일괄 진행 상황 및 모니터링 패널은 사용자가 이미 입력한 필드가 깜박이거나 삭제되지 않고 실시간으로 업데이트됩니다.
데이터 바인딩(bindings)
컴포넌트는 bindings를 선언할 수 있습니다 — prop 이름 → 데이터 경로 매핑(예: {"text": "$.status"}). 모든 렌더링에서 프론트엔드는 data 모델에서 바인딩된 prop을 해석하고 정적 값을 덮어씁니다, 표시 및 양식 컴포넌트가 완전히 데이터 기반으로 작동합니다. update_ui_data와 결합하면 에이전트가 변경된 데이터 조각만 보내며, 바인딩된 prop(진행률 퍼센트, 상태 배지, 테이블 행, 양식 값)이 제자리에서 업데이트됩니다 — 전체 아티팩트를 다시 그리거나 Markdown을 재생성할 필요가 없습니다.
JSON 형태(인접 목록)
경쟁사 대비
간단하고 명확한 질문의 경우 전체 UI를 구축하는 대신
ask_question_tool을 선호합니다. 데스크톱 앱에서는 질문이 전용 피드백 창을 통해 전달됩니다 — 채팅 흐름을 차단하지 않는 포커스된 다이얼로그입니다.
OpenClaw는 동일한 확인을 브라우저 question-prompt 컴포넌트로 렌더링하며, Hermes / deer-flow / CoPaw / LobsterAI는 대기열·타임아웃·초안 수명주기 없이 터미널 프롬프트만 제공합니다.
대용량 파일 인라인 미리보기 보호
HTML/SVG/Mermaid 아티팩트는 기본적으로 채팅 스트림에서 자동 확장됩니다. 아티팩트가 1MB(LARGE_FILE_THRESHOLD)를 초과하면 인라인 렌더러의 성능이 정상적으로 저하됩니다.
- 콘텐츠 가져오기 또는
srcDoc렌더링이 발생하지 않습니다(OOM/브라우저 지연 방지). - 압축 대체 카드에는 파일 크기와 “전체 화면에서 보기” 버튼이 표시됩니다.
- 버튼을 클릭하면 격리된 URL 모드(
iframe src)를 통해 콘텐츠를 로드하는ArtifactPortal이 열립니다. 파일 크기에 관계없이 성능 위험이 없습니다.
에이전트 구성 - 도구 로딩도 참조하세요.