From ray import serve causes ImportError: cannot import name 'Schema' from 'pydantic'

Hey :wave:

When following the getting started guide (Getting Started Guide — Ray 2.1.0) specifically the Scalable Model Serving section, from ray import serve fails with ImportError: cannot import name ‘Schema’ from ‘pydantic’.

Virtualenv

Python:         3.9.13
Implementation: CPython

ray version
ray = {extras = ["serve"], version = "^1.13.0"}

import requests

from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier

from ray import serve

serve.start()

# Train model.
iris_dataset = load_iris()
model = GradientBoostingClassifier()
model.fit(iris_dataset["data"], iris_dataset["target"])


@serve.deployment(route_prefix="/iris")
class BoostingModel:
    def __init__(self, model):
        self.model = model
        self.label_list = iris_dataset["target_names"].tolist()

    async def __call__(self, request):
        payload = (await request.json())["vector"]
        print(f"Received http request with data {payload}")

        prediction = self.model.predict([payload])[0]
        human_name = self.label_list[prediction]
        return {"result": human_name}


# Deploy model.
BoostingModel.deploy(model)

# Query it!
sample_request_input = {"vector": [1.2, 1.0, 1.1, 0.9]}

response = requests.get("http://localhost:8000/iris", json=sample_request_input)

print('response', response.text)

Gives the following error.

