#![deny(clippy::print_stdout, clippy::print_stderr)]
#![cfg_attr(test, allow(clippy::print_stdout, clippy::print_stderr, clippy::dbg_macro))]
#![deny(unsafe_code)]
#[cfg(all(
feature = "sceptre-ocr-ort",
any(target_arch = "wasm32", target_os = "android", target_os = "ios")
))]
compile_error!("`sceptre-ocr-ort` supports desktop and server targets only; use `sceptre-ocr-tract` on mobile");
#[cfg(all(
feature = "paddle-ocr-ort",
any(target_arch = "wasm32", target_os = "android", target_os = "ios")
))]
compile_error!("`paddle-ocr-ort` supports desktop and server targets only; use `paddle-ocr-tract` on mobile");
pub mod cache;
pub(crate) mod cache_dir;
pub mod cancellation;
pub mod core;
pub mod engine;
pub mod error;
pub mod extraction;
pub mod extractors;
#[cfg(all(
feature = "layout-detection",
any(feature = "pdf", feature = "ocr", feature = "ocr-wasm")
))]
pub mod model_cache;
pub mod plugins;
pub mod rendering;
pub mod telemetry;
pub mod text;
pub mod types;
pub mod utils;
#[cfg(any(feature = "ocr", feature = "pdf", paddle_ocr))]
pub mod table_core;
#[cfg(feature = "tower-service")]
pub mod service;
#[cfg(feature = "api")]
pub mod api;
#[cfg(feature = "mcp")]
pub mod mcp;
#[cfg(feature = "chunking")]
pub mod chunking;
#[cfg(feature = "diff")]
pub mod diff;
#[cfg(all(feature = "liter-llm", not(target_arch = "wasm32")))]
pub mod llm;
#[cfg(feature = "embedding-presets")]
pub mod embeddings;
#[cfg(any(feature = "reranker-presets", feature = "reranker"))]
pub mod reranking;
#[cfg(feature = "onnx-runtime")]
pub(crate) mod onnx;
#[cfg(any(feature = "sparse-embedding-presets", feature = "sparse-embeddings"))]
pub mod sparse_embeddings;
#[cfg(any(feature = "late-interaction-presets", feature = "late-interaction"))]
pub mod late_interaction;
#[cfg(feature = "ocr-pipeline")]
pub mod image;
#[cfg(feature = "language-detection")]
pub mod language_detection;
#[cfg(feature = "stopwords")]
pub mod stopwords;
#[cfg(any(feature = "keywords-yake", feature = "keywords-rake"))]
pub mod keywords;
#[cfg(feature = "enrichment")]
pub mod enrichment;
#[cfg(feature = "heuristics")]
pub mod heuristics;
#[cfg(feature = "heuristics")]
pub use heuristics::{
BoundaryReason, ChunkInfo, ChunkPlan, ChunkingDecision, ChunkingReason, ConfidenceSignals, ConfidenceWeights,
DocumentBoundary, DocumentMetadata, ExtractionConfidence, HeuristicsConfig, HeuristicsError, MultidocInput,
MultidocThresholds, NoChunkingReason, PageRange, PageSignals, SchemaCompliance, StructuredCallMode,
StructuredInput, StructuredThresholds, UserChunkConfig, analyze_document, analyze_with_user_chunks,
boundaries_from_extraction_result, calculate_chunk_plan, calculate_plan_from_overrides, check_format_limits,
choose_call_mode, detect_boundaries, score_confidence,
};
#[cfg(feature = "presets")]
pub mod presets;
#[cfg(any(feature = "ocr", feature = "ocr-wasm"))]
pub mod ocr;
pub(crate) mod ocr_metadata_keys;
pub mod doctor;
#[cfg(any(
paddle_ocr,
feature = "embeddings",
feature = "reranker",
feature = "onnx-runtime",
feature = "layout-detection",
feature = "auto-rotate",
feature = "transcription"
))]
pub mod ort_discovery;
#[cfg(not(target_arch = "wasm32"))]
pub(crate) mod model_download;
#[cfg(any(layout_detection, auto_rotate))]
pub(crate) mod inference;
#[cfg(any(paddle_ocr, feature = "paddle-ocr-types"))]
pub mod paddle_ocr;
#[cfg(all(sceptre_ocr, not(target_arch = "wasm32")))]
pub mod sceptre_ocr;
#[cfg(any(sceptre_ocr, feature = "sceptre-wasm"))]
mod sceptre_languages;
#[cfg(feature = "sceptre-wasm")]
pub mod sceptre_wasm;
#[cfg(feature = "candle-ocr")]
pub mod candle_ocr;
#[cfg(feature = "auto-rotate-types")]
pub mod doc_orientation;
#[cfg(feature = "layout-types")]
pub mod layout;
#[cfg(feature = "formula-recognition")]
pub mod formula_recognition;
#[cfg(feature = "pdf")]
pub mod pdf;
#[cfg(feature = "transcription")]
pub mod transcription;
#[cfg(feature = "captioning")]
pub mod captioning;
pub use error::{Result, XbergError};
pub use types::*;
#[cfg(feature = "office")]
pub use extraction::office_metadata::{CoreProperties, DocxAppProperties};
#[cfg(feature = "url-ingestion")]
pub use core::extract::map_url;
pub use core::extract::{extract, extract_batch};
#[cfg(feature = "pdf")]
pub use core::split::{SplitConfig, SplitSegment, SplitStrategy, split_and_extract};
pub use core::config::{
AccelerationConfig, BedrockConfig, CallMode, CaptioningConfig, ChunkClassificationConfig,
ChunkClassificationDefinition, ChunkSizing, ChunkerType, ChunkingConfig, ConcurrencyConfig, ContentFilterConfig,
CredentialProviderConfig, CsvConfig, EmailConfig, EmbeddingConfig, EmbeddingModelType, ExecutionProviderType,
ExtractInput, ExtractInputKind, ExtractionConfig, ExtractionErrorItem, ExtractionResult, ExtractionSummary,
FileExtractionConfig, GeoJsonExtractionConfig, ImageExtractionConfig, JupyterCellRendering,
LanguageDetectionConfig, LlmBudgetConfig, LlmCacheConfig, LlmConfig, LlmProviderConfig, LlmRateLimitConfig,
MergeMode, MimeDetectionPolicy, NerBackendKind, NerConfig, OcrConfig, OutputFormat, PageClassificationConfig,
PageConfig, PostProcessorConfig, RedactionConfig, RedactionPattern, RedactionTerm, RerankerConfig, RerankerHead,
RerankerModelType, StructuredExtractionConfig, SummarizationConfig, TableChunkingMode, TokenReductionOptions,
TranslationConfig, UrlExtractionConfig, UrlExtractionMode,
};
pub use core::config::{
LateInteractionConfig, LateInteractionModelType, SparseEmbeddingConfig, SparseEmbeddingModelType,
};
#[cfg(feature = "transcription-types")]
pub use core::config::{TranscriptionConfig, WhisperModel};
#[cfg(any(feature = "url-ingestion", feature = "url-config-types"))]
pub use crawlberg::{
AssetCategory, AuthConfig, BrowserBackend, BrowserConfig, BrowserMode, BrowserWait, ContentConfig, CrawlConfig,
ProxyConfig, SsrfPolicy,
};
#[cfg(feature = "url-ingestion")]
pub use crawlberg::{MapResult, SitemapUrl};
pub use extractors::security::SecurityLimits;
#[cfg(feature = "presets")]
pub use presets::{
LoadError, MetaSchema, Preset, PresetCategory, PresetSample, PresetSummary, Registry, ResolveError, ResolvedPreset,
resolve,
};
#[cfg(feature = "quality")]
pub use text::{ReductionLevel, TokenReductionConfig};
#[cfg(all(
feature = "ner-llm",
not(target_arch = "wasm32"),
not(all(target_os = "android", target_arch = "x86_64"))
))]
#[cfg_attr(alef, alef(skip))]
pub use text::ner::llm::LlmBackend;
#[cfg(feature = "ner")]
pub use text::ner::NerBackend;
#[cfg(feature = "ner-onnx")]
pub use text::ner::gline::GlineBackend;
#[cfg(feature = "ner")]
#[cfg_attr(alef, alef(skip))]
pub use text::ner::detect_entities;
#[cfg(feature = "classification")]
#[cfg_attr(alef, alef(skip))]
pub use text::classification::classify_document;
#[cfg(feature = "redaction")]
pub use text::redaction::strategy::TokenCounter;
#[cfg(feature = "api-types")]
pub use core::server_config::ServerConfig;
#[cfg(feature = "pdf")]
pub use core::config::{HierarchyConfig, PdfBackend, PdfConfig};
#[cfg(feature = "html")]
pub use core::config::{HtmlOutputConfig, HtmlTheme};
#[cfg(feature = "html")]
pub use html_to_markdown_rs::ConversionOptions;
#[cfg(feature = "html")]
pub use rendering::StyledHtmlRenderer;
#[cfg(feature = "paddle-ocr-types")]
pub use paddle_ocr::{ModelPaths, PaddleInferenceBackend, PaddleLanguage, PaddleOcrConfig};
#[cfg(paddle_ocr)]
pub use paddle_ocr::{ModelCacheStats, ModelManager, ModelManifestEntry, PaddleOcrBackend};
#[cfg(all(feature = "layout-detection", not(paddle_ocr)))]
pub use layout::model_manager::ModelManifestEntry;
pub use cache::CacheStats;
#[cfg(feature = "layout-types")]
pub use core::config::{LayoutDetectionConfig, LayoutStrategy, TableModel};
#[cfg(feature = "layout-types")]
pub use layout::types::{BBox, DetectionResult, LayoutClass, LayoutDetection};
#[cfg(feature = "layout-types")]
pub use layout::types::RecognizedTable;
#[cfg(any(feature = "ocr", feature = "ocr-wasm"))]
pub use ocr::types::PSMMode;
pub use core::config::{OcrPipelineConfig, OcrPipelineStage, OcrQualityThresholds, OcrStrategy, VlmFallbackPolicy};
#[cfg(feature = "auto-rotate-types")]
pub use doc_orientation::OrientationResult;
#[cfg(any(feature = "keywords-yake", feature = "keywords-rake"))]
pub use keywords::{Keyword, KeywordAlgorithm, KeywordConfig, NgramRange};
#[cfg(feature = "keywords-rake")]
pub use keywords::RakeParams;
#[cfg(feature = "keywords-yake")]
pub use keywords::YakeParams;
#[cfg(feature = "markdown-footnotes")]
pub use text::markdown_footnotes::{
Citation, FootnoteAnchor, FootnoteConfig, FootnoteDefinition, find_footnote_anchors, find_inference_markers,
find_unmarked_claims, parse_citations, parse_footnote_definitions, verify_excerpt,
};
#[cfg(feature = "diff")]
pub use diff::{DiffHunk, DiffOptions, EmbeddedChanges, EmbeddedDiff, ExtractionDiff, TableDiff, compare};
#[cfg(feature = "tree-sitter")]
pub use core::config::{CodeContentMode, TreeSitterConfig, TreeSitterProcessConfig};
#[cfg(feature = "tree-sitter")]
pub use tree_sitter_language_pack::{
CommentKind, DiagnosticSeverity, ExportKind, FileMetrics, ProcessConfig, StructureKind,
};
pub use core::mime::{
SUPPORTED_EXTENSION_COUNT, SUPPORTED_FORMAT_COUNT, SupportedFormat, detect_mime_type_from_bytes,
get_extensions_for_mime, list_supported_formats,
};
pub fn detect_mime_type(path: String, check_exists: bool) -> crate::Result<String> {
core::mime::detect_mime_type(path, check_exists)
}
#[cfg(feature = "pdf")]
pub use pdf::render::{pdf_page_count, render_pdf_page_to_png};
pub use doctor::{DoctorCheck, DoctorReport, ProbeStatus, doctor};
#[cfg_attr(alef, alef(skip))]
pub use plugins::{
clear_document_extractors, clear_embedding_backends, clear_ocr_backends, clear_post_processors, clear_renderers,
clear_reranker_backends, clear_tokenizer_backends, clear_validators, list_document_extractors,
list_embedding_backends, list_ocr_backends, list_post_processors, list_renderers, list_reranker_backends,
list_tokenizer_backends, list_validators, register_document_extractor, register_embedding_backend,
register_ocr_backend, register_post_processor, register_renderer, register_reranker_backend,
register_tokenizer_backend, register_validator, unregister_document_extractor, unregister_embedding_backend,
unregister_ocr_backend, unregister_post_processor, unregister_renderer, unregister_reranker_backend,
unregister_tokenizer_backend, unregister_validator,
};
#[cfg_attr(alef, alef(skip))]
pub use plugins::{
ConfidenceSemantics, DocumentExtractor, EmbeddingBackend, InternalDocumentExtractor, OcrBackend, OcrBackendType,
PageOrientationHandling, Plugin, PostProcessor, ProcessingStage, Renderer, RerankerBackend, TokenizerBackend,
Validator,
};
#[cfg(feature = "embedding-presets")]
pub use embeddings::EmbeddingPreset;
#[cfg(any(feature = "embeddings", feature = "static-embeddings"))]
#[cfg_attr(alef, alef(skip))]
pub fn embed_texts(texts: Vec<String>, config: &core::config::EmbeddingConfig) -> crate::Result<Vec<Vec<f32>>> {
embeddings::embed_texts(&texts, config)
}
#[cfg(all(
feature = "tokio-runtime",
any(feature = "embeddings", feature = "static-embeddings")
))]
#[cfg_attr(alef, alef(skip))]
pub use embeddings::embed_texts_async;
#[cfg(feature = "embedding-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn get_embedding_preset(name: &str) -> Option<embeddings::EmbeddingPreset> {
embeddings::get_preset(name)
}
#[cfg(feature = "embedding-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn list_embedding_presets() -> Vec<String> {
embeddings::list_presets()
}
#[cfg(feature = "embedding-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn embedding_query_prefix(config: &EmbeddingConfig) -> Option<String> {
embeddings::embedding_query_prefix(config)
}
#[cfg(feature = "reranker-presets")]
pub use reranking::RerankerPreset;
#[cfg(any(feature = "reranker-presets", feature = "reranker"))]
pub use reranking::RerankedDocument;
#[cfg(feature = "reranker")]
#[cfg_attr(alef, alef(skip))]
pub fn rerank(
query: String,
documents: Vec<String>,
config: &core::config::RerankerConfig,
) -> crate::Result<Vec<reranking::RerankedDocument>> {
reranking::rerank(query, documents, config)
}
#[cfg(all(feature = "reranker", feature = "tokio-runtime"))]
#[cfg_attr(alef, alef(skip))]
pub use reranking::rerank_async;
#[cfg(feature = "reranker-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn get_reranker_preset(name: &str) -> Option<reranking::RerankerPreset> {
reranking::get_preset(name)
}
#[cfg(feature = "reranker-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn list_reranker_presets() -> Vec<String> {
reranking::list_presets()
}
#[cfg(not(feature = "reranker-presets"))]
#[cfg_attr(alef, alef(skip))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct RerankedDocument {
pub index: usize,
pub score: f32,
pub document: String,
}
#[cfg(feature = "sparse-embedding-presets")]
pub use sparse_embeddings::{SparseEmbedding, SparseEmbeddingPreset};
#[cfg(feature = "sparse-embeddings")]
#[cfg_attr(alef, alef(skip))]
pub fn embed_sparse(
texts: Vec<String>,
config: &core::config::SparseEmbeddingConfig,
) -> crate::Result<Vec<SparseEmbedding>> {
sparse_embeddings::embed_sparse(&texts, config)
}
#[cfg(all(feature = "sparse-embeddings", feature = "tokio-runtime"))]
#[cfg_attr(alef, alef(skip))]
pub use sparse_embeddings::embed_sparse_async;
#[cfg(feature = "sparse-embedding-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn get_sparse_embedding_preset(name: &str) -> Option<sparse_embeddings::SparseEmbeddingPreset> {
sparse_embeddings::get_preset(name)
}
#[cfg(feature = "sparse-embedding-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn list_sparse_embedding_presets() -> Vec<String> {
sparse_embeddings::list_presets()
}
#[cfg(not(feature = "sparse-embedding-presets"))]
#[cfg_attr(alef, alef(skip))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct SparseEmbedding {
pub indices: Vec<u32>,
pub values: Vec<f32>,
}
#[cfg(not(feature = "sparse-embedding-presets"))]
#[cfg_attr(alef, alef(skip))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SparseEmbeddingPreset {
pub name: String,
pub model_repo: String,
pub model_file: String,
pub additional_files: Vec<String>,
pub max_length: usize,
pub description: String,
}
#[cfg(feature = "late-interaction-presets")]
pub use late_interaction::{
LateInteractionMatch, LateInteractionPreset, MultiVectorEmbedding, max_sim_rank, max_sim_score,
};
#[cfg(feature = "late-interaction")]
#[cfg_attr(alef, alef(skip))]
pub fn embed_multi_vector(
texts: Vec<String>,
config: &core::config::LateInteractionConfig,
is_query: bool,
) -> crate::Result<Vec<MultiVectorEmbedding>> {
late_interaction::embed_multi_vector(&texts, config, is_query)
}
#[cfg(all(feature = "late-interaction", feature = "tokio-runtime"))]
#[cfg_attr(alef, alef(skip))]
pub use late_interaction::embed_multi_vector_async;
#[cfg(feature = "late-interaction-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn get_late_interaction_preset(name: &str) -> Option<late_interaction::LateInteractionPreset> {
late_interaction::get_preset(name)
}
#[cfg(feature = "late-interaction-presets")]
#[cfg_attr(alef, alef(skip))]
pub fn list_late_interaction_presets() -> Vec<String> {
late_interaction::list_presets()
}
#[cfg(not(feature = "late-interaction-presets"))]
#[cfg_attr(alef, alef(skip))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct MultiVectorEmbedding {
pub num_tokens: u32,
pub dim: u32,
pub data: Vec<f32>,
}
#[cfg(not(feature = "late-interaction-presets"))]
#[cfg_attr(alef, alef(skip))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[cfg_attr(feature = "api", derive(utoipa::ToSchema))]
pub struct LateInteractionMatch {
pub index: usize,
pub score: f32,
}
#[cfg(not(feature = "late-interaction-presets"))]
#[cfg_attr(alef, alef(skip))]
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct LateInteractionPreset {
pub name: String,
pub model_repo: String,
pub model_file: String,
pub additional_files: Vec<String>,
pub max_length: usize,
pub query_max_length: usize,
pub dim: usize,
pub description: String,
}
#[cfg(all(feature = "captioning", feature = "tokio-runtime"))]
#[cfg_attr(alef, alef(skip))]
pub use captioning::caption_image;
#[cfg(all(feature = "captioning", feature = "tokio-runtime"))]
#[cfg_attr(alef, alef(skip))]
pub use captioning::caption_image_file;
#[cfg(all(feature = "captioning", feature = "tokio-runtime"))]
#[cfg_attr(alef, alef(skip))]
pub use captioning::caption_images;
pub mod enrich;
#[cfg_attr(alef, alef(skip))]
pub use enrich::enrich;
pub use enrich::{EnrichedResult, EnrichmentConfig};
#[cfg(feature = "ner")]
pub use enrich::NerEnrichmentConfig;
#[cfg(feature = "classification")]
pub use enrich::{ChunkClassificationEnrichmentConfig, ClassificationEnrichmentConfig};
#[cfg(feature = "captioning")]
pub use enrich::CaptioningEnrichmentConfig;
#[cfg(test)]
mod public_api_compile_tests {
#[test]
fn llm_and_concurrency_configs_are_available_at_crate_root() {
fn accept_root_types(
_concurrency: Option<crate::ConcurrencyConfig>,
_provider: Option<crate::LlmProviderConfig>,
_cache: Option<crate::LlmCacheConfig>,
_budget: Option<crate::LlmBudgetConfig>,
_rate_limit: Option<crate::LlmRateLimitConfig>,
) {
}
accept_root_types(None, None, None, None, None);
}
}