extraction-pipeline-patterns
GitHub描述文档提取管道的架构与模式,涵盖格式检测、提取器路由及后处理流程。支持多种文件格式,集成缓存、回退和并发策略,用于高效构建数据提取系统。
Trigger Scenarios
Install
npx skills add xberg-io/xberg --skill extraction-pipeline-patterns -g -y
SKILL.md
Frontmatter
{
"name": "extraction-pipeline-patterns",
"type": "Playbook",
"paths": [
"crates\/xberg\/src\/core\/**",
"crates\/xberg\/src\/extraction\/**",
"crates\/xberg\/src\/extractors\/**",
"crates\/xberg\/src\/plugins\/**"
],
"title": "Extraction Pipeline Patterns",
"x-ai-rulez": {
"id": "extraction-pipeline-patterns",
"kind": "skill",
"metadata": {
"name": "extraction-pipeline-patterns",
"priority": "critical"
}
},
"description": "Change extraction orchestration: cache, fallback, processing and concurrency."
}
Extraction Pipeline Patterns
Format detection → extractor routing → post-processing over the FORMATS registry
The full-registry counts are verified against published claims by
scripts/sync_supported_counts.py verify. Runtime SUPPORTED_FORMAT_COUNT and
SUPPORTED_EXTENSION_COUNT values are derived from the full static FORMATS registry.
Layout
crates/xberg/src/core/pipeline/— orchestration (mod.rs,cache.rs,execution.rs,features.rs,format.rs,initialization.rs,page_markers.rs)crates/xberg/src/core/mime.rs,core/formats.rs— detection and theFORMATSregistrycrates/xberg/src/extractors/— one module per format, each implementingInternalDocumentExtractorcrates/xberg/src/extraction/— shared parsing/rendering helpers used by those extractorscrates/xberg/src/core/config/,core/config_validation/— both directories, not files
Flow
- Detect — MIME from extension via
EXT_TO_MIME, or from bytes viadetect_mime_type_from_bytes; validate againstSUPPORTED_MIME_TYPES. - Route — registry returns the highest-
priority()extractor registered for that MIME. - Extract — the extractor produces an
InternalDocument. - Post-process —
core::pipeline::run_pipeline(doc, config)(async) orrun_pipeline_sync(WASM) runs validators, quality processing, chunking and hooks, and returnsExtractedDocument. Every extraction path goes through it.
Extractor modules
- Office: DOCX, PPTX, PPT, DOC, XLSX/XLS, ODT, ODP, iWork, HWP/HWPX, and WordPerfect under
extractors/{docx,pptx,ppt,doc,excel,odt,odp,hwp,hwpx,wordperfect}.rsandextractors/iwork/. - Markup: Markdown, text, RST, Org, RTF, AsciiDoc, Typst, and Djot under
extractors/{markdown,text,rst,orgmode,asciidoc,typst}.rsandextractors/{rtf,djot_format}/. - Academic: LaTeX, BibTeX, JATS, Jupyter, DocBook, EPUB, and FictionBook under
extractors/{bibtex,jupyter,docbook,fictionbook}.rsandextractors/{latex,jats,epub}/. - PDF: text, encrypted-document, and OCR-fallback handling under
extractors/pdf/. - Images: PNG, JPEG, TIFF, WebP, HEIC, SVG, and QR under
extractors/andextraction/. - Web: HTML, XHTML, XML, and MDX under
extractors/andextraction/html/. - Email: EML, MSG, and PST under
extractors/andextraction/email/. - Archives: ZIP, TAR, GZIP, and 7z under
extractors/archive.rsandextraction/archive/. - Structured: JSON, GeoJSON, YAML, TOML, CSV, DBF, SQLite, and GeoPackage under
extractors/.
Fallback strategies
- Password-protected PDFs — try the configured password, then the secondary list; on
failure report
is_encryptedin metadata rather than erroring out. - OCR fallback — a PDF page with no extractable text routes to the OCR pipeline;
config.force_ocrandconfig.force_ocr_pagesforce it. - Nested archives — recursive with a depth limit from
SecurityLimits. - Corrupted input — emit what parsed and attach the error location; never panic.
The cross-extractor fallback chain runs only for UnsupportedFormat and Plugin errors as
defined by is_extractor_fallback_eligible. Parsing, IO, OCR, and validation errors abort the
chain. A successful fallback records an extractor-fallback processing warning.
Cache and concurrency
- Extraction keys are
<cache_version_tag>-<content_hash>-<config_hash>, never path-based. The tag hashesCARGO_PKG_VERSION,CACHE_SCHEMA_VERSION,env!("XBERG_BUILD_ID")and the debug/release bit (cache/version.rs);XBERG_BUILD_IDis the commit SHA plus a hash of any uncommitted diff (build.rs), so it IS a build fingerprint. - Two builds from different commits therefore get different entries with no schema bump needed.
The exception is a build that cannot reach git metadata and gets
XBERG_BUILD_ID = ""-- a crates.io/docs.rs tarball (safe: immutable source per version) or a Docker build (.dockerignoreexcludes**/.git/, and nothing passes the--build-argescape hatch). BumpCACHE_SCHEMA_VERSIONwhen behavior can change and those builds must not collide. For A/B or revert checks, disable the cache or export distinctXBERG_BUILD_IDvalues per arm, so the experiment cannot replay the control. - Configuration that affects output belongs in the config hash. Check the cache before extraction so a hit skips processing.
- Default batch concurrency uses host CPU count capped by any detected Linux cgroup quota via
core/config/concurrency.rs::resolve_thread_budget. core/io.rs::read_file_asynccurrently reads the whole file withtokio::fs::read; there is noAsyncReadextraction surface. Treat streaming as an open gap.- Cache hit and miss OTel counters exist, but no hit-rate target is computed or enforced.
Plugin integration
crates/xberg/src/plugins/. Registry selection is by priority(), highest wins — not by
registration order. Register above 50 to override a built-in. See
plugin-architecture-patterns.
Features
All features live in crates/xberg/Cargo.toml; there is no FEATURE_MATRIX.md.
| Group | Features |
|---|---|
| OCR | ocr, ocr-wasm, paddle-ocr, paddle-ocr-tract, sceptre-ocr, candle-vlm-ocr |
| Formats | pdf, office, excel, html, xml, email, archives, and format-specific flags |
| AI/ML | embeddings, static-embeddings, layout, keywords, language detection, and NER flags |
| Server | api (Axum), mcp, otel, prometheus, tokio-runtime |
| Aggregates | formats, analysis, services, full, and platform target groups |
Bindings are separate crates, not features of crates/xberg. The one mutually-exclusive pair
is ort-bundled / ort-dynamic. WASM excludes ORT-backed embeddings, but does carry
ocr-wasm, keywords and static-embeddings. Full detail in feature-flag-conventions.
Critical Rules
- Detect before routing — never dispatch on a caller-supplied extension alone.
- Apply
SecurityLimitsto user content — archive size, compression ratio, file count, nesting depth.
Verification
Test the changed format categories and both success and failure paths. No coverage percentage
is an enforced contract. The format headline test is the enforced count; update its constants
and listed copy together with FORMATS. Use benchmark-workflow for performance or quality
claims and test-corpus for bucket-backed fixtures.
Related Skills
- mime-detection-routing — the
FORMATSregistry and how to add a format - plugin-architecture-patterns — which trait an extractor actually implements
- format-specific-extraction — per-format workflows and helpers
- chunking-embeddings — post-extraction text splitting
Version History
- 844bb91 Current 2026-11-03 09:36
- 3be78fd 2026-10-19 16:30
-
ca15a59
2026-09-28 07:58
修正关于缓存键构建身份的说明,澄清OCR缓存键包含版本标签以防止不同构建间的碰撞。
-
d8e4815
2026-08-28 18:30
将支持格式数量从75+更新为106种/140个扩展名;细化了目录结构说明(如config目录);增强了MIME检测和路由优先级的具体实现描述;补充了更多格式类别的提取器模块路径。
- 531e0f7 2026-08-20 07:47