Traceback (most recent call last):
  File "/Users/me/Developer/ray_demo/serve.py", line 9, in <module>
    from ray import serve
  File "/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/ray/serve/__init__.py", line 2, in <module>
    from ray.serve.api import (
  File "/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/ray/serve/api.py", line 14, in <module>
    from fastapi import APIRouter, FastAPI
  File "/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/fastapi/__init__.py", line 5, in <module>
    from .applications import FastAPI
  File "/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/fastapi/applications.py", line 3, in <module>
    from fastapi import routing
  File "/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/fastapi/routing.py", line 6, in <module>
    from fastapi import params
  File "/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/fastapi/params.py", line 4, in <module>
    from pydantic import Schema
ImportError: cannot import name 'Schema' from 'pydantic' (/Users/me/Library/Caches/pypoetry/virtualenvs/yes-6KwWb3XD-py3.9/lib/python3.9/site-packages/pydantic/__init__.cpython-39-darwin.so)

This appears to be a problem with how dependencies are managed i.e. via poetry using pyenv from ray import serve works as expected.

I couldn’t reproduce this with a virtualenv on Python 3.9.12.

This appears to be a problem with how dependencies are managed i.e. via poetry using pyenv from ray import serve works as expected.

Could you elaborate on what you mean by this?

hey @bveeramani ,

Yes, when I install ray via poetry the pydantic dependency causes the above error.

However, when I install with pyenv all works as expected.

Therefore the issue is with Poetry and not Ray.

Ah, gotcha. Makes sense

We also encountered this

The only difference with pip vs poetry was the versions of fastapi and startlette

On Ray 2.1.0, Python 3.9, for some reason, poetry chooses
starlette 0.21.0
fastapi 0.1.17

Whereas pip chooses
starlette 0.20.4
fastapi 0.86.0

Explicitly adding fastapi as a dependency fixes this issue:

.venv ❯ poetry add fastapi
Using version ^0.86.0 for fastapi

Updating dependencies
Resolving dependencies... (1.2s)

Writing lock file

Package operations: 0 installs, 2 updates, 0 removals

  • Updating starlette (0.21.0 -> 0.20.4)
  • Updating fastapi (0.1.17 -> 0.86.0)

To dig into why poetry chooses these versions, these are the things selecting fastapi in the lockfile, so I can’t immediately see why an older version of fastapi was resolved:

fastapi = {version = "*", optional = true, markers = "extra == \"serve\""}
starlette = {version = "*", optional = true, markers = "extra == \"serve\""}

Removing fastapi from dependencies and running poetry update will again downgrade fastapi, so the resolution is consistent.

When running poetry with a verbose flag, you get this resolution:

Source (PyPI): 150 packages found for fastapi *
   1: fact: fastapi (0.86.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.86.0) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.86.0)
   1: fact: fastapi (0.85.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.85.2) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.85.2)
   1: fact: fastapi (0.85.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.85.1) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.85.1)
   1: fact: fastapi (0.85.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.85.0) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.85.0)
   1: fact: fastapi (0.84.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.84.0) depends on starlette (0.19.1)
   1: derived: not fastapi (==0.84.0)
   1: fact: fastapi (0.83.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.83.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.83.0)
   1: fact: fastapi (0.82.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.82.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.82.0)
   1: fact: fastapi (0.81.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.81.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.81.0)
   1: fact: fastapi (0.80.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.80.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.80.0)
   1: fact: fastapi (0.79.1) depends on starlette (0.19.1)
   1: fact: fastapi (0.79.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.79.1)
   1: fact: fastapi (0.79.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.79.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.79.0)
   1: fact: fastapi (0.78.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.78.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.78.0)
   1: fact: fastapi (0.77.1) depends on starlette (0.19.1)
   1: fact: fastapi (0.77.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.77.1)
   1: fact: fastapi (0.77.0) depends on starlette (0.19.0)
   1: fact: fastapi (0.77.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.77.0)
   1: fact: fastapi (0.76.0) depends on starlette (0.18.0)
   1: fact: fastapi (0.76.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.76.0)
   1: fact: fastapi (0.75.2) depends on starlette (0.17.1)
   1: fact: fastapi (0.75.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.75.2)
   1: fact: fastapi (0.75.1) depends on starlette (0.17.1)
   1: fact: fastapi (0.75.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.75.1)
   1: fact: fastapi (0.75.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.75.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.75.0)
   1: fact: fastapi (0.74.1) depends on starlette (0.17.1)
   1: fact: fastapi (0.74.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.74.1)
   1: fact: fastapi (0.74.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.74.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.74.0)
   1: fact: fastapi (0.73.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.73.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.73.0)
   1: fact: fastapi (0.72.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.72.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.72.0)
   1: fact: fastapi (0.71.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.71.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.71.0)
   1: fact: fastapi (0.70.1) depends on starlette (0.16.0)
   1: fact: fastapi (0.70.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.70.1)
   1: fact: fastapi (0.70.0) depends on starlette (0.16.0)
   1: fact: fastapi (0.70.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.70.0)
   1: fact: fastapi (0.69.0) depends on starlette (0.15.0)
   1: fact: fastapi (0.69.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.69.0)
   1: fact: fastapi (0.68.2) depends on starlette (0.14.2)
   1: fact: fastapi (0.68.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.68.2)
   1: fact: fastapi (0.68.1) depends on starlette (0.14.2)
   1: fact: fastapi (0.68.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.68.1)
   1: fact: fastapi (0.68.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.68.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.68.0)
   1: fact: fastapi (0.67.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.67.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.67.0)
   1: fact: fastapi (0.66.1) depends on starlette (0.14.2)
   1: fact: fastapi (0.66.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.66.1)
   1: fact: fastapi (0.66.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.66.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.66.0)
   1: fact: fastapi (0.65.3) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.3) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.65.3)
   1: fact: fastapi (0.65.2) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.65.2)
   1: fact: fastapi (0.65.1) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.65.1)
   1: fact: fastapi (0.65.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.65.0)
   1: fact: fastapi (0.64.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.64.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.64.0)
   1: fact: fastapi (0.63.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.63.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.63.0)
   1: fact: fastapi (0.62.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.62.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.62.0)
   1: fact: fastapi (0.61.2) depends on starlette (0.13.6)
   1: fact: fastapi (0.61.2) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.61.2)
   1: fact: fastapi (0.61.1) depends on starlette (0.13.6)
   1: fact: fastapi (0.61.1) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.61.1)
   1: fact: fastapi (0.61.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.61.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.61.0)
   1: fact: fastapi (0.60.2) depends on starlette (0.13.6)
   1: fact: fastapi (0.60.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.60.2)
   1: fact: fastapi (0.60.1) depends on starlette (0.13.6)
   1: fact: fastapi (0.60.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.60.1)
   1: fact: fastapi (0.60.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.60.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.60.0)
   1: fact: fastapi (0.59.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.59.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.59.0)
   1: fact: fastapi (0.58.1) depends on starlette (0.13.4)
   1: fact: fastapi (0.58.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.58.1)
   1: fact: fastapi (0.58.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.58.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.58.0)
   1: fact: fastapi (0.57.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.57.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.57.0)
   1: fact: fastapi (0.56.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.56.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.56.1)
   1: fact: fastapi (0.56.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.56.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.56.0)
   1: fact: fastapi (0.55.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.55.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.55.1)
   1: fact: fastapi (0.55.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.55.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.55.0)
   1: fact: fastapi (0.54.2) depends on starlette (0.13.2)
   1: fact: fastapi (0.54.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.54.2)
   1: fact: fastapi (0.54.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.54.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.54.1)
   1: fact: fastapi (0.54.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.54.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.54.0)
   1: fact: fastapi (0.53.2) depends on starlette (0.13.2)
   1: fact: fastapi (0.53.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.53.2)
   1: fact: fastapi (0.53.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.53.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.53.1)
   1: fact: fastapi (0.53.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.53.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.53.0)
   1: fact: fastapi (0.52.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.52.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.52.0)
   1: fact: fastapi (0.51.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.51.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.51.0)
   1: fact: fastapi (0.50.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.50.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.50.0)
   1: fact: fastapi (0.49.2) depends on starlette (0.12.9)
   1: fact: fastapi (0.49.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.49.2)
   1: fact: fastapi (0.49.1) depends on starlette (0.12.9)
   1: fact: fastapi (0.49.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.49.1)
   1: fact: fastapi (0.49.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.49.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.49.0)
   1: fact: fastapi (0.48.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.48.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.48.0)
   1: fact: fastapi (0.47.1) depends on starlette (0.12.9)
   1: fact: fastapi (0.47.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.47.1)
   1: fact: fastapi (0.47.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.47.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.47.0)
   1: fact: fastapi (0.46.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.46.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.46.0)
   1: fact: fastapi (0.45.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.45.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.45.0)
   1: fact: fastapi (0.44.1) depends on starlette (0.12.9)
   1: fact: fastapi (0.44.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.44.1)
   1: fact: fastapi (0.44.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.44.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.44.0)
   1: fact: fastapi (0.43.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.43.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.43.0)
   1: fact: fastapi (0.42.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.42.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.42.0)
   1: fact: fastapi (0.41.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.41.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.41.0)
   1: fact: fastapi (0.40.0) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.40.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.40.0)
   1: fact: fastapi (0.39.0) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.39.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.39.0)
   1: fact: fastapi (0.38.1) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.38.1) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.38.1)
   1: fact: fastapi (0.38.0) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.38.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.38.0)
   1: fact: fastapi (0.37.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.37.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.37.0)
   1: fact: fastapi (0.36.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.36.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.36.0)
   1: fact: fastapi (0.35.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.35.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.35.0)
   1: fact: fastapi (0.34.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.34.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.34.0)
   1: fact: fastapi (0.33.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.33.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.33.0)
   1: fact: fastapi (0.32.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.32.0) depends on pydantic (>=0.28,<=0.29.0)
   1: derived: not fastapi (==0.32.0)
   1: fact: fastapi (0.31.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.31.0) depends on pydantic (>=0.28,<=0.29.0)
   1: derived: not fastapi (==0.31.0)
   1: fact: fastapi (0.30.1) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.30.1) depends on pydantic (0.28)
   1: derived: not fastapi (==0.30.1)
   1: fact: fastapi (0.30.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.30.0) depends on pydantic (0.28)
   1: derived: not fastapi (==0.30.0)
   1: fact: fastapi (0.29.1) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.29.1) depends on pydantic (0.26)
   1: derived: not fastapi (==0.29.1)
   1: fact: fastapi (0.29.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.29.0) depends on pydantic (0.26)
   1: derived: not fastapi (==0.29.0)
   1: fact: fastapi (0.28.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.28.0) depends on pydantic (0.26)
   1: derived: not fastapi (==0.28.0)
   1: fact: fastapi (0.27.2) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.27.2) depends on pydantic (0.26)
   1: derived: not fastapi (==0.27.2)
   1: fact: fastapi (0.27.1) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.27.1) depends on pydantic (0.26)
   1: derived: not fastapi (==0.27.1)
   1: fact: fastapi (0.27.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.27.0) depends on pydantic (0.26)
   1: derived: not fastapi (==0.27.0)
   1: fact: fastapi (0.26.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.26.0) depends on pydantic (>=0.17,<=0.26.0)
   1: derived: not fastapi (==0.26.0)
   1: fact: fastapi (0.25.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.25.0) depends on pydantic (>=0.17,<=0.26.0)
   1: derived: not fastapi (==0.25.0)
   1: fact: fastapi (0.24.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.24.0) depends on pydantic (>=0.17,<=0.26.0)
   1: derived: not fastapi (==0.24.0)
   1: fact: fastapi (0.23.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.23.0) depends on pydantic (>=0.17,<=0.25.0)
   1: derived: not fastapi (==0.23.0)
   1: fact: fastapi (0.22.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.22.0) depends on pydantic (>=0.17,<=0.25.0)
   1: derived: not fastapi (==0.22.0)
   1: fact: fastapi (0.21.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.21.0) depends on pydantic (>=0.17,<=0.25.0)
   1: derived: not fastapi (==0.21.0)
   1: fact: fastapi (0.20.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.20.1) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.20.1)
   1: fact: fastapi (0.20.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.20.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.20.0)
   1: fact: fastapi (0.19.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.19.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.19.0)
   1: fact: fastapi (0.18.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.18.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.18.0)
   1: fact: fastapi (0.17.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.17.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.17.0)
   1: fact: fastapi (0.16.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.16.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.16.0)
   1: fact: fastapi (0.15.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.15.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.15.0)
   1: fact: fastapi (0.14.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.14.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.14.0)
   1: fact: fastapi (0.13.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.13.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.13.0)
   1: fact: fastapi (0.12.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.12.1) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.12.1)
   1: fact: fastapi (0.12.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.12.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.12.0)
   1: fact: fastapi (0.11.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.11.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.11.0)
   1: fact: fastapi (0.10.2) depends on starlette (0.11.1)
   1: fact: fastapi (0.10.2) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.10.2)
   1: fact: fastapi (0.10.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.10.1) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.10.1)
   1: fact: fastapi (0.10.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.10.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.10.0)
   1: fact: fastapi (0.9.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.9.1) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.9.1)
   1: fact: fastapi (0.9.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.9.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.9.0)
   1: fact: fastapi (0.8.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.8.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.8.0)
   1: fact: fastapi (0.7.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.7.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.7.1)
   1: fact: fastapi (0.7.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.7.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.7.0)
   1: fact: fastapi (0.6.4) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.4) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.4)
   1: fact: fastapi (0.6.3) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.3) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.3)
   1: fact: fastapi (0.6.2) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.2) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.2)
   1: fact: fastapi (0.6.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.1)
   1: fact: fastapi (0.6.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.0)
   1: fact: fastapi (0.5.1) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.5.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.5.1)
   1: fact: fastapi (0.5.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.5.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.5.0)
   1: fact: fastapi (0.4.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.4.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.4.0)
   1: fact: fastapi (0.3.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.3.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.3.0)
   1: fact: fastapi (0.2.1) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.2.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.2.1)
   1: fact: fastapi (0.2.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.2.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.2.0)
   1: fact: fastapi (0.1.19) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.1.19) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.1.19)
   1: fact: fastapi (0.1.18) depends on starlette (>=0.9.7,<0.9.11)
   1: fact: fastapi (0.1.18) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.1.18)
   1: fact: fastapi (0.1.17) depends on starlette (>=0.9.7)
   1: fact: fastapi (0.1.17) depends on pydantic (>=0.17)
   1: selecting fastapi (0.1.17)

