surrealdb-xberg
Ingest documents into SurrealDB with Xberg extraction. The connector manages the schema, deduplicates by content hash, and stores the full Xberg output — content, metadata, keywords, named entities, tables, summary, detected languages, and quality score — plus optionally chunks with embeddings for vector and hybrid search.
Install
pip install surrealdb-xberg
Requires Python 3.10+ and a running SurrealDB instance:
docker run --rm -p 8000:8000 surrealdb/surrealdb:latest start --user root --pass root
Choose a class
| Class | Stores | Indexes | Use for |
|---|---|---|---|
DocumentConnector |
Whole documents | BM25 on documents | Keyword search over documents |
DocumentPipeline |
Documents + chunks | BM25 + HNSW | Semantic / hybrid search |
DocumentPipeline(embed=False) |
Documents + chunks | BM25 on chunks | Keyword search over chunks |
Both are fully async and accept any async SurrealDB connection, session, or transaction.
Quick start
import asyncio
from surrealdb import AsyncSurreal
from surrealdb_xberg import DocumentPipeline
async def main() -> None:
async with AsyncSurreal("ws://localhost:8000") as db:
await db.signin({"username": "root", "password": "root"})
await db.use("app", "docs")
pipeline = DocumentPipeline(db=db, embed=True, embedding_model="balanced")
await pipeline.setup_schema() # probes the embedding dimension, then creates tables + indexes
# One extract_batch call for the whole directory, then batched idempotent inserts.
await pipeline.ingest_directory("./papers", glob="**/*.pdf")
# Vector search over chunks.
embedding = await pipeline.embed_query("retrieval augmented generation")
hits = await pipeline.client.query(
f"SELECT document.source AS source, content, vector::distance::knn() AS distance "
f"FROM {pipeline.chunk_table} WHERE embedding <|5,COSINE|> $embedding ORDER BY distance",
{"embedding": embedding},
)
print(hits)
asyncio.run(main())
Ingestion
Every entry point extracts through Xberg, then stores idempotently (deterministic record IDs plus
INSERT IGNORE, so re-ingesting the same content is a no-op):
await pipeline.ingest_file("report.pdf")
await pipeline.ingest_files(["a.pdf", "b.docx"]) # single batched extract_batch
await pipeline.ingest_directory("./corpus", glob="**/*.pdf")
await pipeline.ingest_bytes(data=raw, mime_type="application/pdf", source="upload://1")
Pass an Xberg ExtractionConfig to control extraction — OCR, keywords, NER, summarization, chunking:
from xberg import ExtractionConfig, NerConfig, SummarizationConfig
config = ExtractionConfig(ner=NerConfig(), summarization=SummarizationConfig())
connector = DocumentConnector(db=db, config=config)
DocumentPipeline injects its embedding config into whatever ChunkingConfig you provide (or a default
one), preserving your max_characters/overlap/preset.
Stored fields
Each document row carries source, content, mime_type, title, authors, created_at,
metadata, quality_score, content_hash, detected_languages, keywords, summary, entities
(NER: category, text, start, end, confidence), and tables (markdown, page_number,
cells). DocumentPipeline additionally writes a chunks table linked back to the parent document via
a record link, each chunk holding its content, chunk_index, page/byte offsets, and (when enabled) its
embedding.
Notes
- SurrealDB v3 enforces HNSW dimensions server-globally. Use one embedding model per server, or separate
instances; a dimension conflict raises
DimensionMismatchError. - Ingestion failures surface as
IngestionError(orDimensionMismatchError), whether SurrealDB raises aServerErroror swallows the error into anINSERT IGNOREresult.
See examples/ for BM25, vector, hybrid (RRF) search, chunk traversal, and incremental
ingestion. Licensed under MIT.
Metadata
Release files for surrealdb-xberg 1.3.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| surrealdb_xberg-1.3.8.tar.gz | 19.2 kB | Without provenance | Details for surrealdb_xberg-1.3.8.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| surrealdb_xberg-1.3.8-py3-none-any.whl | Python 3 | none | any | Details for surrealdb_xberg-1.3.8-py3-none-any.whl |
Total release size: 36.4 kB
Release files / surrealdb_xberg-1.3.8.tar.gz
| Download URL | surrealdb_xberg-1.3.8.tar.gz |
|---|---|
| Size | 19.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9a09f20579dda89a85344e208645dcd2f23f61892f838fe38bf0850029088a37
|
|
BLAKE2b-256 checksum How to use checksums |
6c8d53338ad153f84940ffcb548d8fbb8aa3d23b9c6b425713cd3381c722116d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / surrealdb_xberg-1.3.8-py3-none-any.whl
| Download URL | surrealdb_xberg-1.3.8-py3-none-any.whl |
|---|---|
| Size | 17.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
09161a6d9570f4e856b88ce1f32caa9dc2acf86b9a5771cd88e4864176157085
|
|
BLAKE2b-256 checksum How to use checksums |
67fe1709308beb54a02bd5fd1c7afdded9a3af8ab9bade00829cf9d0630adbb4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for surrealdb-xberg 1.3.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.