▲ 99 · 44 comments on source · Hacker News · lahfir · 6 months ago
Show HN: Agent-desktop – AI 에이전트를 위한 네이티브 데스크톱 자동화 CLI
저는 한동안 computer-use 도구를 만들어 왔고, 약 한 달 전에 조용히 런칭했습니다 (GH에서 122 Stars). 여기서 공유할 가치가 있다고 생각했습니다. 지난 몇 달 동안 많은 computer-use 에이전트들이 나왔습니다: Codex, Claude Code, CUA 등. 대부분은 대략 이렇게 동작하는 것 같습니다:
1. 스크린샷 찍기
2. 모델이 픽셀 좌표를 예측하게 하기
3. x,y 클릭
4. 또 스크린샷 찍기
5. 반복
동작은 하지만 느리고, 토큰 비용이 많이 들고, 취약합니다. UI가 몇 픽셀만 이동해도 깨집니다. 그리고 모델은 여전히 각 요소가 실제로 무엇인지 알지 못합니다. 하지만 OS는 이미 구조화된 UI 정보를 노출하고 있습니다: - macOS: Accessibility API
- Windows: UI Automation
- Linux: AT-SPI
스크린 리더는 수년간 이 API들을 사용해 왔습니다. 웹에서는 Playwright가 스크린샷 스크래핑을 이긴 것과 같은 이유입니다: 구조화된 접근이 픽셀보다 더 나은 추상화이기 때문입니다. 그래서 저는 데스크톱 버전을 만들었습니다: agent-desktop. 접근성 트리를 통한 구조화된 데스크톱 자동화를 위한 크로스 플랫폼 CLI입니다. Rust 바이너리 하나, 약 15 MB, 런타임 의존성 없음. JSON 출력을 가진 53개의 명령을 노출하므로, LLM이 스크린샷이나 비전 모델 없이 네이티브 앱을 검사하고 조작할 수 있습니다. Vercel Labs의 agent-browser에서 영감을 받았습니다. 전형적인 루프는 이렇게 생겼습니다: agent-desktop snapshot --app Slack -i --compact
agent-desktop click @e12
agent-desktop type @e5 "ship it"
agent-desktop press cmd+return
그래서 루프는 이렇게 됩니다: 1. 스냅샷
2. 결정
3. 행동
4. 다시 스냅샷
주요 설계 문제는 컨텍스트 크기였습니다. 순진한 접근 방식은 전체 접근성 트리를 모델에 덤프하는 것이지만, 실제 앱은 거대해집니다. Slack은 전체 트리 덤프에 50,000 토큰을 쉽게 초과할 수 있어서, 이 접근 방식은 비현실적입니다. 제가 결국 사용한 접근 방식은 점진적 스켈레톤 순회입니다: - 첫 번째 패스: 얕은 트리를 반환, 보통 깊이 3, 더 깊은 컨테이너는 잘리고 children_count로 주석이 달림
- 이름이 있는 컨테이너는 참조를 받아서 에이전트가 해당 서브트리만 요청할 수 있음
- 에이전트는 --root @e3로 관련 영역으로 드릴다운
- 참조는 범위가 지정되고 해당 서브트리에 대해서만 무효화됨
- 행동 후, 에이전트는 전체 앱을 다시 스냅샷하는 대신 해당 영역만 다시 쿼리할 수 있음
실제로 이것은 Slack, VS Code, Notion 같은 Electron 앱에서 전체 트리 덤프 대비 토큰 사용량을 약 78%에서 96%까지 줄였습니다. 여기서 흥미로울 수 있는 몇 가지 구현 세부 사항: - PlatformAdapter 트레이트를 통한 엄격한 플랫폼/코어 분리를 가진 Rust 워크스페이스
- 접근성 우선 활성화 체인; 마우스 합성은 기본이 아니라 폴백
- @e1, @e2 같은 결정적 요소 참조, UI 변화에 걸친 낙관적 재식별
- 기계 판독 가능한 코드와 재시도 제안을 가진 구조화된 오류
- cdylib를 통한 C ABI, 그래서 셸 아웃 없이 Python, Swift, Go, Node, Ruby, C에서 직접 로드 가능
- 단일 호출에서의 배치 작업
- windows, menus, sheets, popovers, alerts, notifications 지원
- 매우 깊고 노이즈가 많아질 수 있는 Chromium/Electron 접근성 트리에 대한 특별 처리
제가 이것이 중요하다고 생각하는 이유: 픽셀 기반 데스크톱 제어는 새는 추상화처럼 느껴집니다. OS는 이미 UI를 의미론적으로 알고 있습니다. 접근성 API는 역할, 이름, 액션, 계층, 포커스, 선택, 상태를 직접 제공합니다. 그것은 데스크톱 에이전트에게 스크린샷 루프보다 훨씬 나은 기반처럼 보입니다. 자체 데스크톱 에이전트, 내부 자동화 도구, 또는 연구 프로토타입을 만들고 있다면, 이것이 유용할 수 있습니다. 설치: npm install -g agent-desktop
agent-desktop snapshot --app Finder -i
Repo: https://github.com/lahfir/agent-desktop 저는 특히 데스크톱 자동화를 만들어 본 사람들의 피드백을 듣고 싶습니다. 어떤 가장 큰 문제점들을 겪으셨나요, 그리고 이런 도구가 무엇을 지원하기를 원하시나요?
원문 게시글에서 발췌한 번역본입니다. 전문과 원문 댓글은 아래 링크에서 확인하세요.
Discussion on runchr
Loading comments…
to comment.