# numpy 2 is allowed, and that is what lets this install on a current Python.
# `<2.0` capped the resolver at numpy 1.26.4, whose newest wheel is cp312, so
# on a Mac with Python 3.14 pip fell back to BUILDING numpy from source and
# died in clang - two screens of C compiler output on a shop counter, for a
# version choice made silently by behavision-setup.
#
# Measured before changing it, nine runs of the detector guard per combination
# on one machine:
#
#     numpy 1.26 / cv2 4.11    9 passed, 0 crashed
#     numpy 2.0  / cv2 4.11    8 passed, 1 crashed
#     numpy 1.26 / cv2 4.14    3 passed, 6 crashed
#     numpy 2.0  / cv2 4.14    2 passed, 7 crashed
#
# numpy is not the variable there; OpenCV is. The crash was a test racing a
# shared cv2.FaceDetectorYN on purpose - undefined behaviour in C++, which 4.11
# usually turned into an exception and 4.14 usually turns into a segfault. The
# product never shares one (Engine._build_worker builds a detector per camera),
# and the test now runs that race out of process. With that fixed, the whole
# suite is 226 passed / 2 skipped on numpy 2.0.2, five runs out of five.
#
# opencv IS capped, and the two are not the same call. Everything above was
# measured on 4.x; OpenCV 5.0 is a major release this project has never run a
# real camera or an emotion model through, and an uncapped `>=4.8.1` means
# every NEW install silently gets it while every existing one keeps 4.11. Lift
# it after running a camera on 5.x, not before.
numpy>=1.26,<3.0
opencv-python>=4.8.1,<5
onnxruntime>=1.16
fastapi>=0.110
uvicorn>=0.29
pydantic>=2.6
PyYAML>=6.0
python-dotenv>=1.0
faiss-cpu>=1.7.4
requests>=2.31
pywin32>=306; sys_platform == "win32"
