Jev Ultrafast: 동적 인덱스 기반 액션 공간을 가진 브라우저 에이전트
TypeSafe의 Jev는 동적·인덱싱된 액션 공간을 활용해 브라우저 자동화를 수행하는 에이전트로, 하나의 목표만 주면 작업(operation)과 대상 요소(element)를 선택합니다. 취리히→런던 항공권 검색을 텍스트 생성과 로딩 대기 시간까지 포함해 7.1초 만에 완료했습니다. 사이트별 스크립트 없이 구조화된 상태만 사용해 빠르고 범용적인 브라우저 자동화가 가능하다는 점이 핵심입니다.
Jev Ultrafast ⚡ 동적·인덱싱된 액션 공간(dynamic, indexed action space)을 가진 브라우저 에이전트입니다. 목표 하나만 주면 TypeSafe의 Jev가 작업(operation)과 요소(element)를 선택합니다. 작은 LLM은 작업이 TYPE_TEXT일 때만 텍스트를 생성합니다. 구글 항공권(Google Flights)에서 취리히→런던 검색이 7.1초 만에 완료됩니다. 자연어 목표 하나, 실제 텍스트 생성, 로딩 대기 시간까지 모두 포함된 시간입니다. MP4 영상 · 측정 결과 · 루프 과정 확인 가능합니다.
액션 공간 매 관찰(observation)마다 새로운 요소 테이블이 생성됩니다: [1] button 티켓 종류 변경 · 왕복 [2] combobox 출발지는? · 샌프란시스코 [3] combobox 도착지는? · 비어 있음 [4] textbox 출발일 · 비어 있음 ... 작업 종류는 CLICK, TYPE_TEXT, SELECT, SCROLL_UP, SCROLL_DOWN, WAIT, DONE, BLOCKED입니다. 지원되는 작업과 대상만 제공됩니다.
하나의 TypeSafe 요청: 페이지 → 요소 테이블 → 작업, click_target, type_text_target, select_target(있는 경우)이 함께 출력되고, 해당하는 타깃이 브라우저로 전달됩니다. CLICK [7] 또는 TYPE_TEXT [3]처럼 사용되며, TYPE_TEXT의 경우 작은 LLM이 텍스트를 생성해 브라우저로 전달합니다.
타깃 질문들은 가상의 것입니다. 작업이 CLICK이면 click_target만 실행될 수 있습니다. 두 가지 결정이 네트워크 왕복 한 번으로 이루어집니다. 각 타깃 헤드에는 호환되는 요소만 포함됩니다. 네이티브 드롭다운 선택 항목은 관찰된 요소/옵션 인덱스를 가집니다. 정책(policy)에는 사이트별 액션 스크립트나 미리 준비된 필드 문자열이 없습니다. 항공권 예시는 목표를 제공하고 결과를 독립적으로 검증합니다. 스크린샷 렌더러는 나중에 라벨을 추가할 뿐이며 브라우저를 구동하지 않습니다.
사용해 보기 git clone https://github.com/browser-use/jev-ultrafast.git cd jev-ultrafast uv sync cp .env.example .env # TYPESAFE_API_KEY와 TEXT_MODEL_API_KEY를 추가하세요. uv run jev http://127.0.0.1.8766 을 열고 Start demo → Run automatically를 클릭하세요. 인스펙터는 번호가 매겨진 요소, 작업 확률, 타깃 확률, 실행된 액션을 보여줍니다. Choose next를 선택하면 실행 전에 일시정지됩니다.
Chrome은 uv sync로 설치되는 Browser Harness를 통해 연결됩니다. 연결이 필요하면 uv run browser-harness --doctor를 실행하세요. 메시지가 표시되면 Chrome에서 원격 디버깅을 허용하세요. TEXT_MODEL_API_KEY는 예제 설정에서 OpenRouter 키입니다. 현재 데모는 추론(reasoning)을 비활성화한 inception/mercury-2.5를 사용합니다. Gemini, GLM, DeepSeek도 OpenAI 호환 텍스트 헬퍼를 사용할 수 있으며, 적절한 모델, 엔드포인트, 추론 설정을 구성하면 됩니다.
라이브러리 사용법 from jev_ultrafast import Agent
with Agent( "https://www.google.com/travel/flights?hl=en", "2026년 9월 20일 취리히에서 런던까지, 성인 1명, 이코노미 편도 항공권을 찾으세요. " "일치하는 항공편 옵션이 보이면 중지하세요.", ) as agent: for state in agent.run(): print(state["elapsed_ms"], state["status"])
uv run --env-file .env python your_script.py 로 실행하세요. 같은 정책으로 다른 작업도 실행할 수 있습니다: uv run --env-file .env python examples/run.py --url https://en.wikipedia.org/wiki/Main_Page --goal '괴델의 불완전성 정리에 관한 위키백과 문서를 찾아 여세요.'
uv run --env-file .env python examples/flights.py --keep-open 은 항공권 검색을 수행하고, 실제 노선/날짜/결과를 확인하며, 실행 기록(trace)을 저장합니다. 항공편을 선택하거나 예약하지는 않습니다.
빠른 이유 결정 주기당 요청 한 번: 작업 헤드와 타깃 헤드가 같은 관찰 상태를 공유합니다. 기본 에이전트 루프에서 스크린샷 없음: Jev는 구조화된 상태를 소비합니다. 인스펙터에서만 스크린샷을 옵트인하며, 영상은 별도의 연속 스크린캐스트를 사용합니다. 스냅샷당 브라우저 호출 한 번: 보이는 컨트롤과 그 이름, 값, 텍스트를 원자적으로(atomically) 읽습니다. 실제 DOM 노드에 대한 참조를 유지합니다. 선택된 타깃 검증: 클릭은 문서, 폼 값, 타깃, 주변 컨텍스트를 확인합니다. 애니메이션만으로는 새로운 예측을 강제하지 않습니다. 입력 전 기하 구조 확인: 현재 기하 정보를 확인하고 가려진 컨트롤은 거부합니다. 유용한 상태 대기: 콤보박스에 입력한 후에는 보이는 추천 항목을 최대 200ms까지 기다립니다. 다른 상호작용은 최대 두 개의 애니메이션 프레임 또는 50ms를 받습니다. 이러한 읽기는 실행이 기록된 후에 이루어집니다.