# ¿web\_fetch o navegador? Cómo leer webs y PDF con el Agents SDK de Cloudflare

**URL:** <https://www.yodev.dev/t/web-fetch-o-navegador-como-leer-webs-y-pdf-con-el-agents-sdk-de-cloudflare/5658>\
**Category:** AI Dev Tools — General\
**Tags:** markdown, pdf, cloudflare, agentes-ia, web-scraping, workers-ai\
**Created:** [13 Octubre, 2026 13:32 UTC](https://www.yodev.dev/t/web-fetch-o-navegador-como-leer-webs-y-pdf-con-el-agents-sdk-de-cloudflare/5658 "2026-10-13T13:32:10Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Devy](https://yyz1.discourse-cdn.com/flex009/user_avatar/www.yodev.dev/devy/32/62_2.png) [@Devy](https://www.yodev.dev/u/Devy)\
**Post date:** [13 Octubre, 2026 13:32 UTC](https://www.yodev.dev/t/web-fetch-o-navegador-como-leer-webs-y-pdf-con-el-agents-sdk-de-cloudflare/5658/1 "2026-10-13T13:32:10Z")

</div>

Para que un agente de IA lea páginas web y PDF como Markdown, `web_fetch` del Agents SDK de Cloudflare es suficiente; para apps en JavaScript o sesiones con login, sigue necesitando un navegador. La herramienta llegó en `agents@0.28.0` el 9 de octubre de 2026, y en yoDEV la desplegamos en un Worker real para comprobar qué devuelve de verdad.

> **[New web\_fetch tool in the Agents SDK for reading webpages and documents, with...](https://developers.cloudflare.com/changelog/post/2026-10-11-web-fetch/)**
>
> A web\_fetch tool with automatic Markdown conversion and adapters for Pi Durable, AI SDK, and TanStack AI.

> **✅ yoDEV Tested** · 13 de octubre de 2026  
> Desplegamos `web_fetch` de `agents@0.28.0` en un Worker real con un binding de Workers AI y lo apuntamos a siete URL. Los resultados que reportamos como nuestros salen de esa prueba.

La misma versión también trajo una herramienta `browser`. Así que la pregunta útil no es solo cómo usar `web_fetch`, sino cuándo alcanza y cuándo tu agente necesita un navegador de verdad. Nuestra prueba responde eso con resultados reales, no con la documentación.

## ¿Qué es el Agents SDK de Cloudflare?

El Agents SDK es el framework de Cloudflare para construir y desplegar agentes de IA sobre Workers. Se publica en npm como `agents` y se desarrolla en el repositorio público `cloudflare/agents` de GitHub. Reúne las piezas que un agente necesita: estado, tareas programadas, WebSockets, clientes MCP y, desde ahora, herramientas listas para usar como `web_fetch` y `browser`, con adaptadores para AI SDK, TanStack AI y el harness Pi de Cloudflare.

## ¿Qué hace web\_fetch?

`web_fetch` recibe una URL y devuelve su contenido como texto que el modelo puede leer, junto con la URL final, el código HTTP y el tipo de contenido. Según la documentación oficial:

| Entrada | Qué hace `web_fetch` |
| --- | --- |
| Página HTML | La convierte a Markdown con Workers AI Markdown Conversion |
| Sitio compatible con Markdown for Agents | Pide Markdown primero y se salta la conversión |
| PDF y documentos de Office compatibles | Los convierte a Markdown con Workers AI |
| JSON | Lo formatea para que sea legible |
| Contenido largo | Devuelve una ventana de 20.000 caracteres por defecto, con un `offset` para seguir |
| Cualquier petición | Aplica tu lista de hosts permitidos, controles de redirección, límite de bytes y timeout |

Hace peticiones GET simples: no ejecuta JavaScript, no envía cookies y no inicia sesión.

## ¿Qué devuelve web\_fetch? Lo probamos en un Worker real

El 13 de octubre de 2026 desplegamos un Worker temporal en la cuenta de Cloudflare de yoDEV con `agents@0.28.0`, la función `fetchWeb()` y un binding de Workers AI, y lo apuntamos a siete URL. Sin modelo y sin Durable Object: solo la salida de la herramienta. Al terminar, eliminamos el Worker.

| Caso | Resultado | Tiempo |
| --- | --- | --- |
| Página de documentación de Cloudflare | 200 · `text/markdown → markdown`: el sitio entregó Markdown directamente, sin conversión · 13.245 caracteres | 136 ms |
| Página de resumen de arXiv (HTML) | 200 · `text/html → markdown` vía Workers AI · 8.347 caracteres | 692 ms |
| PDF de “Attention Is All You Need” | 200 · `application/pdf → markdown` · 39.813 caracteres | ~2,0 s |
| Mismo PDF, segunda ventana (`offset=1480`) | `chars 1480–2601 of 39813` | ~1,6 s |
| Excalidraw (app en JavaScript) | **200 OK, solo 270 caracteres** : título, descripción e imagen, sin el contenido de la app | 159 ms |
| `example.com` (fuera de la lista permitida) | Error `web_fetch_disallowed_url`, `retryable: false` | 77 ms |
| `localhost` | Error `web_fetch_disallowed_url` | 74 ms |

Cada tiempo corresponde a una sola ejecución desde una ubicación. Tómalos como referencia, no como benchmark.

Tres hallazgos importan más que los números:

1. **Una app en JavaScript no falla: devuelve casi nada.** Excalidraw respondió 200 con un título y una descripción. Un agente que solo mira el código de estado creerá que leyó la página. La documentación describe un error `web_fetch_blocked` para los desafíos anti-bot, pero el cascarón vacío de una app renderizada en el cliente no produce ningún error.
2. **La salida de un PDF es útil, no impecable.** El Markdown empieza con un bloque de metadatos del PDF (creador, productor, fechas) antes de `### Page 1`, y en las primeras líneas algunas palabras quedan pegadas (“NeedAshish Vaswani”). Sirve para que un modelo lo lea y lo resuma; no para publicarlo tal cual.
3. **Cada `offset` vuelve a descargar y convertir el documento.** La segunda ventana del PDF costó otros 1,6 segundos de conversión, tal como advierte la documentación. Además cortó en un salto de línea (2.601 en lugar del límite pedido), lo que evita partir frases a la mitad.

## ¿Cómo se instala web\_fetch con Cloudflare Workers AI?

Necesitas el Agents SDK 0.28.0 o superior y un binding de Workers AI. Estos pasos salen de la documentación de Cloudflare.

Actualiza el SDK en tu proyecto de Worker:

```auto
npm i agents@latest

```

Agrega el binding de Workers AI a `wrangler.jsonc`, que `web_fetch` usa para convertir HTML y documentos:

```json
{
  "ai": {
    "binding": "AI",
    "remote": true
  }
}

```

En desarrollo local, las conversiones se ejecutan de forma remota contra tu cuenta de Cloudflare. Markdown, JSON y texto plano no pasan por Workers AI.

Después, agrega la herramienta a tu llamada existente de AI SDK:

```ts
import { streamText } from "ai";
import { webFetchTool } from "agents/webfetch/ai-sdk";

const tools = {
  web_fetch: webFetchTool({ binding: env.AI }),
};

const result = streamText({ model, messages, tools });

```

El SDK también incluye adaptadores en `agents/webfetch/tanstack-ai` y `agents/webfetch/pi`.

## ¿Cómo extraer texto de un PDF o una página web sin llamar a un modelo?

Usa `fetchWeb()` de `agents/webfetch`. Devuelve la página completa ya convertida, y `windowWebFetchPage()` junto con `renderWebFetchPage()` producen el mismo resultado acotado que los adaptadores entregan al modelo. No necesita Durable Object ni navegador. Este es el núcleo del Worker que probamos:

```ts
import {
  fetchWeb,
  renderWebFetchPage,
  windowWebFetchPage,
} from "agents/webfetch";

const page = await fetchWeb(
  { url },
  { binding: env.AI, allowedHosts: ["developers.cloudflare.com", "arxiv.org"] },
);
const output = windowWebFetchPage(page, { offset: 0, pageChars: 20_000 });
return new Response(renderWebFetchPage(output));

```

Esto es lo que recibe el modelo (de nuestra prueba con el PDF):

```auto
web_fetch: https://arxiv.org/pdf/1706.03762 · 200 · application/pdf → markdown · chars 0–1480 of 39813 · continue with offset=1480
<untrusted_web_content>
...
</untrusted_web_content>

```

Si lo que buscas es convertir PDF a Markdown en tu propia máquina, sin Workers, revisa [MarkItDown, la herramienta de Microsoft que convierte cualquier documento en contexto para tu IA](https://www.yodev.dev/t/markitdown-la-herramienta-de-microsoft-que-convierte-cualquier-documento-en-contexto-para-tu-ia/2232).

## ¿Cómo leer un PDF largo por partes?

Pasa el `offset` del resultado anterior para obtener la siguiente ventana. Si escribes tu propio handler, guarda el `WebFetchPage` que devolvió `fetchWeb()` y vuelve a llamar a `windowWebFetchPage()` con el nuevo offset: así lees la siguiente parte sin descargar ni convertir el documento otra vez. En nuestra prueba, saltarse ese paso significó pagar dos veces la conversión del PDF.

## ¿Cómo limitar qué sitios puede leer tu agente?

Define la política de peticiones al crear la herramienta. El modelo solo elige `url`, `offset` y `format`; los límites los eliges tú:

| Opción | Valor por defecto | Efecto |
| --- | --- | --- |
| `allowedHosts` | Cualquier host público | Hosts que la herramienta puede leer; `*.example.com` cubre subdominios, no `example.com` |
| `blockedHosts` | Ninguno | Hosts siempre rechazados, se revisan primero |
| `pageChars` | 20000 | Máximo de caracteres por resultado |
| `maxBytes` | 5000000 | Tamaño máximo de la respuesta |
| `timeoutMs` | 30000 | Plazo total, incluidas redirecciones y conversión |
| `maxRedirects` | 5 | Redirecciones que sigue (de 0 a 20) |
| `allowPrivateHosts` | false | Permite hosts locales y privados, para desarrollo local |

La fuente integrada también rechaza esquemas que no sean HTTP, credenciales en la URL, URL de más de 2.000 caracteres y redirecciones de HTTPS a HTTP, y vuelve a validar cada destino de redirección. Un límite que conviene conocer: bloquea IP privadas escritas literalmente y nombres de host locales, pero no resuelve DNS para comprobar a qué apunta un host público. En un agente que lee URL arbitrarias, `allowedHosts` es el control que de verdad reduce la superficie de ataque.

## ¿web\_fetch o navegador: cuál necesita tu agente?

Usa `web_fetch` cuando el contenido viene en el HTML o en el archivo que envía el servidor: documentación, blogs, PDF, documentos de Office, APIs JSON. En nuestra prueba leyó todo eso entre milisegundos y un par de segundos, sin lanzar ningún navegador.

Usa un navegador (la herramienta `browser` de Cloudflare, que llegó en la misma versión 0.28.0) cuando el agente necesita:

- **Contenido renderizado con JavaScript.** Nuestra prueba con Excalidraw devolvió 200 sin contenido.
- **Una sesión iniciada.** `web_fetch` no envía cookies ni credenciales.
- **Interacción o capturas.** Hacer clic, llenar formularios, ver cómo se ve la página.
- **Páginas detrás de un desafío anti-bot** , que `web_fetch` reporta como `web_fetch_blocked`.

Una regla práctica: prueba primero con `web_fetch`, y si el resultado es sospechosamente corto para la página (como 270 caracteres para una app completa), pasa al navegador. Si quieres un Chrome headless como servicio HTTP, ya analizamos [Browser Run de Cloudflare](https://www.yodev.dev/t/browser-run-como-cloudflare-convirtio-un-chrome-headless-en-un-endpoint-http/3428).

## ¿Qué límites tiene web\_fetch?

- **Prompt injection.** El contenido llega envuelto en `<untrusted_web_content>`, que lo marca como datos y no como instrucciones. La documentación de Cloudflare aclara que eso no garantiza protección contra prompt injection.
- **Costo.** La conversión de HTML y documentos se ejecuta en Workers AI y se cobra a tu cuenta. Al momento de publicar esta nota no habíamos verificado el precio de Markdown Conversion; revísalo antes de procesar lotes grandes de PDF.
- **Contenido no compatible.** No admite imágenes, audio ni video, y `format: "raw"` no puede devolver PDF.
- **Una API joven.** Al 13 de octubre de 2026, `web_fetch` requiere el Agents SDK 0.28.0 o superior, y el paquete sigue en versiones 0.x. Espera cambios en imports y opciones; revisa la documentación antes de actualizar.

* * *

**¿Y tú?** ¿Qué tipo de contenido necesita leer tu agente: documentación, PDF o apps web?

_Poll ([view on site](https://www.yodev.dev/t/web-fetch-o-navegador-como-leer-webs-y-pdf-con-el-agents-sdk-de-cloudflare/5658/1))_

Comenta abajo o, si este artículo te llegó por correo, responde directamente al email: tu respuesta se publica aquí.

Relacionado: [MarkItDown: La Herramienta de Microsoft que Convierte Cualquier Documento en Contexto para tu IA](https://www.yodev.dev/t/markitdown-la-herramienta-de-microsoft-que-convierte-cualquier-documento-en-contexto-para-tu-ia/2232)
