LlamaParse Parser
January 15, 2026 ยท View on GitHub
Intro
The LlamaParse Parser integrates with LlamaParse (from LlamaIndex) to parse PDF and DOCX documents with advanced layout extraction. It provides high-quality structural annotations with bounding boxes, making it ideal for complex document layouts.
LlamaParse is a cloud-based API service that uses advanced ML models to extract document structure, including titles, headings, paragraphs, tables, figures, and more. Unlike the Docling parser which runs as a local microservice, LlamaParse requires an API key and sends documents to LlamaIndex's cloud infrastructure.
Architecture
sequenceDiagram
participant U as User
participant LP as LlamaParseParser
participant API as LlamaParse Cloud API
participant DB as Database
U->>LP: parse_document(user_id, doc_id)
LP->>DB: Load document
LP->>LP: Write to temp file
LP->>API: HTTP POST with document
API->>API: ML-based parsing
API->>API: Layout extraction
API-->>LP: JSON with layout data
LP->>LP: Parse bounding boxes
LP->>LP: Create annotations (bbox only)
LP->>DB: Store parsed data
LP-->>U: OpenContractDocExport
Features
- Cloud-based API: Uses LlamaIndex's managed parsing infrastructure
- Layout Extraction: Returns bounding boxes for all document elements
- Multiple Output Formats: Supports JSON (with layout), markdown, and plain text
- Structural Annotations: Automatically creates annotations for document structure
- Multi-format Support: Parses both PDF and DOCX files
- Parallel Processing: Configurable worker count for batch processing
- Automatic OCR: Handles scanned documents automatically
Configuration
Environment Variables
Configure the parser using environment variables:
# Required: API key (either variable works)
LLAMAPARSE_API_KEY=llx-your-api-key-here
# OR use LlamaIndex's default env var name:
LLAMA_CLOUD_API_KEY=llx-your-api-key-here
# Optional: Output format ("json", "markdown", "text")
# Default: "json" - required for layout extraction
LLAMAPARSE_RESULT_TYPE=json
# Optional: Enable layout extraction with bounding boxes
# Default: True
LLAMAPARSE_EXTRACT_LAYOUT=True
# Optional: Number of parallel workers for batch processing
# Default: 4
LLAMAPARSE_NUM_WORKERS=4
# Optional: Document language code
# Default: "en"
LLAMAPARSE_LANGUAGE=en
# Optional: Enable verbose logging
# Default: False
LLAMAPARSE_VERBOSE=False
# Select LlamaParse as the default PDF parser
PDF_PARSER=llamaparse
Django Settings
The parser is configured in config/settings/base.py:
# LlamaParse Settings
LLAMAPARSE_API_KEY = env.str("LLAMAPARSE_API_KEY", default="")
LLAMAPARSE_RESULT_TYPE = env.str("LLAMAPARSE_RESULT_TYPE", default="json")
LLAMAPARSE_EXTRACT_LAYOUT = env.bool("LLAMAPARSE_EXTRACT_LAYOUT", default=True)
LLAMAPARSE_NUM_WORKERS = env.int("LLAMAPARSE_NUM_WORKERS", default=4)
LLAMAPARSE_LANGUAGE = env.str("LLAMAPARSE_LANGUAGE", default="en")
LLAMAPARSE_VERBOSE = env.bool("LLAMAPARSE_VERBOSE", default=False)
# Parser selection
PDF_PARSER = env.str("PDF_PARSER", default="docling") # Set to "llamaparse"
Parser Registration
The parser is automatically registered in PREFERRED_PARSERS when PDF_PARSER=llamaparse:
PREFERRED_PARSERS = {
"application/pdf": "opencontractserver.pipeline.parsers.llamaparse_parser.LlamaParseParser",
# ... other mime types
}
Usage
Basic Usage
from opencontractserver.pipeline.parsers.llamaparse_parser import LlamaParseParser
parser = LlamaParseParser()
result = parser.parse_document(user_id=1, doc_id=123)
With Options Override
# Override default settings for a specific parse
result = parser.parse_document(
user_id=1,
doc_id=123,
result_type="json",
extract_layout=True,
language="en",
verbose=True,
)
Text-Only Mode (No Layout)
# For faster parsing without bounding boxes
result = parser.parse_document(
user_id=1,
doc_id=123,
result_type="markdown", # or "text"
extract_layout=False,
)
Output
The parser returns an OpenContractDocExport dictionary containing:
{
"title": str, # Document title
"description": str, # Document description
"content": str, # Full text content
"page_count": int, # Number of pages
"pawls_file_content": List[dict], # PAWLS token data per page
"labelled_text": List[dict], # Structural annotations
"relationships": List[dict], # (Empty - no relationships extracted)
"doc_labels": List[dict], # (Empty - no doc labels extracted)
}
Element Type Mapping
LlamaParse elements are mapped to OpenContracts annotation labels:
| LlamaParse Type | OpenContracts Label |
|---|---|
title | Title |
section_header | Section Header |
heading | Heading |
text | Text Block |
paragraph | Paragraph |
table | Table |
figure | Figure |
image | Image |
list | List |
list_item | List Item |
caption | Caption |
footnote | Footnote |
header | Page Header |
footer | Page Footer |
page_number | Page Number |
equation | Equation |
code | Code Block |
Processing Steps
-
Document Loading
- Loads document from Django storage
- Writes to temporary file (LlamaParse requires file path)
-
API Call
- Sends document to LlamaParse cloud API
- Uses
get_json_result()for layout mode - Uses
load_data()for text/markdown mode
-
Bounding Box Conversion
- LlamaParse returns coordinates in various formats (fractional 0-1 or absolute)
- Converts to absolute page coordinates
- Handles multiple bbox formats (
x/y/w/h,left/top/right/bottom,x1/y1/x2/y2, arrays) - Applies sanity checks and bounds clamping
-
Annotation Creation
- Maps element types to OpenContracts labels
- Creates structural annotations with bounding boxes
- Annotations use empty
tokensJsons(see Limitations)
-
Cleanup
- Removes temporary file
- Returns OpenContractDocExport
Comparison with Other Parsers
| Feature | LlamaParse | Docling |
|---|---|---|
| Deployment | Cloud API | Local microservice |
| API Key Required | Yes | No |
| Layout Extraction | Yes | Yes |
| Relationship Detection | No | Yes (groups) |
| OCR Support | Yes (automatic) | Yes (Tesseract) |
| DOCX Support | Yes | Yes |
| Cost | Per-page pricing | Free |
| Privacy | Cloud processing | Local processing |
Error Handling
The parser handles errors gracefully:
- Missing API Key: Returns None with error log
- Document Not Found: Returns None with error log
- API Errors: Returns None with detailed error message
- Import Errors: Returns None if
llama-parsenot installed - Empty Results: Returns None with warning
Example error handling:
result = parser.parse_document(user_id=1, doc_id=123)
if result is None:
# Check logs for error details
logger.error("Parsing failed")
Troubleshooting
Common Issues
-
API Key Not Configured
LlamaParse API key not configured. Set LLAMAPARSE_API_KEY or LLAMA_CLOUD_API_KEY environment variable.- Set
LLAMAPARSE_API_KEYin your environment - Verify the key is valid at cloud.llamaindex.ai
- Set
-
Library Not Installed
llama-parse library not installed. Install with: pip install llama-parse- Install the library:
pip install llama-parse - Or add to requirements:
llama-parse>=0.4.0
- Install the library:
-
Empty Results
LlamaParse returned empty results- Verify document is readable (not corrupted)
- Check if document has extractable text
- Try with
verbose=Truefor more details
-
No Bounding Boxes
- Ensure
result_type="json"(not "markdown" or "text") - Ensure
extract_layout=True - Some document types may not support layout extraction
- Ensure
-
Rate Limiting
- LlamaParse has API rate limits
- Reduce
num_workersfor batch processing - Implement retry logic for production use
Debug Mode
Enable verbose logging for troubleshooting:
LLAMAPARSE_VERBOSE=True
Or in code:
result = parser.parse_document(user_id=1, doc_id=123, verbose=True)
Performance Considerations
- Network Latency: Cloud API adds network round-trip time
- Per-page Pricing: LlamaParse charges per page processed
- Parallel Workers: Increase
LLAMAPARSE_NUM_WORKERSfor batch jobs - Result Type: "markdown" and "text" modes are faster but lack layout
- File Size: Large documents may take longer to upload and process
Security Considerations
- API Key Security: Store API key in environment variables, not code
- Data Privacy: Documents are sent to LlamaIndex cloud for processing
- Temporary Files: Parser cleans up temp files after processing
- Logging: API key is redacted from log output
Dependencies
llama-parse>=0.4.0: LlamaParse Python clientllama-index-core: Core LlamaIndex library (installed with llama-parse)
Add to requirements:
llama-parse>=0.4.0
Limitations
LlamaParse has several limitations compared to other parsers like Docling:
No Token-Level Data
LlamaParse only provides element-level bounding boxes, not token-level (word-level) positions. This means:
- Annotations display as bounding box outlines only, without individual word highlighting
- The
tokensJsonsfield in annotations is empty - Text selection and word-level interactions are not available for LlamaParse-generated annotations
- The frontend handles this gracefully by showing just the bounding box boundary
Workaround: If you need token-level precision, use the Docling parser instead, which provides full PAWLS token data.
No Parent-Child Relationships
LlamaParse returns flat layout blocks without hierarchical structure:
- No parent/child relationships between elements (e.g., list items under a list)
- No nesting information for sections/subsections
- The
relationshipsfield in the export is always empty - Document structure must be inferred from element types and spatial positioning
Workaround: Use the Docling parser for relationship detection, which can group related elements.
Cloud Processing Required
- Documents are sent to LlamaIndex's cloud infrastructure for processing
- Requires internet connectivity
- Subject to LlamaIndex's data handling policies
- Not suitable for highly sensitive documents that cannot leave your network
Workaround: Use Docling for fully local processing.
Per-Page Pricing
- LlamaParse charges per page processed (with layout extraction: 1 extra credit per page)
- Costs can add up for large document volumes
- Free tier has limited credits
Bounding Box Precision
- Bounding boxes may be slightly larger or smaller than the actual content
- Complex layouts (multi-column, overlapping elements) may have less accurate boxes
- Tables and figures are detected as single blocks without internal structure
No Streaming Support
- Entire document must be uploaded and processed before results are returned
- Large documents may have significant processing time
- No progress indicators during parsing
See Also
- Pipeline Overview
- Docling Parser - Local ML-based alternative with token-level data and relationships
- LlamaParse Documentation
- LlamaIndex Cloud