Bài học hôm nay

Hôm qua tôi viết về Web Search — công cụ giúp agent tìm kiếm thông tin trên internet. Hôm nay là người anh em song sinh của nó: Web Fetch. Nếu Web Search là “Google cho agent”, thì Web Fetch là “tab trình duyệt cho agent” — bạn đưa cho nó một URL cụ thể, nó mở ra, đọc nội dung, và trả về cho bạn dưới dạng text.

Nghe đơn giản phải không? Nhưng cái đơn giản này lại có rất nhiều nuance mà tôi phải va vào mới hiểu.

Web Fetch hoạt động như thế nào

Cơ chế cốt lõi khá straightforward:

  1. Bạn đưa agent một URL (hoặc agent tự tìm được URL từ Web Search)
  2. Agent gọi Web Fetch với URL đó
  3. Hệ thống fetch nội dung HTML từ URL
  4. HTML được chuyển thành Markdown (dùng thư viện Turndown)
  5. Nội dung được truncate xuống còn 100 KB text nếu quá dài
  6. Agent đọc Markdown đó và trả lời bạn

Điểm quan trọng: agent chỉ gửi URL. Nó không thể set headers, cookies, hay credentials. Không có authentication, không có POST request, không có gì fancy. Chỉ là một GET request đơn giản.

So sánh nhanh: Web Search vs Web Fetch

Web SearchWeb Fetch
InputTừ khóa tìm kiếmURL cụ thể
OutputDanh sách kết quả (snippets)Nội dung đầy đủ của trang
Khi nào dùngChưa biết tìm ở đâuĐã biết chính xác URL
Giới hạnSnippets ngắn100 KB text

Hai tool này bổ sung cho nhau rất tốt. Workflow phổ biến nhất tôi thấy: Search trước để tìm URL → Fetch URL đó để đọc chi tiết.

Những gì Web Fetch KHÔNG làm được

Đây mới là phần quan trọng — và cũng là phần tôi mất thời gian nhất để hiểu.

1. Không render JavaScript

Web Fetch lấy HTML gốc, không phải DOM đã render. Nghĩa là nếu trang web dùng React, Vue, hay bất kỳ framework SPA nào để load nội dung dynamically, bạn sẽ nhận được… một trang trắng. Hoặc tệ hơn, một đống <div id="root"></div> không có gì bên trong.

Đây là limitation lớn nhất. Rất nhiều trang web hiện đại render phía client, và Web Fetch hoàn toàn mù trước chúng.

2. Egress proxy có thể block domain

Trong Cowork, Web Fetch chạy qua một egress proxy. Proxy này có allowlist — và không phải domain nào cũng được phép. Tôi đã thấy nhiều trường hợp agent báo lỗi EGRESS_BLOCKED khi cố fetch các trang hoàn toàn bình thường. Đây là một vấn đề thực tế mà nhiều user gặp phải, đặc biệt với các trang có bot protection hoặc nằm ngoài allowlist.

3. Không bypass được bot detection

Một số trang web detect và block request từ bot. Web Fetch không có cách nào bypass — không fake user-agent, không solve CAPTCHA. Nếu trang web không muốn bot đọc, Web Fetch sẽ thất bại.

Khi nào nên dùng Web Fetch?

Web Fetch tỏa sáng nhất với:

  • Trang documentation (docs.anthropic.com, MDN, v.v.) — thường render server-side, nội dung text-heavy
  • Blog posts và articles — nội dung tĩnh, dễ parse
  • PDF trên web — Web Fetch có thể đọc PDF files
  • API documentation — perfect use case

Và nên tránh dùng với:

  • Trang SPA render client-side
  • Trang yêu cầu login
  • Trang có bot protection mạnh
  • Trang có nội dung load lazy (infinite scroll)

Điều tôi hiểu nhầm

Sai lầm lớn nhất của tôi: nghĩ Web Fetch giống mở Chrome. Không phải. Nó giống curl hơn — chỉ lấy HTML thô rồi xử lý. Không có JavaScript engine, không có rendering, không có session.

Tôi cũng từng thử bảo agent “fetch trang này rồi click vào link trong đó” — điều đó không có nghĩa gì cả. Web Fetch trả về text, không phải trang web có thể tương tác. Muốn tương tác thật sự với web thì phải dùng Claude in Chrome — đó là một tool hoàn toàn khác.

Một điều nữa: khi Web Fetch bị block, đừng cố dùng bash để curl thay thế. Sandbox trong Cowork cũng bị giới hạn network tương tự, và system prompt cấm rõ ràng việc bypass bằng cách khác. Nếu fetch không được thì… không được thôi.

Takeaway

Web Fetch là tool đọc nội dung web — không phải trình duyệt. Hiểu rõ ranh giới đó sẽ giúp bạn đặt đúng kỳ vọng và chọn đúng tool cho đúng việc. Khi cần đọc documentation hay article tĩnh, Web Fetch cực kỳ hữu ích. Khi cần tương tác với trang web phức tạp, hãy nghĩ đến Claude in Chrome thay vì cố ép Web Fetch làm điều nó không được thiết kế để làm.

Bài tiếp theo: TIL #013 — Bash trong Cowork — agent có thể chạy shell command trong sandbox Linux, và sandbox đó hoạt động thú vị hơn bạn nghĩ.