Please support Python 3.13 on MacOS
Search before asking
- [x] I have searched the Inference issues and found no similar bug report.
Bug
I tried to install inference with Python 3.13 on MacOS and got a build error for the av dependency.
The errors is from trying to build av v12.3.0 but that's old, now there's https://pypi.org/project/av/15.1.0/
Any chance to modernize the inference dependency constraints to make this work?
Environment
- Inference: v0.55.0
- OS: MacOS
- Python: 3.13
Minimal Reproducible Example
To reproduce create this pyproject.toml:
[project]
name = "rf1"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = ["inference>=0.55.0"]
Then try to install it:
% uv sync
Resolved 143 packages in 92ms
× Failed to build `av==12.3.0`
├─▶ The build backend returned an error
╰─▶ Call to `setuptools.build_meta:__legacy__.build_wheel` failed (exit status: 1)
[stdout]
running bdist_wheel
running build
running build_py
copying av/deprecation.py -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/datasets.py -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/about.py -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/__main__.py -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/video/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/codec/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
copying av/container/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/audio/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/subtitles/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/filter/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/sidedata/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
copying av/data/__init__.py -> build/lib.macosx-10.13-universal2-cpython-313/av/data
copying av/packet.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/buffer.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/error.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/_core.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/bitstream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/format.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/logging.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/descriptor.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/frame.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/plane.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/dictionary.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/option.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/enum.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/py.typed -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/utils.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/descriptor.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/logging.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/format.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/bitstream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/error.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/buffer.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/packet.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/bytesource.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/enum.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/option.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/dictionary.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/plane.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av
copying av/video/__init__.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/reformatter.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/format.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/frame.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/plane.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/codeccontext.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/reformatter.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/format.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/codeccontext.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/video/plane.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/video
copying av/codec/context.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
copying av/codec/codec.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
copying av/codec/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
copying av/codec/context.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
copying av/codec/codec.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/codec
copying av/container/output.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/__init__.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/core.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/input.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/streams.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/input.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/core.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/pyio.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/output.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/container/streams.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/container
copying av/audio/layout.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/format.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/fifo.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/frame.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/plane.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/resampler.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/codeccontext.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/fifo.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/format.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/layout.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/codeccontext.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/resampler.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/audio/plane.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/audio
copying av/subtitles/subtitle.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/subtitles/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/subtitles/codeccontext.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/subtitles/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/subtitles/codeccontext.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/subtitles/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/subtitles/subtitle.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/subtitles
copying av/filter/filter.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/context.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/__init__.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/graph.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/link.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/pad.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/graph.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/context.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/filter.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/pad.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/filter/link.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/filter
copying av/sidedata/motionvectors.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
copying av/sidedata/sidedata.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
copying av/sidedata/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
copying av/sidedata/motionvectors.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
copying av/sidedata/sidedata.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/sidedata
copying av/data/stream.pyi -> build/lib.macosx-10.13-universal2-cpython-313/av/data
copying av/data/__init__.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/data
copying av/data/stream.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/data
copying include/libav.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include
copying include/libavfilter/buffersink.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
copying include/libavfilter/avfiltergraph.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
copying include/libavfilter/avfilter.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
copying include/libavfilter/buffersrc.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavfilter
copying include/libavutil/frame.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavutil/avutil.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavutil/error.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavutil/channel_layout.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavutil/dict.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavutil/samplefmt.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavutil/motion_vector.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavutil
copying include/libavdevice/avdevice.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavdevice
copying include/libavformat/avformat.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavformat
copying include/libswscale/swscale.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libswscale
copying include/libavcodec/avcodec.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavcodec
copying include/libavcodec/bsf.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libavcodec
copying include/libswresample/swresample.pxd -> build/lib.macosx-10.13-universal2-cpython-313/av/include/libswresample
running build_ext
building 'av.stream' extension
clang -fno-strict-overflow -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -O3 -Wall -arch arm64 -arch x86_64 -I/opt/homebrew/Cellar/ffmpeg/8.0_1/include
-I/Users/cdeil/.cache/uv/builds-v0/.tmpHvyxzr/include -I/Library/Frameworks/Python.framework/Versions/3.13/include/python3.13 -c src/av/stream.c -o build/temp.macosx-10.13-universal2-cpython-313/src/av/stream.o
[stderr]
/Users/cdeil/.cache/uv/builds-v0/.tmpHvyxzr/lib/python3.13/site-packages/setuptools/_distutils/dist.py:289: UserWarning: Unknown distribution option: 'test_suite'
warnings.warn(msg)
/Users/cdeil/.cache/uv/builds-v0/.tmpHvyxzr/lib/python3.13/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated.
!!
********************************************************************************
Please consider removing the following classifiers in favor of a SPDX license expression:
License :: OSI Approved :: BSD License
See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
********************************************************************************
!!
self._finalize_license_expression()
src/av/stream.c:4618:31: error: no member named 'nb_side_data' in 'struct AVStream'
4618 | __pyx_t_1 = __pyx_v_stream->nb_side_data;
| ~~~~~~~~~~~~~~ ^
src/av/stream.c:4652:35: error: no member named 'side_data' in 'struct AVStream'
4652 | __pyx_t_5 = ((__pyx_v_stream->side_data[__pyx_v_i]).type == AV_PKT_DATA_DISPLAYMATRIX);
| ~~~~~~~~~~~~~~ ^
src/av/stream.c:4662:97: error: no member named 'side_data' in 'struct AVStream'
4662 | __pyx_t_2 = PyFloat_FromDouble(av_display_rotation_get(((int32_t const *)(__pyx_v_stream->side_data[__pyx_v_i]).data))); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L1_error)
| ~~~~~~~~~~~~~~ ^
3 errors generated.
error: command '/usr/bin/clang' failed with exit code 1
hint: This usually indicates a problem with the package or the build environment.
help: `av` (v12.3.0) was included because `rf1` (v0.1.0) depends on `inference` (v0.55.0) which depends on `aiortc` (v1.9.0) which depends on `av`
Additional
No response
Are you willing to submit a PR?
- [ ] Yes I'd like to help by submitting a PR!
Thanks for reporting @cdeil will try to add support for python 3.13. Don't have immediate bandwidth to implement, but added to backlog.
Not sure why av / aiortc fails to build. according to pypi both support 3.13
@hansent - I think the problem is that you hard-pin some dependencies to old versions.
Specifically here with aiortc~=1.9.0 you force aiortc and possibly av versions that are over a year old:
https://github.com/roboflow/inference/blob/8f5716fcb72d53f371180dc462678c138782e586/requirements/_requirements.txt#L1C14-L2C25
If you could restrict that with a >= dependency to allow newer versions like
https://pypi.org/project/aiortc/1.13.0/
I think this problem would go away.
Would you accept a PR with that change if CI is green?
Definitely welcome a PR. We can run some additional tests on it also. c/c @grzegorz-roboflow who is most familiar with the aiortc usage
So I did manage with inference version 0.57.2 to get a Python 3.13 environment installed with uv that includes some common PyData and computer vision packages:
[project]
name = "stocadro-ai"
version = "0.1.0"
readme = "README.md"
requires-python = ">=3.13,<3.14"
dependencies = [
"altair>=5.5.0",
"bokeh>=3.8.0",
"dash>=3.2.0",
"dvc[s3]>=3.63.0",
"httpx>=0.28.1",
"inference>=0.57.2",
"ipython>=9.5.0",
"jupyter>=1.1.1",
"jupyter-bokeh>=4.0.5",
"matplotlib>=3.10.6",
"onnx>=1.19.0",
"onnxruntime>=1.23.0",
"onnxsim>=0.4.36",
"onnxslim>=0.1.69",
"opencv-python>=4.11.0.86",
"pandas>=2.3.2",
"panel>=1.8.1",
"polars>=1.33.1",
"python-dotenv>=1.1.1",
"rfdetr>=1.2.1",
"roboflow>=1.2.9",
"shapely>=2.1.2",
"streamlit>=1.50.0",
"supervision>=0.26.1",
"torch>=2.8.0",
"torchvision>=0.23.0",
"transformers>=4.56.2",
"ultralytics>=8.3.203",
"watchdog>=6.0.0",
"watchfiles>=1.1.0",
]
But it was very painful to get inference to install at all, and to avoid it installing an old version and downgrading many packages to old versions because you have so many upper pins.
[tool.uv]
override-dependencies = [
# The `inference` package puts upper limits on a lot of packages
# Here we override many things to allow `uv install inference`
# without it forcing downgrades (and year old bugs) for many packages.
"opencv-python>=4.11.0.86",
"python-dotenv>=1.1.1",
"onnxruntime>=1.23.0",
"shapely>=2.1.2",
"transformers>=4.56.2",
"tokenizers>=0.22.0",
# The following overrides are to prevent `uv install inference`
# to force downgrade to old versions with their upper constraints
"aiobotocore>=2.15.2",
"boto3>=1.35.36",
"botocore>=1.35.36",
"cachetools>=6.2.0",
"colorama>=0.4.6",
"cython>=3.1.4",
"ml-dtypes>=0.5.3",
"numpy>=2.3.3",
"pi-heif>=1.1.0",
"pillow>=11.3.0",
"requests==2.32.5",
"rich>=13.9.4",
"s3transfer>=0.10.4",
"typer>=0.16.0",
"urllib3>=2.5.0",
"setuptools>=80.9.0",
"pydantic-settings>=2.11.0",
"redis>=5.3.1",
"structlog>=25.4.0",
"zxing-cpp>=2.3.0",
]
@grzegorz-roboflow or anyone familiar with the reasons all those upper version pins wer put in place - any chance to reduce and remove some of them?
I realize new versions can create incompatibilities. But forcing old versions also has a cost - we run into issues in the old versions of the dependencies that were solved in the meantime.
updated a couple of these recently and have a branch with newest transformers version also.
tryin gright now on clean py13 venv fails on mediapipe:
➜ ~ uv venv --python 3.13 py313
Using CPython 3.13.5 interpreter at: /opt/homebrew/opt/[email protected]/bin/python3.13
Creating virtual environment at: py313
Activate with: source py313/bin/activate
➜ ~ source py313/bin/activate
(py313) ➜ ~ cd code/inference
(py313) ➜ inference git:(fix-exp-tests) uv pip install -e .
Using Python 3.13.5 environment at: /Users/hansent/py313
× No solution found when resolving dependencies:
╰─▶ Because all versions of mediapipe have no wheels with a matching Python
ABI tag (e.g., `cp313`) and inference-development==0.0.0 depends on
mediapipe, we can conclude that inference-development==0.0.0 cannot
be used.
And because only inference-development==0.0.0 is available and you
require inference-development, we can conclude that your requirements
are unsatisfiable.
hint: You require CPython 3.13 (`cp313`), but we only found wheels
for `mediapipe` (v0.10.21) with the following Python ABI tags: `cp39`,
`cp310`, `cp311`, `cp312`