We also encountered this

The only difference with pip vs poetry was the versions of fastapi and startlette

On Ray 2.1.0, Python 3.9, for some reason, poetry chooses
starlette 0.21.0
fastapi 0.1.17

Whereas pip chooses
starlette 0.20.4
fastapi 0.86.0

Explicitly adding fastapi as a dependency fixes this issue:

.venv ❯ poetry add fastapi
Using version ^0.86.0 for fastapi

Updating dependencies
Resolving dependencies... (1.2s)

Writing lock file

Package operations: 0 installs, 2 updates, 0 removals

  • Updating starlette (0.21.0 -> 0.20.4)
  • Updating fastapi (0.1.17 -> 0.86.0)

To dig into why poetry chooses these versions, these are the things selecting fastapi in the lockfile, so I can’t immediately see why an older version of fastapi was resolved:

fastapi = {version = "*", optional = true, markers = "extra == \"serve\""}
starlette = {version = "*", optional = true, markers = "extra == \"serve\""}

Removing fastapi from dependencies and running poetry update will again downgrade fastapi, so the resolution is consistent.

The interesting part of the verbose resolution logs being:

Source (PyPI): 120 packages found for starlette *
   1: fact: starlette (0.21.0) depends on anyio (>=3.4.0,<5)
   1: fact: starlette (0.21.0) depends on typing-extensions (>=3.10.0)
   1: selecting starlette (0.21.0)
