numpy>=1.20
scipy>=1.5
matplotlib>=3.5
h5py>=3.0.0

[all]
pandas>=1.3
mcp>=0.9.0
boto3>=1.28.0
uvicorn>=0.20
starlette>=0.27
jax>=0.4.26
jaxlib>=0.4.26
jaxopt>=0.8.2
optax>=0.2.2
scikit-learn>=1.0
umap-learn>=0.5.0
networkx>=2.6
python-louvain>=0.16
neo>=0.12.0
quantities>=0.14.0
pynwb>=2.0.0
numba>=0.56
spikeinterface>=0.104.0
natsort>=8.0
six>=1.16
pydantic>=2.7.0
PyYAML>=6.0.1
Jinja2>=3.1.0
kubernetes>=30.1.0

[batch-jobs]
pydantic>=2.7.0
PyYAML>=6.0.1
Jinja2>=3.1.0
kubernetes>=30.1.0

[dev]
pytest>=7.0
pytest-asyncio>=0.21.0
black==26.3.1

[docs]
sphinx>=7.0
sphinx-rtd-theme>=2.0
sphinx-autodoc-typehints>=1.25

[gplvm]
jax>=0.4.26
jaxlib>=0.4.26
jaxopt>=0.8.2
optax>=0.2.2

[io]
pandas>=1.3

[kilosort4]
kilosort>=4.0

[mcp]
mcp>=0.9.0

[ml]
scikit-learn>=1.0
umap-learn>=0.5.0
networkx>=2.6
python-louvain>=0.16

[neo]
neo>=0.12.0
quantities>=0.14.0
pynwb>=2.0.0

[numba]
numba>=0.56

[s3]
boto3>=1.28.0

[spike-sorting]
spikeinterface>=0.104.0
natsort>=8.0
six>=1.16
pandas>=1.3

[sse]
uvicorn>=0.20
starlette>=0.27
