astral-sh / uv

An extremely fast Python package installer and resolver, written in Rust.
https://astral.sh/
Apache License 2.0
15.99k stars 477 forks source link

uv fails to resolve `apache-airflow[all]==2.8.4` where pip succeeds #3078

Open notatallshaw opened 4 months ago

notatallshaw commented 4 months ago

Streps to reproduce

  1. Linux, Python 3.11, uv 0.1.32
  2. Command: uv pip install --dry-run apache-airflow[all]==2.8.4

Error

error: Failed to download and build: apache-beam==2.2.0
  Caused by: Failed to build: apache-beam==2.2.0
  Caused by: Build backend failed to determine extra requires with `build_wheel()` with exit status: 1
--- stdout:

--- stderr:
<string>:24: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
Traceback (most recent call last):
  File "<string>", line 14, in <module>
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 325, in get_requires_for_build_wheel
    return self._get_build_requires(config_settings, requirements=['wheel'])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 295, in _get_build_requires
    self.run_setup()
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 487, in run_setup
    super().run_setup(setup_script=setup_script)
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/setuptools/build_meta.py", line 311, in run_setup
    exec(code, locals())
  File "<string>", line 61, in <module>
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 497, in get_distribution
    dist = get_provider(dist)
           ^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 384, in get_provider
    return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 937, in require
    needed = self.resolve(parse_requirements(requirements))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 798, in resolve
    dist = self._resolve_dist(
           ^^^^^^^^^^^^^^^^^^^
  File "/home/damian/.cache/uv/.tmpit537P/.venv/lib/python3.11/site-packages/pkg_resources/__init__.py", line 839, in _resolve_dist
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'pip' distribution was not found and is required by the application
---

Expected

Same as pip, can install fine:

$ pip install --dry-run apache-airflow[all]==2.8.4
...
Would install Authlib-1.3.0 Babel-2.14.0 ConfigUpdater-3.2 Deprecated-1.2.14 Flask-2.2.5 Flask-AppBuilder-4.3.11 Flask-Babel-2.0.0 Flask-Bcrypt-1.0.1 Flask-Caching-2.1.0 Flask-JWT-Extended-4.6.0 Flask-Limiter-3.5.1 Flask-Login-0.6.3 Flask-SQLAlchemy-2.5.1 Flask-Session-0.5.0 Flask-WTF-1.2.1 JPype1-1.5.0 JayDeBeApi-1.2.3 Jinja2-3.1.3 Js2Py-0.74 Mako-1.3.3 Markdown-3.6 MarkupSafe-2.1.5 PyAthena-3.6.0 PyGithub-2.3.0 PyHive-0.7.0 PyJWT-2.8.0 PyNaCl-1.5.0 PyYAML-6.0.1 Pygments-2.17.2 SQLAlchemy-1.4.52 SQLAlchemy-JSONField-1.0.2 SQLAlchemy-Utils-0.41.2 WTForms-3.1.2 Werkzeug-2.2.3 adal-1.2.7 adlfs-2024.4.1 aiobotocore-2.12.3 aiofiles-23.2.1 aiohttp-3.9.5 aioitertools-0.11.0 aiosignal-1.3.1 alembic-1.13.1 alibabacloud-adb20211201-1.3.3 alibabacloud-tea-0.3.6 alibabacloud_credentials-0.3.2 alibabacloud_endpoint_util-0.0.3 alibabacloud_gateway_spi-0.0.1 alibabacloud_openapi_util-0.2.2 alibabacloud_tea_openapi-0.3.8 alibabacloud_tea_util-0.3.11 alibabacloud_tea_xml-0.0.2 aliyun-python-sdk-core-2.15.1 aliyun-python-sdk-kms-2.16.2 amqp-5.2.0 analytics-python-1.2.9 annotated-types-0.6.0 anyio-4.3.0 apache-airflow-2.8.4 apache-airflow-providers-airbyte-3.7.0 apache-airflow-providers-alibaba-2.7.3 apache-airflow-providers-amazon-8.20.0 apache-airflow-providers-apache-beam-5.6.3 apache-airflow-providers-apache-cassandra-3.4.2 apache-airflow-providers-apache-drill-2.6.1 apache-airflow-providers-apache-druid-3.9.0 apache-airflow-providers-apache-flink-1.3.0 apache-airflow-providers-apache-hdfs-4.3.3 apache-airflow-providers-apache-hive-8.0.0 apache-airflow-providers-apache-impala-1.3.0 apache-airflow-providers-apache-kafka-1.3.1 apache-airflow-providers-apache-kylin-3.5.0 apache-airflow-providers-apache-livy-3.7.3 apache-airflow-providers-apache-pig-4.3.0 apache-airflow-providers-apache-pinot-4.3.1 apache-airflow-providers-apache-spark-4.7.2 apache-airflow-providers-apprise-1.2.2 apache-airflow-providers-arangodb-2.4.1 apache-airflow-providers-asana-2.4.1 apache-airflow-providers-atlassian-jira-2.5.1 apache-airflow-providers-celery-3.6.2 apache-airflow-providers-cloudant-3.4.1 apache-airflow-providers-cncf-kubernetes-8.1.0 apache-airflow-providers-cohere-1.1.3 apache-airflow-providers-common-io-1.3.1 apache-airflow-providers-common-sql-1.12.0 apache-airflow-providers-databricks-6.2.0 apache-airflow-providers-datadog-3.5.1 apache-airflow-providers-dbt-cloud-3.7.1 apache-airflow-providers-dingding-3.4.0 apache-airflow-providers-discord-3.6.0 apache-airflow-providers-docker-3.10.0 apache-airflow-providers-elasticsearch-5.3.4 apache-airflow-providers-exasol-4.4.3 apache-airflow-providers-facebook-3.4.0 apache-airflow-providers-ftp-3.8.0 apache-airflow-providers-github-2.5.1 apache-airflow-providers-google-10.17.0 apache-airflow-providers-grpc-3.4.1 apache-airflow-providers-hashicorp-3.6.4 apache-airflow-providers-http-4.10.1 apache-airflow-providers-imap-3.5.0 apache-airflow-providers-influxdb-2.4.1 apache-airflow-providers-jdbc-4.2.2 apache-airflow-providers-jenkins-3.5.1 apache-airflow-providers-microsoft-azure-10.0.0 apache-airflow-providers-microsoft-mssql-3.6.1 apache-airflow-providers-microsoft-psrp-2.6.1 apache-airflow-providers-microsoft-winrm-3.4.0 apache-airflow-providers-mongo-4.0.0 apache-airflow-providers-mysql-5.5.4 apache-airflow-providers-neo4j-3.5.0 apache-airflow-providers-odbc-4.5.0 apache-airflow-providers-openai-1.1.0 apache-airflow-providers-openfaas-3.4.0 apache-airflow-providers-openlineage-1.7.0 apache-airflow-providers-opensearch-1.1.2 apache-airflow-providers-opsgenie-5.5.0 apache-airflow-providers-oracle-3.9.2 apache-airflow-providers-pagerduty-3.6.2 apache-airflow-providers-papermill-3.6.2 apache-airflow-providers-pgvector-1.1.0 apache-airflow-providers-pinecone-1.1.2 apache-airflow-providers-postgres-5.10.2 apache-airflow-providers-presto-5.4.2 apache-airflow-providers-redis-3.6.1 apache-airflow-providers-salesforce-5.6.3 apache-airflow-providers-samba-4.6.0 apache-airflow-providers-segment-3.4.0 apache-airflow-providers-sendgrid-3.4.0 apache-airflow-providers-sftp-4.9.1 apache-airflow-providers-singularity-3.4.0 apache-airflow-providers-slack-8.6.2 apache-airflow-providers-smtp-1.6.1 apache-airflow-providers-snowflake-5.4.0 apache-airflow-providers-sqlite-3.7.1 apache-airflow-providers-ssh-3.10.1 apache-airflow-providers-tableau-4.4.2 apache-airflow-providers-tabular-1.4.1 apache-airflow-providers-telegram-4.4.0 apache-airflow-providers-trino-5.6.3 apache-airflow-providers-vertica-3.7.1 apache-airflow-providers-weaviate-1.3.4 apache-airflow-providers-yandex-3.10.0 apache-airflow-providers-zendesk-4.6.0 apache-beam-2.55.1 apispec-6.6.0 apprise-1.7.6 argcomplete-3.3.0 asana-3.2.2 asgiref-3.8.1 asn1crypto-1.5.1 asttokens-2.4.1 asyncssh-2.14.2 atlasclient-1.0.0 atlassian-python-api-3.41.11 attrs-23.2.0 azure-batch-14.2.0 azure-common-1.1.28 azure-core-1.30.1 azure-cosmos-4.6.0 azure-datalake-store-0.0.53 azure-identity-1.16.0 azure-keyvault-secrets-4.8.0 azure-kusto-data-4.4.0 azure-mgmt-containerinstance-10.1.0 azure-mgmt-containerregistry-10.3.0 azure-mgmt-core-1.4.0 azure-mgmt-cosmosdb-9.4.0 azure-mgmt-datafactory-6.1.0 azure-mgmt-datalake-nspkg-3.0.1 azure-mgmt-datalake-store-0.5.0 azure-mgmt-nspkg-3.0.2 azure-mgmt-resource-23.0.1 azure-mgmt-storage-21.1.0 azure-nspkg-3.0.2 azure-servicebus-7.12.1 azure-storage-blob-12.19.1 azure-storage-file-datalake-12.14.0 azure-storage-file-share-12.15.0 azure-synapse-artifacts-0.18.0 azure-synapse-spark-0.7.0 backoff-2.2.1 bcrypt-4.1.2 beautifulsoup4-4.12.3 billiard-4.2.0 bitarray-2.9.2 black-24.4.0 blinker-1.7.0 boto3-1.34.69 botocore-1.34.69 cachelib-0.9.0 cachetools-5.3.3 cassandra-driver-3.29.1 cattrs-23.2.3 celery-5.3.6 certifi-2024.2.2 cffi-1.16.0 cgroupspy-0.2.3 chardet-5.2.0 charset-normalizer-3.3.2 ciso8601-2.3.1 click-8.1.7 click-didyoumean-0.3.1 click-plugins-1.1.1 click-repl-0.3.0 clickclick-20.10.2 cloudant-2.15.0 cloudpickle-2.2.1 cohere-4.57 colorama-0.4.6 colorlog-4.8.0 comm-0.2.2 confluent-kafka-2.3.0 connexion-2.14.2 crcmod-1.7 cron-descriptor-1.4.3 croniter-2.0.3 cryptography-41.0.7 curlify-2.2.1 databricks-sql-connector-2.9.5 datadog-0.49.1 db-dtypes-1.2.0 debugpy-1.8.1 decorator-5.1.1 defusedxml-0.7.1 dill-0.3.1.1 distlib-0.3.8 distro-1.9.0 dnspython-2.6.1 docker-7.0.0 docopt-0.6.2 docstring_parser-0.16 docutils-0.21.1 elastic-transport-8.13.0 elasticsearch-8.13.0 email-validator-1.3.1 entrypoints-0.4 et-xmlfile-1.1.0 eventlet-0.36.1 executing-2.0.1 facebook_business-19.0.3 fastavro-1.9.4 fasteners-0.19 fastjsonschema-2.19.1 filelock-3.13.4 flower-2.0.1 frozenlist-1.4.1 fsspec-2024.3.1 future-1.0.0 gcloud-aio-auth-4.2.3 gcloud-aio-bigquery-7.1.0 gcloud-aio-storage-9.2.0 gcsfs-2024.3.1 geomet-0.2.1.post1 gevent-24.2.1 google-ads-23.1.0 google-analytics-admin-0.22.7 google-api-core-2.18.0 google-api-python-client-2.126.0 google-auth-2.29.0 google-auth-httplib2-0.2.0 google-auth-oauthlib-1.2.0 google-cloud-aiplatform-1.47.0 google-cloud-appengine-logging-1.4.3 google-cloud-audit-log-0.2.5 google-cloud-automl-2.13.3 google-cloud-batch-0.17.18 google-cloud-bigquery-3.20.1 google-cloud-bigquery-datatransfer-3.15.2 google-cloud-bigtable-2.23.1 google-cloud-build-3.24.0 google-cloud-compute-1.18.0 google-cloud-container-2.45.0 google-cloud-core-2.4.1 google-cloud-datacatalog-3.19.0 google-cloud-dataflow-client-0.8.10 google-cloud-dataform-0.5.9 google-cloud-dataplex-1.13.0 google-cloud-dataproc-5.9.3 google-cloud-dataproc-metastore-1.15.3 google-cloud-dlp-3.16.0 google-cloud-kms-2.21.3 google-cloud-language-2.13.3 google-cloud-logging-3.10.0 google-cloud-memcache-1.9.3 google-cloud-monitoring-2.20.0 google-cloud-orchestration-airflow-1.12.1 google-cloud-os-login-2.14.3 google-cloud-pubsub-2.21.1 google-cloud-redis-2.15.3 google-cloud-resource-manager-1.12.3 google-cloud-run-0.10.5 google-cloud-secret-manager-2.19.0 google-cloud-spanner-3.44.0 google-cloud-speech-2.26.0 google-cloud-storage-2.16.0 google-cloud-storage-transfer-1.11.3 google-cloud-tasks-2.16.3 google-cloud-texttospeech-2.16.3 google-cloud-translate-3.15.3 google-cloud-videointelligence-2.13.3 google-cloud-vision-3.7.2 google-cloud-workflows-1.14.3 google-crc32c-1.5.0 google-re2-1.1 google-resumable-media-2.7.0 googleapis-common-protos-1.63.0 graphviz-0.20.3 greenlet-3.0.3 grpc-google-iam-v1-0.13.0 grpc-interceptor-0.15.4 grpcio-1.62.1 grpcio-gcp-0.2.2 grpcio-status-1.62.1 gssapi-1.8.3 gunicorn-22.0.0 h11-0.14.0 hdfs-2.7.3 hmsclient-0.1.1 httpcore-0.16.3 httplib2-0.22.0 httpx-0.23.3 humanize-4.9.0 hvac-2.1.0 idna-3.7 ijson-3.2.3 importlib-metadata-6.11.0 importlib_resources-6.4.0 impyla-0.19.0 inflection-0.5.1 influxdb-client-1.41.0 ipykernel-6.29.4 ipython-8.23.0 isodate-0.6.1 itsdangerous-2.2.0 jedi-0.19.1 jmespath-0.10.0 json-merge-patch-0.2 jsonpath-ng-1.6.1 jsonpickle-3.0.4 jsonschema-4.21.1 jsonschema-specifications-2023.12.1 jupyter_client-8.6.1 jupyter_core-5.7.2 kombu-5.3.7 krb5-0.5.1 kubernetes-29.0.0 kubernetes_asyncio-29.0.0 kylinpy-2.8.4 lazy-object-proxy-1.10.0 ldap3-2.9.1 limits-3.10.1 linkify-it-py-2.0.3 lockfile-0.12.2 loguru-0.7.2 looker-sdk-24.4.0 lxml-5.2.1 lz4-4.3.3 markdown-it-py-3.0.0 marshmallow-3.21.1 marshmallow-oneofschema-3.1.1 marshmallow-sqlalchemy-0.26.1 matplotlib-inline-0.1.7 mdit-py-plugins-0.4.0 mdurl-0.1.2 more-itertools-10.2.0 msal-1.28.0 msal-extensions-1.1.0 msrest-0.7.1 msrestazure-0.6.4.post1 multi_key_dict-2.0.3 multidict-6.0.5 mypy-extensions-1.0.0 mysql-connector-python-8.3.0 mysqlclient-2.2.4 nbclient-0.10.0 nbformat-5.10.4 neo4j-5.19.0 nest-asyncio-1.6.0 numpy-1.26.4 oauthlib-3.2.2 objsize-0.7.0 openai-1.20.0 openlineage-integration-common-1.12.0 openlineage-python-1.12.0 openlineage_sql-1.12.0 openpyxl-3.1.2 opensearch-py-2.5.0 opentelemetry-api-1.24.0 opentelemetry-exporter-otlp-1.24.0 opentelemetry-exporter-otlp-proto-common-1.24.0 opentelemetry-exporter-otlp-proto-grpc-1.24.0 opentelemetry-exporter-otlp-proto-http-1.24.0 opentelemetry-exporter-prometheus-0.45b0 opentelemetry-proto-1.24.0 opentelemetry-sdk-1.24.0 opentelemetry-semantic-conventions-0.45b0 opsgenie-sdk-2.1.5 oracledb-2.1.2 ordered-set-4.1.0 orjson-3.10.1 oss2-2.18.4 packaging-24.0 pandas-2.1.4 pandas-gbq-0.22.0 pandas-stubs-2.2.1.240316 papermill-2.5.0 paramiko-3.4.0 parso-0.8.4 pathspec-0.12.1 pbr-6.0.0 pdpyras-5.2.0 pendulum-3.0.0 pexpect-4.9.0 pgvector-0.2.5 pinecone-client-2.2.4 pinotdb-5.1.6 platformdirs-4.2.0 pluggy-1.4.0 ply-3.11 plyvel-1.5.1 portalocker-2.8.2 presto-python-client-0.8.4 prison-0.2.1 prometheus_client-0.20.0 prompt-toolkit-3.0.43 proto-plus-1.23.0 protobuf-4.25.3 psutil-5.9.8 psycopg2-binary-2.9.9 ptyprocess-0.7.0 pure-eval-0.2.2 pure-sasl-0.6.2 py4j-0.10.9.7 pyOpenSSL-24.1.0 pyarrow-14.0.2 pyarrow-hotfix-0.6 pyasn1-0.5.1 pyasn1-modules-0.3.0 pycountry-23.12.11 pycparser-2.22 pycryptodome-3.20.0 pydantic-2.7.0 pydantic_core-2.18.1 pydata-google-auth-1.8.2 pydot-1.4.2 pydruid-0.6.6 pyexasol-0.25.2 pyjsparser-2.7.1 pykerberos-1.2.4 pymongo-4.6.3 pymssql-2.3.0 pyodbc-5.1.0 pyparsing-3.1.2 pypsrp-0.8.1 pyspark-3.5.1 pyspnego-0.10.2 python-arango-7.9.1 python-daemon-3.0.1 python-dateutil-2.9.0.post0 python-dotenv-1.0.1 python-http-client-3.3.7 python-jenkins-1.8.2 python-ldap-3.4.4 python-nvd3-0.15.0 python-slugify-8.0.4 python-telegram-bot-20.2 python3-saml-1.16.0 pytz-2024.1 pywinrm-0.4.3 pyzmq-26.0.0 reactivex-4.0.4 redis-5.0.3 redshift-connector-2.1.1 referencing-0.34.0 regex-2024.4.16 requests-2.31.0 requests-file-2.0.0 requests-kerberos-0.14.0 requests-ntlm-1.2.0 requests-oauthlib-1.3.1 requests-toolbelt-1.0.0 rfc3339-validator-0.1.4 rfc3986-1.5.0 rich-13.7.1 rich-argparse-1.4.0 rpds-py-0.18.0 rsa-4.9 s3fs-2024.3.1 s3transfer-0.10.1 scramp-1.4.5 scrapbook-0.5.0 sendgrid-6.11.0 sentry-sdk-1.45.0 setproctitle-1.3.3 setuptools-66.1.1 shapely-2.0.4 simple-salesforce-1.12.6 six-1.16.0 slack_sdk-3.27.1 smbprotocol-1.13.0 sniffio-1.3.1 snowflake-connector-python-3.8.1 snowflake-sqlalchemy-1.5.2 sortedcontainers-2.4.0 soupsieve-2.5 spython-0.3.13 sqlalchemy-bigquery-1.10.0 sqlalchemy-redshift-0.8.14 sqlalchemy-spanner-1.6.2 sqlalchemy_drill-1.1.4 sqlparse-0.5.0 sshtunnel-0.4.0 stack-data-0.6.3 starkbank-ecdsa-2.2.0 statsd-4.0.1 tableauserverclient-0.25 tabulate-0.9.0 tenacity-8.2.3 termcolor-2.4.0 text-unidecode-1.3 thrift-0.16.0 thrift-sasl-0.4.3 time-machine-2.14.1 tomlkit-0.12.4 tornado-6.4 tqdm-4.66.2 traitlets-5.14.2 trino-0.328.0 types-pytz-2024.1.0.20240203 typing-3.7.4.3 typing_extensions-4.11.0 tzdata-2024.1 tzlocal-5.2 uc-micro-py-1.0.3 unicodecsv-0.14.1 universal-pathlib-0.1.4 uritemplate-4.1.1 urllib3-1.26.18 validators-0.28.0 vertica-python-1.3.8 vine-5.1.0 virtualenv-20.25.1 watchtower-3.1.0 wcwidth-0.2.13 weaviate-client-3.26.2 websocket-client-1.7.0 wrapt-1.16.0 xmlsec-1.3.13 xmltodict-0.13.0 yandex-query-client-0.1.3 yandexcloud-0.271.0 yarl-1.9.4 zeep-4.2.1 zenpy-2.0.47 zipp-3.18.1 zope.event-5.0 zope.interface-6.3 zstandard-0.22.0
notatallshaw commented 4 months ago

One issue could be pip has a preference on what to backtrack on based on certain heuristics of the users requirements, see:

Whereas my understanding is uv does not apply a preference like this.

charliermarsh commented 4 months ago

We added the heuristics in #3087 but this still fails for me, for a different reason related to the relationship between extras and the base package. I have some ideas on how to fix it.

notatallshaw commented 4 months ago

We added the heuristics in #3087 but this still fails for me, for a different reason related to the relationship between extras and the base package. I have some ideas on how to fix it.

Yeah, I was only speculating that pip's heuristics are part of it.

With regards to extras, pip has an optimization that "constrains" extras together with their base requirements: https://github.com/pypa/pip/pull/12095, don't know if that approach will be helpful to you, as no idea how uv handles extras, but for some use cases it was a big performance boost for pip.

Also, my understanding is pubgrub-rs strongly implements CDCL to resolve, whereas I would describe pip's approach as "weakly" implementing CDCL, so the path taken through the resolution graph will always be a little different. Though in this case I would think uv's approach would be better, and I do hope to eventually improve pip here and make it's approach to CDCL stronger.

charliermarsh commented 4 months ago

Unfortunately I still can't get this to avoid going down the apache-beam==2.2.0 branch. I may need to map out the entire path to that requirement to really understand it.

notatallshaw commented 4 months ago

Unfortunately I still can't get this to avoid going down the apache-beam==2.2.0 branch. I may need to map out the entire path to that requirement to really understand it.

I won't have time today, but I'll try and make a simpler set of requirements that reproduces this issue. apache-airflow[all] is probably too big to look at the entire path by hand, unless you have exceptional tooling.

notatallshaw commented 4 months ago

Simplifying uv fails with the requirement apache-airflow[apache-beam]==2.8.4.

When I look at the metadata of apache-airflow this extra adds the unbound requirement apache-airflow-providers-apache-beam, new versions of apache-airflow-providers-apache-beam but a reasonable lower bound on apache-beam, but older ones do not.

Spending a lot of time playing around with requirements, I found the issue was a combination of dill and apache-airflow-providers-apache-beam==1.0.0, simplifying further I found pip is able to resolve this and uv is not:

dill>=0.2.2
apache-beam<=2.49.0

Edit: Constrained failing requirements even further, and deleted the below comment as I wasn't able to reproduce the results this morning and I don't want people to take it as true if I can't reproduce it. Further I want to investigate why pip skips over apache-beam==2.2.0 in several scenarios I tried this morning.