
Tool computer_use của Hermes Agent là cú chuyển trạng thái: từ "agent đọc web" sang "agent ngồi gõ bàn phím trên một cái desktop thật". Bài này hướng dẫn dựng môi trường Docker có X11 + VNC trên VPS, cắm Hermes vào, và bắt nó tự click chuột giùm bạn. Không phải demo, mà là cách team nhỏ tự động hóa các app desktop legacy không có API.
computer_use khác browser tool như thế nào
Đa số người mới biết Hermes nghĩ tool browser là đủ. Đúng - cho 80% trường hợp. Nhưng có một lớp việc mà browser không chạm tới: app desktop (Windows installer chạy qua Wine, phần mềm kế toán dạng .exe, công cụ thiết kế cũ, GUI of legacy ERP), app yêu cầu mouse hover phức tạp, hoặc tình huống bạn cần test một app mới build chạy trên môi trường sạch.
browser trong Hermes thực ra là Playwright headed/headless điều khiển Chromium - giới hạn trong DOM. Còn computer_use là cấp thấp hơn một bậc: agent nhận screenshot pixel-level của toàn bộ desktop, rồi gửi lệnh click x=420 y=312, type "abc", key Enter, scroll, screenshot. Mô hình thị giác phải nhìn screenshot rồi tự suy ra tọa độ. Đây là pattern mà Anthropic giới thiệu cuối 2024 với Claude, và Hermes integrate sẵn.
browser. computer_use tốn token gấp 5-10 lần vì phải xử lý ảnh screenshot mỗi step. Chỉ dùng khi thật sự cần.Phần cứng nên có
Chạy desktop ảo bên trong Docker tốn RAM hơn bạn nghĩ. Mỗi screenshot ở 1280x720 RGB là ~2.6MB raw, sau khi nén PNG còn vài trăm KB nhưng vision model vẫn phải decode. Sau một buổi test, cấu hình thực tế:
| Use case | RAM tối thiểu | VPS gợi ý |
|---|---|---|
| Chạy 1 desktop Xvfb + Hermes thuần | 4GB | VPS 80 (6GB) |
| Desktop + Firefox/Chrome + Hermes | 6GB | VPS 160 (8GB) |
| Multi-desktop (2-3 container) + concurrent | 10GB+ | VPS 320 (12GB) |
Mình test trên VPS 160 của TND (8vCPU/8GB/160GB SSD NVMe Ceph), một container Hermes + một container desktop Xubuntu chạy thoải mái, CPU idle 5-10% khi agent không active, peak ~60% lúc render. RAM ECC giúp container chạy dài ngày không bị OOM kill ngẫu nhiên - mình từng dính trên VPS cheap không ECC, mỗi 3-4 ngày Hermes mất state vì kernel kill subprocess.
Dựng Docker image desktop có VNC
Có nhiều image sẵn (Kasm, dorowu/ubuntu-desktop-lxde-vnc), nhưng mình thích tự build vì kiểm soát được gói cài. Tạo Dockerfile:
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV DISPLAY=:1
ENV VNC_PORT=5901
ENV NO_VNC_PORT=6901
RUN apt-get update && apt-get install -y \
xfce4 xfce4-goodies \
tigervnc-standalone-server tigervnc-common \
novnc websockify \
firefox xdotool scrot \
python3 python3-pip curl wget \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /root/.vnc && \
echo "tnd-vps-pass" | vncpasswd -f > /root/.vnc/passwd && \
chmod 600 /root/.vnc/passwd
COPY startup.sh /startup.sh
RUN chmod +x /startup.sh
EXPOSE 5901 6901
CMD ["/startup.sh"]
File startup.sh:
#!/bin/bash
vncserver -kill :1 || true
rm -rf /tmp/.X1-lock /tmp/.X11-unix/X1
vncserver :1 -geometry 1280x720 -depth 24 -localhost no
websockify --web=/usr/share/novnc/ 6901 localhost:5901 &
tail -f /root/.vnc/*.log
Build và chạy:
docker build -t hermes-desktop .
docker run -d --name desktop \
-p 127.0.0.1:5901:5901 \
-p 127.0.0.1:6901:6901 \
--shm-size=2g \
hermes-desktop
127.0.0.1 - tuyệt đối không expose 5901/6901 ra public. VNC password ngắn dễ brute force. Truy cập từ máy local qua SSH tunnel: ssh -L 6901:localhost:6901 user@vps-ip rồi mở http://localhost:6901.Cài Hermes và bật computer_use
Trong container Hermes (hoặc chạy Hermes trên host VPS, kết nối qua mạng nội bộ Docker), cài bằng one-liner:
curl -fsSL https://hermes.nousresearch.com/install.sh | bash
Sau đó chỉnh config để Hermes biết desktop ảo nằm ở đâu. Tạo ~/.hermes/config.yaml:
llm:
provider: anthropic
model: claude-sonnet-4.6
api_key: sk-ant-...
tools:
computer_use:
enabled: true
display: ":1"
width: 1280
height: 720
docker_container: desktop
screenshot_method: scrot
Nếu Hermes chạy trên host và desktop trong Docker, dùng docker exec wrapper. Hermes hỗ trợ cấu hình backend - đặt backend: docker trong terminal section để mọi lệnh shell agent gọi được route vào container desktop.
Test agent driving desktop
Khởi động Hermes CLI:
hermes
Prompt thử:
Mở Firefox trên desktop, vào https://www.tnd.vn/vps/,
chụp screenshot và mô tả những gói VPS hiển thị trên trang.
Hermes sẽ:
- Gọi
computer_use.screenshotđể thấy desktop hiện tại - Vision model phân tích vị trí icon Firefox
- Gọi
computer_use.clickvới tọa độ tương ứng (hoặccomputer_use.keyđể gõ Super, search "firefox") - Đợi Firefox load, screenshot lại
- Click address bar, gõ URL, Enter
- Screenshot trang đã load, mô tả nội dung
Lần đầu chạy có thể mất 30-60 giây vì mỗi step là một round-trip API. Khi đã quen pattern, Hermes lưu thành skill và lần sau nhanh hơn nhiều.
Use case thực tế đang chạy production
Mình kể thật vài cái đã deploy:
1. Test installer .exe mới build
App team dev build installer Windows mới, cần test trên máy sạch. Trước đây phải có máy ảo Windows. Giờ chạy Wine trong container desktop, để Hermes:
- Double-click installer.exe
- Bấm Next, Next, Accept license, Install
- Đợi cài xong, mở app
- Test một số luồng chính theo checklist
- Báo lỗi nếu có dialog error pop up
Tiết kiệm thời gian QA mỗi build ~30 phút.
2. Automate desktop ERP cũ không có API
Một khách dùng phần mềm kế toán Việt Nam cũ kỹ, chỉ có GUI Windows. Mỗi cuối tháng phải copy 200 dòng từ Excel vào form. Hermes + computer_use đọc file Excel, mở app, click từng cell, gõ value, save. Chạy trong container, không cần máy thật.
3. Browser fingerprinting test
Khi build product cần check stealth của antidetect browser, Hermes mở browser test thật trên desktop ảo, vào các site như creepjs, browserleaks, screenshot kết quả, so sánh giữa các profile. Vì điều khiển ở level desktop nên signal trông giống user thật hơn nhiều so với headless Playwright.
region.Bảo mật khi chạy computer_use trên VPS public
Cái này phải nhấn mạnh. Một agent biết click chuột + gõ phím + đọc screen = đầy đủ quyền tương đương user đang ngồi trước máy. Nếu compromise:
- Container desktop chạy với user không phải root (đừng chạy VNC server trong process root như trong demo của mình ở trên, đó là quick start - production phải tạo user riêng)
- Bind tất cả port localhost, expose qua SSH tunnel hoặc reverse proxy có auth
- Đặt firewall:
ufw deny 5901 && ufw deny 6901 - Không lưu credential nhạy cảm trong skill memory của agent
- Set quota CPU/RAM cho container:
--cpus=4 --memory=6g - Snapshot VPS định kỳ - nếu agent làm hỏng môi trường thì rollback nhanh
Khi cần truy cập web bằng IP sạch (ví dụ test geo-content, hoặc agent thay user duyệt một site đang chặn IP datacenter), kết hợp với proxy IPv4 VN/US dedicated 95k/IP/tháng - cấu hình system-wide proxy trong container, Firefox tự đi qua proxy, mọi click computer_use đều an toàn về mặt IP reputation.
Khi nào dừng dùng computer_use và quay về API
Mình học bài học này sau 2 tháng: computer_use rất cool nhưng đắt và chậm. Nếu task có API thuần (REST, GraphQL, RPC), luôn ưu tiên gọi API. Nếu có browser automation đủ, dùng browser tool. computer_use dành cho cuối cùng - khi không còn cách nào khác. Đó cũng là triết lý của Hermes: pick the right tool, đừng dùng dao chặt cây để cắt giấy.
Nền tảng để chạy ổn định là VPS có RAM dư, ổ đĩa nhanh, và uptime tốt - vì Hermes giữ persistent memory trong file, nếu disk lăn quay hay restart bất thường thì agent mất skill. Mình dùng VPS 160 của TND chạy được 4 tháng chưa restart lần nào. Ceph SSD NVMe nên I/O không bao giờ là bottleneck.
Tham khảo thêm bài cài Hermes gắn proxy để có baseline, và hướng dẫn chọn VPS cho vibe coder nếu chưa biết nên thuê cấu hình nào.
Bài viết liên quan
Cần VPS có RAM ECC + SSD NVMe để chạy desktop ảo + Hermes?
TND Cloud VPS 160 (8vCPU/8GB/160GB) chạy được Hermes + 2-3 container desktop ảo song song mà không ngắc. Snapshot, ổ Ceph chống lỗi.


