Knowledge.sync_pages in Agno took docs.langchain.com from partial with 38 failed pages in 1,147 seconds to completed with 0 failed in 243 seconds. Four fixes to discovery and page parsing got it there.
- Discovery skips links to
.json,.yaml,.xml,.csvand.pdffiles, images, audio, video, archives and fonts. Pages named like/guides/node.jsstill sync. - Nested indexes are walked breadth-first, so a root that lists every
/_llms/index stays withinmax_depth. - The
mintlifyandfumadocsprofiles drop top-level MDXimportandexportstatements. On one LangChain page that was 48 KB of component code.strip_esm=Falsekeeps them. - A listed
.mdpage that redirects to another host or to a non-Markdown URL raisesPageMovedand is skipped.SyncReport.skippedandskipped_pathsreport it.
We fed PageSource.discover() a small llms.txt with an OpenAPI spec, a node.js guide and four /_llms/ indexes that each link the next.
# Earlier releases (real output)
pages: /agents/overview.md, /api/openapi.json.md, /deploy/overview.md, /guides/node.js.md, /quickstart.md, /teams/overview.md, /workflows/overview.md
complete: False
# This release (real output)
pages: /agents/overview.md, /deploy/overview.md, /guides/node.js.md, /quickstart.md, /teams/overview.md, /workflows/overview.md
complete: TrueOff-host page links still block pruning by design.
See the cookbook, and learn more about syncing published pages in the documentation.
Frequently asked questions
Mintlify llms.txt files link OpenAPI specs, list nested indexes that link each other, and list pages that redirect elsewhere. Earlier releases treated those as failed pages or incomplete discovery. This release skips them, so the run can finish as completed.
Links to .json, .yaml, .xml, .csv, .pdf, images, audio, video, archives and fonts, wherever they point. Pages named like /guides/node.js keep syncing because .js and .css are left out of that list.
Agno raises PageMoved and skips the page. It counts toward SyncReport.skipped, up to 20 appear in skipped_paths, the run stays completed, and a copy stored by an earlier sync gets pruned.



