How to reproduce the behaviour
I don't know how far this goes exactly, but I've got an en_core_web_md v3.1.0 model saved on disk, and I have this script for loading it:
import spacy
print("spacy==", spacy.__version__)
spacy_path = "en_core_web_md/"
print("Loading Spacy Model")
nlp = spacy.load(spacy_path)
print("NLP:", nlp.meta['name'], "@", nlp.meta['version'])
In spacy==3.8.7 I get:
% python .temp/2026_03_23_spacy_model_load/load_model.py
spacy== 3.8.7
Loading Spacy Model
/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.venv312/lib/python3.12/site-packages/spacy/util.py:922: UserWarning: [W095] Model 'en_core_web_md' (3.1.0) was trained with spaCy v3.1.0 and may not be 100% compatible with the current version (3.8.7). If you see errors or degraded performance, download a newer compatible model or retrain your custom model with the current spaCy version. For more details and available updates, run: python -m spacy validate
warnings.warn(warn_msg)
NLP: core_web_md @ 3.1.0
And same in 3.8.11:
% python .temp/2026_03_23_spacy_model_load/load_model.py
spacy== 3.8.11
Loading Spacy Model
/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/util.py:969: UserWarning: [W095] Model 'en_core_web_md' (3.1.0) was trained with spaCy v3.1.0 and may not be 100% compatible with the current version (3.8.11). If you see errors or degraded performance, download a newer compatible model or retrain your custom model with the current spaCy version. For more details and available updates, run: python -m spacy validate
warnings.warn(warn_msg)
NLP: core_web_md @ 3.1.0
Yet in spacy==3.8.12 I get:
% python .temp/2026_03_23_spacy_model_load/load_model.py
spacy== 3.8.12
Loading Spacy Model
/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/util.py:969: UserWarning: [W095] Model 'en_core_web_md' (3.1.0) was trained with spaCy v3.1.0 and may not be 100% compatible with the current version (3.8.12). If you see errors or degraded performance, download a newer compatible model or retrain your custom model with the current spaCy version. For more details and available updates, run: python -m spacy validate
warnings.warn(warn_msg)
Traceback (most recent call last):
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/load_model.py", line 5, in <module>
nlp = spacy.load(spacy_path)
^^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/__init__.py", line 52, in load
return util.load_model(
^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/util.py", line 526, in load_model
return load_model_from_path(Path(name), **kwargs) # type: ignore[arg-type]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/util.py", line 598, in load_model_from_path
nlp = load_model_from_config(
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/util.py", line 646, in load_model_from_config
nlp = lang_cls.from_config(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/spacy/language.py", line 1832, in from_config
resolved_nlp = registry.resolve(
^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/confection/__init__.py", line 760, in resolve
resolved, _ = cls._make(
^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/confection/__init__.py", line 809, in _make
filled, _, resolved = cls._fill(
^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/confection/__init__.py", line 937, in _fill
result = schema.parse_obj(validation)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/pydantic/main.py", line 1370, in parse_obj
return cls.model_validate(obj)
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/pydantic/main.py", line 716, in model_validate
return cls.__pydantic_validator__.validate_python(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/martratas/Documents/CogStack/.MedCAT.nosync/monorepo-nlp/medcat-v2/.temp/2026_03_23_spacy_model_load/.venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py", line 100, in __getattr__
raise PydanticUserError(self._error_message, code=self._code)
pydantic.errors.PydanticUserError: `ConfigSchemaNlp` is not fully defined; you should define `Language`, then call `ConfigSchemaNlp.model_rebuild()`.
For further information visit https://errors.pydantic.dev/2.12/u/class-not-fully-defined
Your Environment
- Operating System: MacOS and ubuntu (on CI)
- Python Version Used: 3.12
- spaCy Version Used: 3.8.12 (the problematic)
- Environment Information: The OLD
en_core_web_md model.
PS:
I understand that you guys are probably unable to indefinitely support loading old models. But a regression like this in a patch version seems out of place to me.
PPS:
If I've made some mistake on my end, do point it out.
How to reproduce the behaviour
I don't know how far this goes exactly, but I've got an
en_core_web_mdv3.1.0 model saved on disk, and I have this script for loading it:In
spacy==3.8.7I get:And same in 3.8.11:
Yet in
spacy==3.8.12I get:Your Environment
en_core_web_mdmodel.PS:
I understand that you guys are probably unable to indefinitely support loading old models. But a regression like this in a patch version seems out of place to me.
PPS:
If I've made some mistake on my end, do point it out.