스트리밍
웹 소켓을 통해 브라우저 뷰포트를 스트리밍하여 실시간 미리보기 또는 "짝 맞춤 탐색"(pair browsing) 기능을 사용합니다.
이 기능을 통해 인간이 인공지능 에이전트와 함께 작업하면서 시각적으로 관찰하고 상호작용할 수 있습니다.
스트리밍 활성화
AGENT_BROWSER_STREAM_PORT 환경 변수를 설정하여 웹소켓 서버를 시작하세요:
AGENT_BROWSER_STREAM_PORT=9223 agent-browser open example.com서버는 뷰포트 프레임을 스트리밍하고 마우스, 키보드, 터치 입력 이벤트를 수신합니다.
웹소켓 프로토콜
ws://localhost:9223에 연결하여 프레임을 수신하고 입력을 전송합니다.
프레임 메시지
서버는 기본적으로 이미지를 베이스64 인코딩한 형태로 프레임 메시지를 전송합니다:
{
"type": "frame",
"data": "<베이스64-인코딩된-jpeg>",
"metadata": {
"deviceWidth": 1280,
"deviceHeight": 720,
"pageScaleFactor": 1,
"offsetTop": 0,
"scrollOffsetX": 0,
"scrollOffsetY": 0
}
}상태 메시지
연결 상태 및 화면 공유 상태 정보:
{
"type": "status",
"connected": true,
"screencasting": true,
"viewportWidth": 1280,
"viewportHeight": 720
}입력 주입
원격으로 브라우저를 제어하기 위해 입력 이벤트를 전송합니다.
마우스 이벤트
// 클릭
{
"type": "input_mouse",
"eventType": "mousePressed",
"x": 100,
"y": 200,
"button": "left",
"clickCount": 1
}
// 해제
{
"type": "input_mouse",
"eventType": "mouseReleased",
"x": 100,
"y": 200,
"button": "left"
}
// 이동
{
"type": "input_mouse",
"eventType": "mouseMoved",
"x": 150,
"y": 250
}
// 스크롤
{
"type": "input_mouse",
"eventType": "mouseWheel",
"x": 100,
"y": 200,
"deltaX": 0,
"deltaY": 100
}키보드 이벤트
// 키 다운
{
"type": "input_keyboard",
"eventType": "keyDown",
"key": "Enter",
"code": "Enter"
}
// 키 업
{
"type": "input_keyboard",
"eventType": "keyUp",
"key": "Enter",
"code": "Enter"
}
// 문자 입력
{
"type": "input_keyboard",
"eventType": "char",
"text": "a"
}
// 수정자 키 포함 (1=Alt, 2=Ctrl, 4=Meta, 8=Shift)
{
"type": "input_keyboard",
"eventType": "keyDown",
"key": "c",
"code": "KeyC",
"modifiers": 2
}터치 이벤트
// 터치 시작
{
"type": "input_touch",
"eventType": "touchStart",
"touchPoints": [{ "x": 100, "y": 200 }]
}
// 터치 이동
{
"type": "input_touch",
"eventType": "touchMove",
"touchPoints": [{ "x": 150, "y": 250 }]
}
// 터치 종료
{
"type": "input_touch",
"eventType": "touchEnd",
"touchPoints": []
}
// 멀티터치 (줌 인/아웃)
{
"type": "input_touch",
"eventType": "touchStart",
"touchPoints": [
{ "x": 100, "y": 200, "id": 0 },
{ "x": 200, "y": 200, "id": 1 }
]
}프로그래밍 인터페이스
고급 사용을 위해 타입스크립트 API를 직접 사용하여 스트리밍을 제어할 수 있습니다:
import { BrowserManager } from 'agent-browser';
const browser = new BrowserManager();
await browser.launch({ headless: true });
await browser.navigate('https://example.com');
// 캡처 콜백과 함께 시작
await browser.startScreencast((frame) => {
console.log('프레임:', frame.metadata.deviceWidth, 'x', frame.metadata.deviceHeight);
// frame.data는 베이스64 인코딩된 이미지입니다
}, {
format: 'jpeg', // 또는 'png'
quality: 80, // 0-100, jpeg 전용
maxWidth: 1280,
maxHeight: 720,
everyNthFrame: 1
});
// 마우스 이벤트 주입
await browser.injectMouseEvent({
type: 'mousePressed',
x: 100,
y: 200,
button: 'left',
clickCount: 1
});
// 키보드 이벤트 주입
await browser.injectKeyboardEvent({
type: 'keyDown',
key: 'Enter',
code: 'Enter'
});
// 터치 이벤트 주입
await browser.injectTouchEvent({
type: 'touchStart',
touchPoints: [{ x: 100, y: 200 }]
});
// 화면 공유 중인지 확인
console.log('활성:', browser.isScreencasting());
// 화면 공유 중지
await browser.stopScreencast();활용 사례
- 짝 맞춤 탐색(Pair browsing) - 인간이 실시간으로 인공지능 에이전트의 작업을 감시하고 지원
- 원격 미리보기 - 별도의 사용자 인터페이스에서 브라우저 출력을 확인
- 기록 - 비디오 생성을 위한 프레임 캡처
- 모바일 테스트 - 모바일 시뮬레이션을 위한 터치 이벤트 주입
- 접근성 테스트 - 자동화 테스트 중 수동 상호작용 수행