Skip to content

Bug: dependency ranges on current master (1.6.66) allows incompatible versions of pydantic and aind-data-schema-models. #1720

@galenlynch

Description

@galenlynch

main as of 3/18/26 pins aind-data-schema to 0.5.6 , which is incompatible with pydantic>=2.11. This old version of aind-data-schema-models passes model_config=ConfigDict(...) as a keyword argument to pydantic.create_model() in utils.py. In pydantic 2.11, this is now interpreted as trying to create a field named model_config, which is a reserved name — causing a crash:

(Foraging) PS C:\Users\svc_aind_behavior\Documents\GitHub\dynamic-foraging-task> python .\src\foraging_gui\Foraging.py
Traceback (most recent call last):
  File "C:\Users\svc_aind_behavior\Documents\GitHub\dynamic-foraging-task\src\foraging_gui\Foraging.py", line 33, in <module>
    from aind_data_schema.core.session import Session
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\aind_data_schema\core\session.py", line 8, in <module>
    from aind_data_schema_models.modalities import Modality
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\aind_data_schema_models\modalities.py", line 20, in <module>
    Modality = create_literal_class(
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\aind_data_schema_models\utils.py", line 121, in create_literal_class
    all_models = tuple(
                 ^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\aind_data_schema_models\utils.py", line 122, in <genexpr>
    create_literal_model(
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\aind_data_schema_models\utils.py", line 56, in create_literal_model
    m = create_model(class_name, model_config=ConfigDict(frozen=True), __base__=base_model, **fields)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\pydantic\main.py", line 1763, in create_model
    return meta(
           ^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\pydantic\_internal\_model_construction.py", line 110, in __new__
    config_wrapper = ConfigWrapper.for_model(bases, namespace, kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\pydantic\_internal\_config.py", line 128, in for_model
    raise PydanticUserError(
pydantic.errors.PydanticUserError: `model_config` cannot be used as a model field name. Use `model_config` for model configuration.

For further information visit https://errors.pydantic.dev/2.11/u/model-config-invalid-field-name

Environment with bug:

$ pip freeze
aind-auto-train @ git+https://github.com/AllenNeuralDynamics/aind-foraging-behavior-bonsai-automatic-training.git@b6fee22adf1bb35d3729b455500e7bae84ee4aee
aind-behavior-curriculum==0.0.27
aind-behavior-services==0.8.9
aind-data-access-api==1.9.4
aind-data-schema==1.1.0
aind-data-schema-models==0.5.6
aind-dynamic-foraging-basic-analysis==0.3.37
aind-dynamic-foraging-data-utils==0.1.40
aind-dynamic-foraging-models==0.13.1
aind-slims-api @ git+https://github.com/AllenNeuralDynamics/aind-slims-api@fdfd769e97abc21bbac2cb30a40b9f65e24b0098
aind_ephys_utils==0.1.1
aind_hierarchical_bootstrap==0.0.7
aiobotocore==2.26.0
aiohappyeyeballs==2.6.1
aiohttp==3.13.3
aioitertools==0.13.0
aiosignal==1.4.0
altgraph==0.17.5
annotated-types==0.7.0
argon2-cffi==25.1.0
argon2-cffi-bindings==25.1.0
asciitree==0.3.3
asttokens==3.0.1
attrs==25.4.0
bidict==0.23.1
bitarray==3.8.0
bitstring==4.4.0
blinker==1.9.0
boto3==1.41.5
botocore==1.41.5
certifi==2026.2.25
cffi==2.0.0
charset-normalizer==2.1.1
click==8.3.1
codeocean==0.14.0
colorama==0.4.6
comm==0.2.3
construct==2.10.70
contourpy==1.3.3
cryptography==46.0.5
cycler==0.12.1
dataclasses-json==0.6.7
decorator==5.2.1
deepdiff==8.6.2
Deprecated==1.3.1
deprecation==2.1.0
dictdiffer==0.9.0
dnspython==2.8.0
-e git+https://github.com/AllenNeuralDynamics/dynamic-foraging-task.git@653293091179fa284c22c6dccff4f0bd49848b1e#egg=dynamic_foraging_task
et_xmlfile==2.0.0
executing==2.2.1
fasteners==0.20
Flask==3.1.3
fonttools==4.62.1
frozenlist==1.8.0
fsspec==2024.12.0
gitdb==4.0.12
GitPython==3.1.46
graphviz==0.21
h5py==3.16.0
harp-python==0.4.1
hdmf==5.0.1
hdmf_zarr==0.12.0
idna==3.11
importlib_resources==6.5.2
inflection==0.5.1
ipympl==0.10.0
ipython==9.10.0
ipython-genutils==0.2.0
ipython_pygments_lexers==1.1.1
ipywidgets==8.1.8
itsdangerous==2.2.0
jedi==0.19.2
Jinja2==3.1.6
jmespath==1.1.0
joblib==1.5.3
jsonschema==4.26.0
jsonschema-specifications==2025.9.1
jupyter_core==5.9.1
jupyterlab_widgets==3.0.16
kazoo==2.10.0
kiwisolver==1.5.0
ldap3==2.9.1
librt==0.8.1
lxml==6.0.2
MarkupSafe==3.0.3
marshmallow==3.26.2
matplotlib==3.10.8
matplotlib-inline==0.2.1
mpetk==0.5.2.dev4+g5fec960.b169542
ms_active_directory==1.14.1
msal==1.35.1
multidict==6.7.1
mypy==1.19.1
mypy_extensions==1.1.0
narwhals==2.18.0
nbformat==5.1.2
newscale @ git+https://github.com/AllenNeuralDynamics/python-newscale@7c1749730702ebcef389cf9221ebaf66c4b251e6
numcodecs==0.15.1
numpy==2.4.3
oauthlib==3.3.1
openpyxl==3.1.5
orderly-set==5.5.0
packaging @ file:///C:/miniconda3/conda-bld/packaging_1761049096285/work
pandas==2.3.3
parso==0.8.6
pathlib==1.0.1
pathspec==1.0.4
pefile==2023.2.7
pillow==12.1.1
platformdirs==4.9.4
plotly==6.6.0
prompt_toolkit==3.0.52
propcache==0.4.1
protobuf==4.25.3
psutil==5.9.8
pure_eval==0.2.3
pyasn1==0.6.3
pycparser==3.0
pycryptodome==3.23.0
pycryptodomex==3.23.0
pydantic==2.11.10
pydantic-settings==2.1.0
pydantic-yaml==1.6.0
pydantic_core==2.33.2
Pygments==2.19.2
pyharp==0.1.0
pyinstaller==6.11.0
pyinstaller-hooks-contrib==2026.3
PyJWT==2.12.1
pykeepass==4.0.7.post1
pymsteams==0.2.5
pynwb==2.8.3
pyOSC3 @ git+https://github.com/glopesdev/pyosc3.git@f853711fa836ebee6d1914cb007341611e74e5a5
pyparsing==3.3.2
PyQt5==5.15.11
PyQt5-Qt5==5.15.2
PyQt5_sip==12.18.0
pyqtgraph==0.14.0
pyserial==3.5
python-dateutil==2.9.0.post0
python-dotenv==1.2.2
python-logging-loki==0.3.1
pytz==2026.1.post1
pywin32-ctypes==0.2.3
PyYAML==6.0.1
pyzmq==26.0.2
redis==5.0.8
referencing==0.37.0
requests==2.31.0
requests-oauthlib==2.0.0
requests-toolbelt==1.0.0
rfc3339==6.2
rpds-py==0.30.0
ruamel.yaml==0.18.17
ruamel.yaml.clib==0.2.15
ruff==0.15.6
s3fs==2024.12.0
s3transfer==0.15.0
scikit-learn==1.8.0
scipy==1.17.1
semver==3.0.4
six==1.17.0
slims-python-api==6.9.0
smmap==5.0.3
stack-data==0.6.3
stagewidget==1.0.5
threadpoolctl==3.6.0
tibs==0.5.7
tornado==6.5.5
tqdm==4.67.3
traitlets==5.14.3
types-pyserial==3.5.0.20251001
types-PyYAML==6.0.12.20250915
typing-inspect==0.9.0
typing-inspection==0.4.2
typing_extensions==4.15.0
tzdata==2025.3
urllib3==2.2.3
watchdog==4.0.2
wcwidth==0.6.0
Werkzeug==3.1.6
widgetsnbextension==4.0.15
winkerberos==0.13.0
wrapt==1.17.3
xarray==2026.2.0
yarl==1.23.0
zarr==2.18.7

Capping pydantic to <2.10 seems to solve the pydantic issues (2.10 itself causes other compatibility problems with aind-data-schema at the pinned version).

Unfortunately, that reveals perhaps unrelated stage-widget / ZooKeeper mismatch which I'll make another issue about:

local repository has untracked changes to the following files: bonsai/Bonsai.config, pyproject.toml
Encountered a fatal error:
Traceback (most recent call last):
  File "C:\Users\svc_aind_behavior\Documents\GitHub\dynamic-foraging-task\src\foraging_gui\Foraging.py", line 7700, in <module>
    win = Window(box_number=box_number, start_bonsai_ide=start_bonsai_ide)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\Documents\GitHub\dynamic-foraging-task\src\foraging_gui\Foraging.py", line 218, in __init__
    self._load_stage()
  File "C:\Users\svc_aind_behavior\Documents\GitHub\dynamic-foraging-task\src\foraging_gui\Foraging.py", line 405, in _load_stage
    self._insert_stage_widget(widget_to_replace)
  File "C:\Users\svc_aind_behavior\Documents\GitHub\dynamic-foraging-task\src\foraging_gui\Foraging.py", line 427, in _insert_stage_widget
    self.stage_widget = get_stage_widget()
                        ^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\StageWidget\main.py", line 25, in get_stage_widget
    config = get_config_and_setup_logging("widget", log)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\StageWidget\main.py", line 45, in get_config_and_setup_logging
    return ConfigModel(**zk_config)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\pydantic_settings\main.py", line 71, in __init__
    super().__init__(
  File "C:\Users\svc_aind_behavior\AppData\Local\miniconda3\envs\Foraging\Lib\site-packages\pydantic\main.py", line 212, in __init__
    validated_self = self.__pydantic_validator__.validate_python(data, self_instance=self)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pydantic_core._pydantic_core.ValidationError: 1 validation error for ConfigModel
stage_configuration.steps_per_mm
  Input should be a valid list [type=list_type, input_value=800, input_type=int]
    For further information visit https://errors.pydantic.dev/2.9/v/list_type

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions