docling-project / docling-project/docling

AttributeError when enabling formula enrichment (do_formula_enrichment=True)

Open
#2,681 2 comments 0 reactions 0 assignees View on GitHub
triage/close-stale
Dominant language
Python
Stars
66.4k
Forks
4.8k
Avg merge
3d 4h
Merged PRs (30d)
98

Description

# Bug: AttributeError when enabling formula enrichment

## Description

When `do_formula_enrichment=True` is set in `PdfPipelineOptions`, Docling fails with:

```
AttributeError: 'dict' object has no attribute 'model_type'
```

## Error Details

**Full Traceback:**
```
File "/.../docling/pipeline/standard_pdf_pipeline.py", line 456, in _init_models
CodeFormulaModel(
File "/.../docling/models/code_formula_model.py", line 108, in __init__
self._processor = AutoProcessor.from_pretrained(
File "/.../transformers/tokenization_utils_base.py", line 2419, in _from_pretrained
if _is_local and _config.model_type not in [
AttributeError: 'dict' object has no attribute 'model_type'
```

## Root Cause

The issue occurs in `docling/models/code_formula_model.py` line 108:

```python
self._processor = AutoProcessor.from_pretrained(artifacts_path,)
```

When `artifacts_path` (a `Path` object) is passed to `AutoProcessor.from_pretrained()`, transformers loads the tokenizer config as a dict from JSON, but then tries to access `_config.model_type` as an object attribute (line 2419 in `transformers/tokenization_utils_base.py`).

**Why it fails:**
- Loading from local `Path`: Config loaded as `dict` → AttributeError when accessing `.model_type`
- Loading from model name: Config properly converted to config object → Works correctly

## Environment

- **Docling version**: 2.63.0 (latest)
- **Transformers version**: 4.57.2
- **Python version**: 3.12
- **OS**: macOS (darwin 24.6.0)
- **Device**: MPS (Apple Silicon)

## Steps to Reproduce

```python
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import PdfPipelineOptions, TesseractOcrOptions
from docling.document_converter import DocumentConverter, PdfFormatOption
import os
import subprocess

# Set TESSDATA_PREFIX if needed
if 'TESSDATA_PREFIX' not in os.environ:
tesseract_prefix = subprocess.run(
['brew', '--prefix', 'tesseract'],
capture_output=True, text=True, check=True
).stdout.strip()
if tesseract_prefix:
os.environ['TESSDATA_PREFIX'] = f'{tesseract_prefix}/share/tessdata'

# This configuration fails
pipeline_options = PdfPipelineOptions(
ocr_options=TesseractOcrOptions(lang=['eng'], force_full_page_ocr=True),
do_formula_enrichment=True, # ← This triggers the error
)

converter = DocumentConverter(
format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)}
)

# Fails here
result = converter.convert('document.pdf')
```

## Expected Behavior

Formula enrichment should initialize successfully and extract formulas from the document.

## Actual Behavior

Initialization fails with `AttributeError` before any document processing occurs.

## Workaround

A monkey patch can work around the issue by intercepting `AutoProcessor.from_pretrained()` and converting `Path` objects to model names:

```python
from transformers import AutoProcessor
from pathlib import Path

original_from_pretrained = AutoProcessor.from_pretrained

def patched_from_pretrained(model_name_or_path, **kwargs):
if isinstance(model_name_or_path, Path):
path_str = str(model_name_or_path)
if 'CodeFormulaV2' in path_str:
return original_from_pretrained('docling-project/CodeFormulaV2', **kwargs)
return original_from_pretrained(model_name_or_path, **kwargs)

AutoProcessor.from_pretrained = patched_from_pretrained
```

## Suggested Fix

In `docling/models/code_formula_model.py` line 108, change:

```python
# Current (fails):
self._processor = AutoProcessor.from_pretrained(artifacts_path,)

# Suggested fix:
self._processor = AutoProcessor.from_pretrained('docling-project/CodeFormulaV2',)
```

The transformers library will automatically use the cached model, so there's no need to pass the local path. This avoids the transformers bug while maintaining the same functionality.

## Additional Context

- The model `docling-project/CodeFormulaV2` loads successfully when using the model name directly
- The issue appears to be a compatibility problem between how Docling passes paths and how transformers 4.57.2 handles local path loading
- Related issues: #2374, #2568 (formula enrichment issues, but may be different bugs)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.