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.
yoDEV Tested · 13 de octubre de 2026
Desplegamosweb_fetchdeagents@0.28.0en 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:
- 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_blockedpara los desafíos anti-bot, pero el cascarón vacío de una app renderizada en el cliente no produce ningún error. - 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. - Cada
offsetvuelve 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:
npm i agents@latest
Agrega el binding de Workers AI a wrangler.jsonc, que web_fetch usa para convertir HTML y documentos:
{
"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:
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:
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):
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.
¿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_fetchno 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_fetchreporta comoweb_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.
¿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_fetchrequiere 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?
- Con un fetch simple o una herramienta como web_fetch
- Con un navegador headless (Playwright, Puppeteer, Browser Run)
- Todavía no le doy acceso a la web
- Prefiero otra opción (cuéntanos cuál)
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