0.67.2
Bug fixes
Async LLM retries no longer block the event loop (#1112)
async_retry_with_exponential_backoff (used by all core async LLM call
paths) was sleeping with a synchronous time.sleep during backoff, so a
429 rate-limit retry froze every task on the event loop — concurrent
agents, run_batch_tasks, and any co-hosted server — for the entire
(exponentially growing) delay. The backoff now uses
await asyncio.sleep(...), keeping the loop responsive. Includes a
regression test that runs a heartbeat task across real backoffs to prove
the loop stays live. Thanks @pacocartones.
URLLoader document downloads now honor the configured URL limits (#1113)
When crawling a URL whose document type is only known from its
Content-Type header (e.g. extensionless ?download=... links),
URLLoader issued requests.head / requests.get with no timeout
and buffered the entire response body in memory — ignoring the
url_connect_timeout, url_read_timeout, and url_max_size settings
that ParsingConfig already defines and that extension-bearing URLs
already enforced. Downloads are now routed through the existing hardened
streaming fetcher, so both halves of the crawling path behave the same:
stalled servers abort at the configured timeouts and oversized bodies are
rejected at url_max_size (default 10MB) instead of being read whole
into RAM. Covered by hermetic tests against a local HTTP server.
Thanks @pacocartones.
Full Changelog: 0.67.1...0.67.2