Docling-Graph turns documents into validated Pydantic objects, then builds a directed knowledge graph with explicit semantic relationships.
This transformation enables high-precision use cases in chemistry, finance, and legal domains, where AI must capture exact entity connections (compounds and reactions, instruments and dependencies, properties and measurements) rather than rely on approximate text embeddings.
This toolkit supports two extraction paths: local VLM extraction via Docling, and LLM-based extraction routed through LiteLLM for local runtimes (vLLM, Ollama) and API providers (OpenAI, Gemini, IBM watsonx, Mistral and more), all orchestrated through a flexible, config-driven pipeline.
-
✍🏻 Input formats: Docling’s supported inputs: PDF, images, DocLang, markdown, Office and more.
-
🧠 Extraction: LLM or VLM backends, with chunking and processing modes.
-
💎 Graphs: Pydantic to NetworkX directed graphs with stable IDs, edge and provenance metadata.
-
🔍 Visualization: Interactive HTML and Markdown reports.
-
🐛 Trace capture: Debug exports for extraction and fallback diagnostics.
-
🦆 DocLang support: Parse
.dclg/.dclxinputs, and optionally serialize document as DocLang for the LLM. -
📍 Data grounding: Deterministic provenance ledger with bounding-box geometry and no extra LLM calls.
-
✨ Dense extraction: Advanced skeleton-then-flesh extraction mode for complex documents.
-
🚀 Docling Serve support: Offload document conversion to a remote docling-serve instance.
-
🔗 Graph Fusion: Combine and reconcile disparate knowledge graphs into a unified structure.
-
🧩 Interactive Template Builder: Guided workflows for building Pydantic templates.
-
🧲 Ontology-Based Templates: Match content to the best Pydantic template using semantic similarity.
- Python 3.10 or higher
pip install docling-graphThis installs the core package with LiteLLM for remote and local LLM providers.
VLM backend support requires the vlm extra:
pip install "docling-graph[vlm]For detailed installation instructions (including optional extras and GPU setup), see Installation Guide.
Copy .env.example to .env and fill in the values for the provider(s) you use:
cp .env.example .envSee API Keys Setup for provider-specific instructions (including Amazon Bedrock's AWS credential chain).
# Initialize configuration
docling-graph init
# Convert document from URL (each line except the last must end with \)
docling-graph convert "https://arxiv.org/pdf/2207.02720" \
--template "docs.examples.templates.rheology_research.ScholarlyRheologyPaper" \
--processing-mode "many-to-one" \
--extraction-contract "dense" \
--debug
# Visualize results
docling-graph inspect outputsfrom docling_graph import run_pipeline, PipelineContext
from docs.examples.templates.rheology_research import ScholarlyRheologyPaper
# Create configuration
config = {
"source": "https://arxiv.org/pdf/2207.02720",
"template": ScholarlyRheologyPaper,
"backend": "llm",
"inference": "remote",
"processing_mode": "many-to-one",
"extraction_contract": "auto",
"provider_override": "mistral",
"model_override": "mistral-medium-latest",
"structured_output": True, # default
"use_chunking": True,
}
# Run pipeline - returns data directly, no files written to disk
context: PipelineContext = run_pipeline(config)
# Access results
graph = context.knowledge_graph
models = context.extracted_models
metadata = context.graph_metadata
print(f"Extracted {len(models)} model(s)")
print(f"Graph: {graph.number_of_nodes()} nodes, {graph.number_of_edges()} edges")Every node above also carries a deterministic __provenance__ attribute by default (provenance="standard"), pointing back to the source chunk and page it was extracted from — no extra LLM calls involved. See Data Grounding & Provenance.
For debugging, use --debug with the CLI to save intermediate artifacts to disk; see Trace Data & Debugging. For more examples, see Examples.
Templates define both the extraction schema and the resulting graph structure.
from pydantic import BaseModel, Field
from docling_graph.utils import edge
class Person(BaseModel):
"""Person entity with stable ID."""
model_config = {
'is_entity': True,
'graph_id_fields': ['last_name', 'date_of_birth']
}
first_name: str = Field(description="Person's first name")
last_name: str = Field(description="Person's last name")
date_of_birth: str = Field(description="Date of birth (YYYY-MM-DD)")
class Organization(BaseModel):
"""Organization entity."""
model_config = {'is_entity': True}
name: str = Field(description="Organization name")
employees: list[Person] = edge("EMPLOYS", description="List of employees")For complete guidance, see:
Comprehensive documentation can be found on Docling Graph's Page.
The documentation follows the docling-graph pipeline stages:
- Introduction - Overview and core concepts
- Installation - Setup and environment configuration
- Schema Definition - Creating Pydantic templates
- Pipeline Configuration - Configuring the extraction pipeline
- Extraction Process - Document conversion and extraction
- Graph Management - Converting, grounding, exporting, and visualizing graphs
- CLI Reference - Command-line interface guide
- Python API - Programmatic usage
- Examples - Working code examples
- Advanced Topics - Performance, testing, error handling
- API Reference - Detailed API documentation
- Community - Contributing and development guide
We welcome contributions! Please see:
- Contributing Guidelines - How to contribute
- Development Guide - Development setup
# Clone and setup
git clone https://github.com/docling-project/docling-graph
cd docling-graph
# Install with dev dependencies
uv sync --extra dev
# Run Execute pre-commit checks
uv run pre-commit run --all-filesMIT License - see LICENSE for details.
Docling Graph builds on outstanding open-source projects:
- Docling - document conversion and VLM extraction
- Pydantic - schema definition and validation
- NetworkX - graph construction and analysis
- LiteLLM - unified LLM provider interface
- Cytoscape - interactive graph visualization
Docling Graph has been brought to you by IBM.