Source (PyPI): 150 packages found for fastapi *
   1: fact: fastapi (0.86.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.86.0) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.86.0)
   1: fact: fastapi (0.85.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.85.2) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.85.2)
   1: fact: fastapi (0.85.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.85.1) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.85.1)
   1: fact: fastapi (0.85.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.85.0) depends on starlette (0.20.4)
   1: derived: not fastapi (==0.85.0)
   1: fact: fastapi (0.84.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: fact: fastapi (0.84.0) depends on starlette (0.19.1)
   1: derived: not fastapi (==0.84.0)
   1: fact: fastapi (0.83.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.83.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.83.0)
   1: fact: fastapi (0.82.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.82.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.82.0)
   1: fact: fastapi (0.81.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.81.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.81.0)
   1: fact: fastapi (0.80.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.80.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.80.0)
   1: fact: fastapi (0.79.1) depends on starlette (0.19.1)
   1: fact: fastapi (0.79.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.79.1)
   1: fact: fastapi (0.79.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.79.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.79.0)
   1: fact: fastapi (0.78.0) depends on starlette (0.19.1)
   1: fact: fastapi (0.78.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.78.0)
   1: fact: fastapi (0.77.1) depends on starlette (0.19.1)
   1: fact: fastapi (0.77.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.77.1)
   1: fact: fastapi (0.77.0) depends on starlette (0.19.0)
   1: fact: fastapi (0.77.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.77.0)
   1: fact: fastapi (0.76.0) depends on starlette (0.18.0)
   1: fact: fastapi (0.76.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.76.0)
   1: fact: fastapi (0.75.2) depends on starlette (0.17.1)
   1: fact: fastapi (0.75.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.75.2)
   1: fact: fastapi (0.75.1) depends on starlette (0.17.1)
   1: fact: fastapi (0.75.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.75.1)
   1: fact: fastapi (0.75.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.75.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.75.0)
   1: fact: fastapi (0.74.1) depends on starlette (0.17.1)
   1: fact: fastapi (0.74.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.74.1)
   1: fact: fastapi (0.74.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.74.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.74.0)
   1: fact: fastapi (0.73.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.73.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.73.0)
   1: fact: fastapi (0.72.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.72.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.72.0)
   1: fact: fastapi (0.71.0) depends on starlette (0.17.1)
   1: fact: fastapi (0.71.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.71.0)
   1: fact: fastapi (0.70.1) depends on starlette (0.16.0)
   1: fact: fastapi (0.70.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.70.1)
   1: fact: fastapi (0.70.0) depends on starlette (0.16.0)
   1: fact: fastapi (0.70.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.70.0)
   1: fact: fastapi (0.69.0) depends on starlette (0.15.0)
   1: fact: fastapi (0.69.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.69.0)
   1: fact: fastapi (0.68.2) depends on starlette (0.14.2)
   1: fact: fastapi (0.68.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.68.2)
   1: fact: fastapi (0.68.1) depends on starlette (0.14.2)
   1: fact: fastapi (0.68.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.68.1)
   1: fact: fastapi (0.68.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.68.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.68.0)
   1: fact: fastapi (0.67.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.67.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.67.0)
   1: fact: fastapi (0.66.1) depends on starlette (0.14.2)
   1: fact: fastapi (0.66.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.66.1)
   1: fact: fastapi (0.66.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.66.0) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.66.0)
   1: fact: fastapi (0.65.3) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.3) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.65.3)
   1: fact: fastapi (0.65.2) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.2) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.65.2)
   1: fact: fastapi (0.65.1) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.1) depends on pydantic (>=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0)
   1: derived: not fastapi (==0.65.1)
   1: fact: fastapi (0.65.0) depends on starlette (0.14.2)
   1: fact: fastapi (0.65.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.65.0)
   1: fact: fastapi (0.64.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.64.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.64.0)
   1: fact: fastapi (0.63.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.63.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.63.0)
   1: fact: fastapi (0.62.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.62.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.62.0)
   1: fact: fastapi (0.61.2) depends on starlette (0.13.6)
   1: fact: fastapi (0.61.2) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.61.2)
   1: fact: fastapi (0.61.1) depends on starlette (0.13.6)
   1: fact: fastapi (0.61.1) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.61.1)
   1: fact: fastapi (0.61.0) depends on starlette (0.13.6)
   1: fact: fastapi (0.61.0) depends on pydantic (>=1.0.0,<2.0.0)
   1: derived: not fastapi (==0.61.0)
   1: fact: fastapi (0.60.2) depends on starlette (0.13.6)
   1: fact: fastapi (0.60.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.60.2)
   1: fact: fastapi (0.60.1) depends on starlette (0.13.6)
   1: fact: fastapi (0.60.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.60.1)
   1: fact: fastapi (0.60.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.60.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.60.0)
   1: fact: fastapi (0.59.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.59.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.59.0)
   1: fact: fastapi (0.58.1) depends on starlette (0.13.4)
   1: fact: fastapi (0.58.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.58.1)
   1: fact: fastapi (0.58.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.58.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.58.0)
   1: fact: fastapi (0.57.0) depends on starlette (0.13.4)
   1: fact: fastapi (0.57.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.57.0)
   1: fact: fastapi (0.56.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.56.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.56.1)
   1: fact: fastapi (0.56.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.56.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.56.0)
   1: fact: fastapi (0.55.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.55.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.55.1)
   1: fact: fastapi (0.55.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.55.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.55.0)
   1: fact: fastapi (0.54.2) depends on starlette (0.13.2)
   1: fact: fastapi (0.54.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.54.2)
   1: fact: fastapi (0.54.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.54.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.54.1)
   1: fact: fastapi (0.54.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.54.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.54.0)
   1: fact: fastapi (0.53.2) depends on starlette (0.13.2)
   1: fact: fastapi (0.53.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.53.2)
   1: fact: fastapi (0.53.1) depends on starlette (0.13.2)
   1: fact: fastapi (0.53.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.53.1)
   1: fact: fastapi (0.53.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.53.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.53.0)
   1: fact: fastapi (0.52.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.52.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.52.0)
   1: fact: fastapi (0.51.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.51.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.51.0)
   1: fact: fastapi (0.50.0) depends on starlette (0.13.2)
   1: fact: fastapi (0.50.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.50.0)
   1: fact: fastapi (0.49.2) depends on starlette (0.12.9)
   1: fact: fastapi (0.49.2) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.49.2)
   1: fact: fastapi (0.49.1) depends on starlette (0.12.9)
   1: fact: fastapi (0.49.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.49.1)
   1: fact: fastapi (0.49.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.49.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.49.0)
   1: fact: fastapi (0.48.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.48.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.48.0)
   1: fact: fastapi (0.47.1) depends on starlette (0.12.9)
   1: fact: fastapi (0.47.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.47.1)
   1: fact: fastapi (0.47.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.47.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.47.0)
   1: fact: fastapi (0.46.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.46.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.46.0)
   1: fact: fastapi (0.45.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.45.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.45.0)
   1: fact: fastapi (0.44.1) depends on starlette (0.12.9)
   1: fact: fastapi (0.44.1) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.44.1)
   1: fact: fastapi (0.44.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.44.0) depends on pydantic (>=0.32.2,<2.0.0)
   1: derived: not fastapi (==0.44.0)
   1: fact: fastapi (0.43.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.43.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.43.0)
   1: fact: fastapi (0.42.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.42.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.42.0)
   1: fact: fastapi (0.41.0) depends on starlette (0.12.9)
   1: fact: fastapi (0.41.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.41.0)
   1: fact: fastapi (0.40.0) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.40.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.40.0)
   1: fact: fastapi (0.39.0) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.39.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.39.0)
   1: fact: fastapi (0.38.1) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.38.1) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.38.1)
   1: fact: fastapi (0.38.0) depends on starlette (>=0.11.1,<=0.12.8)
   1: fact: fastapi (0.38.0) depends on pydantic (0.32.2)
   1: derived: not fastapi (==0.38.0)
   1: fact: fastapi (0.37.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.37.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.37.0)
   1: fact: fastapi (0.36.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.36.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.36.0)
   1: fact: fastapi (0.35.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.35.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.35.0)
   1: fact: fastapi (0.34.0) depends on starlette (>=0.11.1,<=0.12.7)
   1: fact: fastapi (0.34.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.34.0)
   1: fact: fastapi (0.33.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.33.0) depends on pydantic (0.30)
   1: derived: not fastapi (==0.33.0)
   1: fact: fastapi (0.32.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.32.0) depends on pydantic (>=0.28,<=0.29.0)
   1: derived: not fastapi (==0.32.0)
   1: fact: fastapi (0.31.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.31.0) depends on pydantic (>=0.28,<=0.29.0)
   1: derived: not fastapi (==0.31.0)
   1: fact: fastapi (0.30.1) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.30.1) depends on pydantic (0.28)
   1: derived: not fastapi (==0.30.1)
   1: fact: fastapi (0.30.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.30.0) depends on pydantic (0.28)
   1: derived: not fastapi (==0.30.0)
   1: fact: fastapi (0.29.1) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.29.1) depends on pydantic (0.26)
   1: derived: not fastapi (==0.29.1)
   1: fact: fastapi (0.29.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.29.0) depends on pydantic (0.26)
   1: derived: not fastapi (==0.29.0)
   1: fact: fastapi (0.28.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.28.0) depends on pydantic (0.26)
   1: derived: not fastapi (==0.28.0)
   1: fact: fastapi (0.27.2) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.27.2) depends on pydantic (0.26)
   1: derived: not fastapi (==0.27.2)
   1: fact: fastapi (0.27.1) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.27.1) depends on pydantic (0.26)
   1: derived: not fastapi (==0.27.1)
   1: fact: fastapi (0.27.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.27.0) depends on pydantic (0.26)
   1: derived: not fastapi (==0.27.0)
   1: fact: fastapi (0.26.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.26.0) depends on pydantic (>=0.17,<=0.26.0)
   1: derived: not fastapi (==0.26.0)
   1: fact: fastapi (0.25.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.25.0) depends on pydantic (>=0.17,<=0.26.0)
   1: derived: not fastapi (==0.25.0)
   1: fact: fastapi (0.24.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.24.0) depends on pydantic (>=0.17,<=0.26.0)
   1: derived: not fastapi (==0.24.0)
   1: fact: fastapi (0.23.0) depends on starlette (>=0.11.1,<=0.12.0)
   1: fact: fastapi (0.23.0) depends on pydantic (>=0.17,<=0.25.0)
   1: derived: not fastapi (==0.23.0)
   1: fact: fastapi (0.22.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.22.0) depends on pydantic (>=0.17,<=0.25.0)
   1: derived: not fastapi (==0.22.0)
   1: fact: fastapi (0.21.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.21.0) depends on pydantic (>=0.17,<=0.25.0)
   1: derived: not fastapi (==0.21.0)
   1: fact: fastapi (0.20.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.20.1) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.20.1)
   1: fact: fastapi (0.20.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.20.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.20.0)
   1: fact: fastapi (0.19.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.19.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.19.0)
   1: fact: fastapi (0.18.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.18.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.18.0)
   1: fact: fastapi (0.17.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.17.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.17.0)
   1: fact: fastapi (0.16.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.16.0) depends on pydantic (>=0.17,<=0.23.0)
   1: derived: not fastapi (==0.16.0)
   1: fact: fastapi (0.15.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.15.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.15.0)
   1: fact: fastapi (0.14.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.14.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.14.0)
   1: fact: fastapi (0.13.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.13.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.13.0)
   1: fact: fastapi (0.12.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.12.1) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.12.1)
   1: fact: fastapi (0.12.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.12.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.12.0)
   1: fact: fastapi (0.11.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.11.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.11.0)
   1: fact: fastapi (0.10.2) depends on starlette (0.11.1)
   1: fact: fastapi (0.10.2) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.10.2)
   1: fact: fastapi (0.10.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.10.1) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.10.1)
   1: fact: fastapi (0.10.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.10.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.10.0)
   1: fact: fastapi (0.9.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.9.1) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.9.1)
   1: fact: fastapi (0.9.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.9.0) depends on pydantic (>=0.17,<=0.21.0)
   1: derived: not fastapi (==0.9.0)
   1: fact: fastapi (0.8.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.8.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.8.0)
   1: fact: fastapi (0.7.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.7.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.7.1)
   1: fact: fastapi (0.7.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.7.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.7.0)
   1: fact: fastapi (0.6.4) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.4) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.4)
   1: fact: fastapi (0.6.3) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.3) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.3)
   1: fact: fastapi (0.6.2) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.2) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.2)
   1: fact: fastapi (0.6.1) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.1)
   1: fact: fastapi (0.6.0) depends on starlette (0.11.1)
   1: fact: fastapi (0.6.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.6.0)
   1: fact: fastapi (0.5.1) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.5.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.5.1)
   1: fact: fastapi (0.5.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.5.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.5.0)
   1: fact: fastapi (0.4.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.4.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.4.0)
   1: fact: fastapi (0.3.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.3.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.3.0)
   1: fact: fastapi (0.2.1) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.2.1) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.2.1)
   1: fact: fastapi (0.2.0) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.2.0) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.2.0)
   1: fact: fastapi (0.1.19) depends on starlette (>=0.9.11,<=0.10.1)
   1: fact: fastapi (0.1.19) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.1.19)
   1: fact: fastapi (0.1.18) depends on starlette (>=0.9.7,<0.9.11)
   1: fact: fastapi (0.1.18) depends on pydantic (>=0.17,<=0.18.2)
   1: derived: not fastapi (==0.1.18)
   1: fact: fastapi (0.1.17) depends on starlette (>=0.9.7)
   1: fact: fastapi (0.1.17) depends on pydantic (>=0.17)
   1: selecting fastapi (0.1.17)

i.e. poetry selects starlette 0.21.0, which is only allowed by fastapi version 0.1.17 which has an unpinned range for starlette.