Skip to content

Conversation

@chaen
Copy link
Contributor

@chaen chaen commented Mar 27, 2024

I've bumped into the exact same issue as fastapi/typer#598 so I solved it like fastapi/typer#721 😄

I'll try to add tests soon but if you can do it faster, please feel free !!

@chaen
Copy link
Contributor Author

chaen commented Mar 27, 2024

So frankly, I am not sure which one of the multiple options my issue is, maybe even a mixture of all of that:

So I am not even sure that this fix is correct, but it definitely fixes my issues.
I took the tests reported in 2 of the issues, added them as unit tests, and it fixes it. But again, I am not completely sure this is correct :-)

@tiangolo tiangolo added bug Something isn't working p2 labels Apr 2, 2024
@chaen
Copy link
Contributor Author

chaen commented May 8, 2024

hi @tiangolo I checked the #10370 roadmap but it isn't entirely clear to me the timescale we are talking about for that PR or all those marked p2 ? Let me know if there's anything I still need to do here :-)

@svlandeg
Copy link
Member

svlandeg commented Aug 23, 2024

Thanks for the PR, @chaen! It's also really helpful to provide pointers to related topics 🙏
We'll get this updated and reviewed.

@svlandeg svlandeg changed the title Fix evaluating stringified annotations in Python 3.10 🐛 Fix evaluating stringified annotations in Python 3.10 Aug 23, 2024
@svlandeg svlandeg self-assigned this Aug 23, 2024
@svlandeg svlandeg marked this pull request as draft August 23, 2024 14:46
Copy link
Member

@svlandeg svlandeg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again for your contribution!

I can confirm that these tests fail on master with Python 3.10 and are fixed with this PR. The fix is indeed the same as what we had in fastapi/typer#721 😎

@svlandeg svlandeg marked this pull request as ready for review August 23, 2024 14:58
@svlandeg svlandeg removed their assignment Aug 23, 2024
@memben
Copy link

memben commented May 18, 2025

In case anyone else stumbles across this issue before this PR is merged, you can fix it by adding in the meantime:

__globals__ = globals()

@github-actions github-actions bot added the conflicts Automatically generated when a PR has a merge conflict label Dec 2, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Dec 2, 2025

This pull request has a merge conflict that needs to be resolved.

@github-actions github-actions bot removed the conflicts Automatically generated when a PR has a merge conflict label Dec 3, 2025
Copy link
Member

@tiangolo tiangolo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @chaen! 🚀

I removed the test that was already passing in master and refactored it a bit, it's ready now. 🎉

This will be available in FastAPI 0.123.7 🍰

@tiangolo tiangolo merged commit 861598b into fastapi:master Dec 4, 2025
31 checks passed
@chaen
Copy link
Contributor Author

chaen commented Dec 4, 2025

Thanks a lot ! :-)

Out of curiosity, from the project management perspective, you removed the tests that were already passing in master because you already have equivalent tests somewhere else, or do you just have a different way of ensuring there's no regression ? :-)

@tirkarthi

This comment was marked as resolved.

@tfranzel
Copy link

tfranzel commented Dec 4, 2025

This just broke us too in version0.123.7. python==3.13.9. I now get a NameError for what has been working fine for quite some time.

issue goes through

  File "[SNIP]/lib/python3.13/site-packages/fastapi/dependencies/utils.py", line 259, in get_dependant
    endpoint_signature = get_typed_signature(call)
  File "[SNIP]/lib/python3.13/site-packages/fastapi/dependencies/utils.py", line 196, in get_typed_signature
    signature = inspect.signature(call, eval_str=True)

@YuriiMotov
Copy link
Member

@tfranzel, do you have an MRE for your case?

The issue reported in previous comment was resolved by removing if TYPE_CHECKING: (see apache/airflow#58983 (comment))

Comment on lines +195 to +198
if sys.version_info >= (3, 10):
signature = inspect.signature(call, eval_str=True)
else:
signature = inspect.signature(call)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change makes jupyverse crash with:

NameError: name 'NoAuthStrategy' is not defined

Which doesn't make sense to me, because NoAuthStrategy is defined here and used in the same file.
There is also fastapi-users involved, so I'm pinging @frankie567 here but I don't think there's anything wrong there.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please share the full stacktrace and a reproducer script and how to run it?

Copy link
Contributor

@davidbrochart davidbrochart Dec 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, you can reproduce with:

pip install jupyverse[jupyterlab,auth]
jupyverse

And the stack trace is:

Details
(tmp-jupyverse) david@david-laptop:~/tmp/jupyverse$ jupyverse --port 8001
2025-12-05 15:54:37 [info     ] Server running                 [jupyverse_api.main] url='http://127.0.0.1:8001?token=b90daa5d2e624196861bc6f9d430ddd4'
^C(tmp-jupyverse) david@david-laptop:~/tmp/jupyverse$ nvim /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/dependencies/utils.py
(tmp-jupyverse) david@david-laptop:~/tmp/jupyverse$ jupyverse --port 8001
2025-12-05 15:54:50 [critical ] Module failed while preparing  [fps._module] path=jupyverse.auth
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.terminals value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.jupyterlab value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.kernels value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.contents value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.yjs value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.lab value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Module could not get value     [fps._module] path=jupyverse.nbconvert value_type=<class 'jupyverse_api.auth.Auth'>
2025-12-05 15:54:52 [critical ] Application failed             [fps._module]
2025-12-05 15:54:52 [critical ] Exception                      [fps._module]
╭──────────────────────────────────────────────────────────────────── Traceback (most recent call last) ────────────────────────────────────────────────────────────────────╮
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps/_module.py:497 in _prepare_and_done                                                    │
│                                                                                                                                                                           │
│   494 │   │   │   log.critical("Module failed while preparing", path=self.path)                ╭────────────────────────── locals ──────────────────────────╮             │
│   495 │                                                                                        │ self = <fps_auth.main.AuthModule object at 0x7c1ae146a900> │             │
│   496 │   async def _prepare_and_done(self) -> None:                                           ╰────────────────────────────────────────────────────────────╯             │
│ ❱ 497 │   │   await self.prepare()                                                                                                                                        │
│   498 │   │   if not self._prepared.is_set():                                                                                                                             │
│   499 │   │   │   self.done()                                                                                                                                             │
│   500                                                                                                                                                                     │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps_auth/main.py:26 in prepare                                                             │
│                                                                                                                                                                           │
│   23 │   │   app = await self.get(App)                                                        ╭─────────────────────────────── locals ────────────────────────────────╮   │
│   24 │   │   frontend_config = await self.get(FrontendConfig)                                 │             app = <jupyverse_api.app.App object at 0x7c1ae1155fd0>    │   │
│   25 │   │                                                                                    │ frontend_config = FrontendConfig(base_url='/', collaborative=False)   │   │
│ ❱ 26 │   │   auth = auth_factory(app, self.config, frontend_config)                           │            self = <fps_auth.main.AuthModule object at 0x7c1ae146a900> │   │
│   27 │   │   self.put(auth, Auth)                                                             ╰───────────────────────────────────────────────────────────────────────╯   │
│   28 │   │                                                                                                                                                                │
│   29 │   │   await auth.db.create_db_and_tables()                                                                                                                         │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps_auth/routes.py:165 in auth_factory                                                     │
│                                                                                                                                                                           │
│   162 │   │   ) -> Callable[[Any], Awaitable[tuple[Any, dict[str, list[str]] | None] | None]]:                                                                            │
│   163 │   │   │   return backend.websocket_auth(permissions)                                                                                                              │
│   164 │                                                                                                                                                                   │
│ ❱ 165 │   return _Auth()                                                                                                                                                  │
│   166                                                                                                                                                                     │
│   167                                                                                                                                                                     │
│   168 # From https://en.wikipedia.org/wiki/Moons_of_Jupiter                                                                                                               │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │             app = <jupyverse_api.app.App object at 0x7c1ae1155fd0>                                                                                                    │ │
│ │     auth_config = _AuthConfig(                                                                                                                                        │ │
│ │                   │   client_id='',                                                                                                                                   │ │
│ │                   │   client_secret='',                                                                                                                               │ │
│ │                   │   redirect_uri='',                                                                                                                                │ │
│ │                   │   mode='token',                                                                                                                                   │ │
│ │                   │   token='65e5df05003e46bc99e2eadbc010b1a8',                                                                                                       │ │
│ │                   │   global_email='guest@jupyter.com',                                                                                                               │ │
│ │                   │   cookie_secure=False,                                                                                                                            │ │
│ │                   │   clear_users=False,                                                                                                                              │ │
│ │                   │   test=False,                                                                                                                                     │ │
│ │                   │   login_url='/login',                                                                                                                             │ │
│ │                   │   directory=None                                                                                                                                  │ │
│ │                   )                                                                                                                                                   │ │
│ │         backend = Res(                                                                                                                                                │ │
│ │                   │   cookie_authentication=<fastapi_users.authentication.backend.AuthenticationBackend object at 0x7c1adfedd590>,                                    │ │
│ │                   │   current_user=<function get_backend.<locals>.current_user at 0x7c1adff26090>,                                                                    │ │
│ │                   │   update_user=<function get_backend.<locals>.update_user at 0x7c1adff26560>,                                                                      │ │
│ │                   │   fapi_users=<fastapi_users.fastapi_users.FastAPIUsers object at 0x7c1adff023c0>,                                                                 │ │
│ │                   │   get_user_manager=<function get_backend.<locals>.get_user_manager at 0x7c1adff25dd0>,                                                            │ │
│ │                   │   github_authentication=<httpx_oauth.clients.github.GitHubOAuth2 object at 0x7c1adff02270>,                                                       │ │
│ │                   │   github_cookie_authentication=<fastapi_users.authentication.backend.AuthenticationBackend object at 0x7c1adfedd810>,                             │ │
│ │                   │   websocket_auth=<function get_backend.<locals>.websocket_auth at 0x7c1adff261f0>                                                                 │ │
│ │                   )                                                                                                                                                   │ │
│ │              db = Res(                                                                                                                                                │ │
│ │                   │   User=<class 'fps_auth.db.User'>,                                                                                                                │ │
│ │                   │   async_session_maker=async_sessionmaker(class_='AsyncSession', bind=<sqlalchemy.ext.asyncio.engine.AsyncEngine object at 0x7c1adff214d0>,        │ │
│ │                   autoflush=True, expire_on_commit=False),                                                                                                            │ │
│ │                   │   create_db_and_tables=<function get_db.<locals>.create_db_and_tables at 0x7c1adff24b40>,                                                         │ │
│ │                   │   get_async_session=<function get_db.<locals>.get_async_session at 0x7c1adff24ca0>,                                                               │ │
│ │                   │   get_user_db=<function get_db.<locals>.get_user_db at 0x7c1adff24e00>,                                                                           │ │
│ │                   │   secret='72df0bef4aba73844e13fcce9f548f03df737972778bf9889e754201bd395e72'                                                                       │ │
│ │                   )                                                                                                                                                   │ │
│ │ frontend_config = FrontendConfig(base_url='/', collaborative=False)                                                                                                   │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps_auth/routes.py:62 in __init__                                                          │
│                                                                                                                                                                           │
│    59 │   │   │                                                                                                                                                           │
│    60 │   │   │   router = APIRouter()                                                                                                                                    │
│    61 │   │   │                                                                                                                                                           │
│ ❱  62 │   │   │   @router.get("/auth/users")                                                                                                                              │
│    63 │   │   │   async def get_users(                                                                                                                                    │
│    64 │   │   │   │   user: UserRead = Depends(backend.current_user(permissions={"admin":                                                                                 │
│       ["read"]})),                                                                                                                                                        │
│    65 │   │   │   ):                                                                                                                                                      │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │     app = <jupyverse_api.app.App object at 0x7c1ae1155fd0>                                                                                                            │ │
│ │ backend = Res(                                                                                                                                                        │ │
│ │           │   cookie_authentication=<fastapi_users.authentication.backend.AuthenticationBackend object at 0x7c1adfedd590>,                                            │ │
│ │           │   current_user=<function get_backend.<locals>.current_user at 0x7c1adff26090>,                                                                            │ │
│ │           │   update_user=<function get_backend.<locals>.update_user at 0x7c1adff26560>,                                                                              │ │
│ │           │   fapi_users=<fastapi_users.fastapi_users.FastAPIUsers object at 0x7c1adff023c0>,                                                                         │ │
│ │           │   get_user_manager=<function get_backend.<locals>.get_user_manager at 0x7c1adff25dd0>,                                                                    │ │
│ │           │   github_authentication=<httpx_oauth.clients.github.GitHubOAuth2 object at 0x7c1adff02270>,                                                               │ │
│ │           │   github_cookie_authentication=<fastapi_users.authentication.backend.AuthenticationBackend object at 0x7c1adfedd810>,                                     │ │
│ │           │   websocket_auth=<function get_backend.<locals>.websocket_auth at 0x7c1adff261f0>                                                                         │ │
│ │           )                                                                                                                                                           │ │
│ │      db = Res(                                                                                                                                                        │ │
│ │           │   User=<class 'fps_auth.db.User'>,                                                                                                                        │ │
│ │           │   async_session_maker=async_sessionmaker(class_='AsyncSession', bind=<sqlalchemy.ext.asyncio.engine.AsyncEngine object at 0x7c1adff214d0>,                │ │
│ │           autoflush=True, expire_on_commit=False),                                                                                                                    │ │
│ │           │   create_db_and_tables=<function get_db.<locals>.create_db_and_tables at 0x7c1adff24b40>,                                                                 │ │
│ │           │   get_async_session=<function get_db.<locals>.get_async_session at 0x7c1adff24ca0>,                                                                       │ │
│ │           │   get_user_db=<function get_db.<locals>.get_user_db at 0x7c1adff24e00>,                                                                                   │ │
│ │           │   secret='72df0bef4aba73844e13fcce9f548f03df737972778bf9889e754201bd395e72'                                                                               │ │
│ │           )                                                                                                                                                           │ │
│ │  router = <fastapi.routing.APIRouter object at 0x7c1adff28180>                                                                                                        │ │
│ │    self = <fps_auth.routes.auth_factory.<locals>._Auth object at 0x7c1adff027b0>                                                                                      │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/routing.py:1072 in decorator                                                       │
│                                                                                                                                                                           │
│   1069 │   │   ),                                                                                                                                                         │
│   1070 │   ) -> Callable[[DecoratedCallable], DecoratedCallable]:                                                                                                         │
│   1071 │   │   def decorator(func: DecoratedCallable) -> DecoratedCallable:                                                                                               │
│ ❱ 1072 │   │   │   self.add_api_route(                                                                                                                                    │
│   1073 │   │   │   │   path,                                                                                                                                              │
│   1074 │   │   │   │   func,                                                                                                                                              │
│   1075 │   │   │   │   response_model=response_model,                                                                                                                     │
│                                                                                                                                                                           │
│ ╭──────────────────────────────────────────────── locals ────────────────────────────────────────────────╮                                                                │
│ │                       callbacks = None                                                                 │                                                                │
│ │                    dependencies = None                                                                 │                                                                │
│ │                      deprecated = None                                                                 │                                                                │
│ │                     description = None                                                                 │                                                                │
│ │     generate_unique_id_function = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfd10> │                                                                │
│ │               include_in_schema = True                                                                 │                                                                │
│ │                         methods = ['GET']                                                              │                                                                │
│ │                            name = None                                                                 │                                                                │
│ │                   openapi_extra = None                                                                 │                                                                │
│ │                    operation_id = None                                                                 │                                                                │
│ │                            path = '/auth/users'                                                        │                                                                │
│ │                  response_class = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfa10> │                                                                │
│ │            response_description = 'Successful Response'                                                │                                                                │
│ │                  response_model = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae4fa5090> │                                                                │
│ │         response_model_by_alias = True                                                                 │                                                                │
│ │          response_model_exclude = None                                                                 │                                                                │
│ │ response_model_exclude_defaults = False                                                                │                                                                │
│ │     response_model_exclude_none = False                                                                │                                                                │
│ │    response_model_exclude_unset = False                                                                │                                                                │
│ │          response_model_include = None                                                                 │                                                                │
│ │                       responses = None                                                                 │                                                                │
│ │                            self = <fastapi.routing.APIRouter object at 0x7c1adff28180>                 │                                                                │
│ │                     status_code = None                                                                 │                                                                │
│ │                         summary = None                                                                 │                                                                │
│ │                            tags = None                                                                 │                                                                │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯                                                                │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/routing.py:1011 in add_api_route                                                   │
│                                                                                                                                                                           │
│   1008 │   │   current_generate_unique_id = get_value_or_default(                                                                                                         │
│   1009 │   │   │   generate_unique_id_function, self.generate_unique_id_function                                                                                          │
│   1010 │   │   )                                                                                                                                                          │
│ ❱ 1011 │   │   route = route_class(                                                                                                                                       │
│   1012 │   │   │   self.prefix + path,                                                                                                                                    │
│   1013 │   │   │   endpoint=endpoint,                                                                                                                                     │
│   1014 │   │   │   response_model=response_model,                                                                                                                         │
│                                                                                                                                                                           │
│ ╭──────────────────────────────────────────────── locals ────────────────────────────────────────────────╮                                                                │
│ │                       callbacks = None                                                                 │                                                                │
│ │              combined_responses = {}                                                                   │                                                                │
│ │               current_callbacks = []                                                                   │                                                                │
│ │            current_dependencies = []                                                                   │                                                                │
│ │      current_generate_unique_id = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfd10> │                                                                │
│ │          current_response_class = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfa10> │                                                                │
│ │                    current_tags = []                                                                   │                                                                │
│ │                    dependencies = None                                                                 │                                                                │
│ │                      deprecated = None                                                                 │                                                                │
│ │                     description = None                                                                 │                                                                │
│ │     generate_unique_id_function = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfd10> │                                                                │
│ │               include_in_schema = True                                                                 │                                                                │
│ │                         methods = ['GET']                                                              │                                                                │
│ │                            name = None                                                                 │                                                                │
│ │                   openapi_extra = None                                                                 │                                                                │
│ │                    operation_id = None                                                                 │                                                                │
│ │                            path = '/auth/users'                                                        │                                                                │
│ │                  response_class = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfa10> │                                                                │
│ │            response_description = 'Successful Response'                                                │                                                                │
│ │                  response_model = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae4fa5090> │                                                                │
│ │         response_model_by_alias = True                                                                 │                                                                │
│ │          response_model_exclude = None                                                                 │                                                                │
│ │ response_model_exclude_defaults = False                                                                │                                                                │
│ │     response_model_exclude_none = False                                                                │                                                                │
│ │    response_model_exclude_unset = False                                                                │                                                                │
│ │          response_model_include = None                                                                 │                                                                │
│ │                       responses = {}                                                                   │                                                                │
│ │            route_class_override = None                                                                 │                                                                │
│ │                            self = <fastapi.routing.APIRouter object at 0x7c1adff28180>                 │                                                                │
│ │                     status_code = None                                                                 │                                                                │
│ │                         summary = None                                                                 │                                                                │
│ │                            tags = None                                                                 │                                                                │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯                                                                │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/routing.py:630 in __init__                                                         │
│                                                                                                                                                                           │
│    627 │   │   │   self.response_fields = {}                                                                                                                              │
│    628 │   │                                                                                                                                                              │
│    629 │   │   assert callable(endpoint), "An endpoint must be a callable"                                                                                                │
│ ❱  630 │   │   self.dependant = get_dependant(                                                                                                                            │
│    631 │   │   │   path=self.path_format, call=self.endpoint, scope="function"                                                                                            │
│    632 │   │   )                                                                                                                                                          │
│    633 │   │   for depends in self.dependencies[::-1]:                                                                                                                    │
│                                                                                                                                                                           │
│ ╭──────────────────────────────────────────────── locals ────────────────────────────────────────────────╮                                                                │
│ │                       callbacks = []                                                                   │                                                                │
│ │                    dependencies = []                                                                   │                                                                │
│ │   dependency_overrides_provider = None                                                                 │                                                                │
│ │                      deprecated = None                                                                 │                                                                │
│ │                     description = None                                                                 │                                                                │
│ │     generate_unique_id_function = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfd10> │                                                                │
│ │               include_in_schema = True                                                                 │                                                                │
│ │                         methods = ['GET']                                                              │                                                                │
│ │                            name = None                                                                 │                                                                │
│ │                   openapi_extra = None                                                                 │                                                                │
│ │                    operation_id = None                                                                 │                                                                │
│ │                            path = '/auth/users'                                                        │                                                                │
│ │                  response_class = <fastapi.datastructures.DefaultPlaceholder object at 0x7c1ae52cfa10> │                                                                │
│ │            response_description = 'Successful Response'                                                │                                                                │
│ │                 response_fields = {}                                                                   │                                                                │
│ │                  response_model = None                                                                 │                                                                │
│ │         response_model_by_alias = True                                                                 │                                                                │
│ │          response_model_exclude = None                                                                 │                                                                │
│ │ response_model_exclude_defaults = False                                                                │                                                                │
│ │     response_model_exclude_none = False                                                                │                                                                │
│ │    response_model_exclude_unset = False                                                                │                                                                │
│ │          response_model_include = None                                                                 │                                                                │
│ │                       responses = {}                                                                   │                                                                │
│ │               return_annotation = None                                                                 │                                                                │
│ │                            self = APIRoute(path='/auth/users', name='get_users', methods=['GET'])      │                                                                │
│ │                     status_code = None                                                                 │                                                                │
│ │                         summary = None                                                                 │                                                                │
│ │                            tags = []                                                                   │                                                                │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯                                                                │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/dependencies/utils.py:290 in get_dependant                                         │
│                                                                                                                                                                           │
│    287 │   │   │   if isinstance(param_details.depends, params.Security):                                                                                                 │
│    288 │   │   │   │   if param_details.depends.scopes:                                                                                                                   │
│    289 │   │   │   │   │   sub_own_oauth_scopes = list(param_details.depends.scopes)                                                                                      │
│ ❱  290 │   │   │   sub_dependant = get_dependant(                                                                                                                         │
│    291 │   │   │   │   path=path,                                                                                                                                         │
│    292 │   │   │   │   call=param_details.depends.dependency,                                                                                                             │
│    293 │   │   │   │   name=param_name,                                                                                                                                   │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │       current_scopes = []                                                                                                                                             │ │
│ │            dependant = Dependant(                                                                                                                                     │ │
│ │                        │   path_params=[],                                                                                                                            │ │
│ │                        │   query_params=[],                                                                                                                           │ │
│ │                        │   header_params=[],                                                                                                                          │ │
│ │                        │   cookie_params=[],                                                                                                                          │ │
│ │                        │   body_params=[],                                                                                                                            │ │
│ │                        │   dependencies=[],                                                                                                                           │ │
│ │                        │   security_requirements=[],                                                                                                                  │ │
│ │                        │   name=None,                                                                                                                                 │ │
│ │                        │   call=<function auth_factory.<locals>._Auth.__init__.<locals>.get_users at 0x7c1adff278a0>,                                                 │ │
│ │                        │   request_param_name=None,                                                                                                                   │ │
│ │                        │   websocket_param_name=None,                                                                                                                 │ │
│ │                        │   http_connection_param_name=None,                                                                                                           │ │
│ │                        │   response_param_name=None,                                                                                                                  │ │
│ │                        │   background_tasks_param_name=None,                                                                                                          │ │
│ │                        │   security_scopes_param_name=None,                                                                                                           │ │
│ │                        │   own_oauth_scopes=None,                                                                                                                     │ │
│ │                        │   parent_oauth_scopes=None,                                                                                                                  │ │
│ │                        │   use_cache=True,                                                                                                                            │ │
│ │                        │   path='/auth/users',                                                                                                                        │ │
│ │                        │   scope='function'                                                                                                                           │ │
│ │                        )                                                                                                                                              │ │
│ │   endpoint_signature = <Signature (user: fps_auth.models.UserRead = Depends(dependency=<function get_backend.<locals>.current_user.<locals>._ at 0x7c1adff27950>,     │ │
│ │                        use_cache=True, scope=None))>                                                                                                                  │ │
│ │        is_path_param = False                                                                                                                                          │ │
│ │                 name = None                                                                                                                                           │ │
│ │     own_oauth_scopes = None                                                                                                                                           │ │
│ │                param = <Parameter "user: fps_auth.models.UserRead = Depends(dependency=<function get_backend.<locals>.current_user.<locals>._ at 0x7c1adff27950>,     │ │
│ │                        use_cache=True, scope=None)">                                                                                                                  │ │
│ │        param_details = ParamDetails(                                                                                                                                  │ │
│ │                        │   type_annotation=<class 'fps_auth.models.UserRead'>,                                                                                        │ │
│ │                        │   depends=Depends(dependency=<function get_backend.<locals>.current_user.<locals>._ at 0x7c1adff27950>, use_cache=True, scope=None),         │ │
│ │                        │   field=None                                                                                                                                 │ │
│ │                        )                                                                                                                                              │ │
│ │           param_name = 'user'                                                                                                                                         │ │
│ │  parent_oauth_scopes = None                                                                                                                                           │ │
│ │                 path = '/auth/users'                                                                                                                                  │ │
│ │     path_param_names = set()                                                                                                                                          │ │
│ │                scope = 'function'                                                                                                                                     │ │
│ │     signature_params = mappingproxy({                                                                                                                                 │ │
│ │                        │   'user': <Parameter "user: fps_auth.models.UserRead = Depends(dependency=<function get_backend.<locals>.current_user.<locals>._ at          │ │
│ │                        0x7c1adff27950>, use_cache=True, scope=None)">                                                                                                 │ │
│ │                        })                                                                                                                                             │ │
│ │ sub_own_oauth_scopes = []                                                                                                                                             │ │
│ │            use_cache = True                                                                                                                                           │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/dependencies/utils.py:290 in get_dependant                                         │
│                                                                                                                                                                           │
│    287 │   │   │   if isinstance(param_details.depends, params.Security):                                                                                                 │
│    288 │   │   │   │   if param_details.depends.scopes:                                                                                                                   │
│    289 │   │   │   │   │   sub_own_oauth_scopes = list(param_details.depends.scopes)                                                                                      │
│ ❱  290 │   │   │   sub_dependant = get_dependant(                                                                                                                         │
│    291 │   │   │   │   path=path,                                                                                                                                         │
│    292 │   │   │   │   call=param_details.depends.dependency,                                                                                                             │
│    293 │   │   │   │   name=param_name,                                                                                                                                   │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │       current_scopes = []                                                                                                                                             │ │
│ │            dependant = Dependant(                                                                                                                                     │ │
│ │                        │   path_params=[],                                                                                                                            │ │
│ │                        │   query_params=[                                                                                                                             │ │
│ │                        │   │   ModelField(                                                                                                                            │ │
│ │                        │   │   │   field_info=Query(annotation=Union[str, NoneType], required=False, default=None, alias='token', json_schema_extra={}),              │ │
│ │                        │   │   │   name='token',                                                                                                                      │ │
│ │                        │   │   │   mode='validation'                                                                                                                  │ │
│ │                        │   │   )                                                                                                                                      │ │
│ │                        │   ],                                                                                                                                         │ │
│ │                        │   header_params=[],                                                                                                                          │ │
│ │                        │   cookie_params=[],                                                                                                                          │ │
│ │                        │   body_params=[],                                                                                                                            │ │
│ │                        │   dependencies=[],                                                                                                                           │ │
│ │                        │   security_requirements=[],                                                                                                                  │ │
│ │                        │   name='user',                                                                                                                               │ │
│ │                        │   call=<function get_backend.<locals>.current_user.<locals>._ at 0x7c1adff27950>,                                                            │ │
│ │                        │   request_param_name=None,                                                                                                                   │ │
│ │                        │   websocket_param_name=None,                                                                                                                 │ │
│ │                        │   http_connection_param_name=None,                                                                                                           │ │
│ │                        │   response_param_name='response',                                                                                                            │ │
│ │                        │   background_tasks_param_name=None,                                                                                                          │ │
│ │                        │   security_scopes_param_name=None,                                                                                                           │ │
│ │                        │   own_oauth_scopes=[],                                                                                                                       │ │
│ │                        │   parent_oauth_scopes=[],                                                                                                                    │ │
│ │                        │   use_cache=True,                                                                                                                            │ │
│ │                        │   path='/auth/users',                                                                                                                        │ │
│ │                        │   scope=None                                                                                                                                 │ │
│ │                        )                                                                                                                                              │ │
│ │   endpoint_signature = <Signature (response: starlette.responses.Response, token: str | None = None, user: fps_auth.db.User | None = Depends(dependency=<function     │ │
│ │                        Authenticator.current_user.<locals>.current_user_dependency at 0x7c1adff27a00>, use_cache=True, scope=None), user_manager:                     │ │
│ │                        fastapi_users.manager.BaseUserManager[fps_auth.db.User, ~ID] = Depends(dependency=<function get_backend.<locals>.get_user_manager at           │ │
│ │                        0x7c1adff25dd0>, use_cache=True, scope=None))>                                                                                                 │ │
│ │        is_path_param = False                                                                                                                                          │ │
│ │                 name = 'user'                                                                                                                                         │ │
│ │     own_oauth_scopes = []                                                                                                                                             │ │
│ │                param = <Parameter "user: fps_auth.db.User | None = Depends(dependency=<function Authenticator.current_user.<locals>.current_user_dependency at        │ │
│ │                        0x7c1adff27a00>, use_cache=True, scope=None)">                                                                                                 │ │
│ │        param_details = ParamDetails(                                                                                                                                  │ │
│ │                        │   type_annotation=fps_auth.db.User | None,                                                                                                   │ │
│ │                        │   depends=Depends(                                                                                                                           │ │
│ │                        │   │   dependency=<function Authenticator.current_user.<locals>.current_user_dependency at 0x7c1adff27a00>,                                   │ │
│ │                        │   │   use_cache=True,                                                                                                                        │ │
│ │                        │   │   scope=None                                                                                                                             │ │
│ │                        │   ),                                                                                                                                         │ │
│ │                        │   field=None                                                                                                                                 │ │
│ │                        )                                                                                                                                              │ │
│ │           param_name = 'user'                                                                                                                                         │ │
│ │  parent_oauth_scopes = []                                                                                                                                             │ │
│ │                 path = '/auth/users'                                                                                                                                  │ │
│ │     path_param_names = set()                                                                                                                                          │ │
│ │                scope = None                                                                                                                                           │ │
│ │     signature_params = mappingproxy({                                                                                                                                 │ │
│ │                        │   'response': <Parameter "response: starlette.responses.Response">,                                                                          │ │
│ │                        │   'token': <Parameter "token: str | None = None">,                                                                                           │ │
│ │                        │   'user': <Parameter "user: fps_auth.db.User | None = Depends(dependency=<function                                                           │ │
│ │                        Authenticator.current_user.<locals>.current_user_dependency at 0x7c1adff27a00>, use_cache=True, scope=None)">,                                 │ │
│ │                        │   'user_manager': <Parameter "user_manager: fastapi_users.manager.BaseUserManager[fps_auth.db.User, ~ID] = Depends(dependency=<function      │ │
│ │                        get_backend.<locals>.get_user_manager at 0x7c1adff25dd0>, use_cache=True, scope=None)">                                                        │ │
│ │                        })                                                                                                                                             │ │
│ │ sub_own_oauth_scopes = []                                                                                                                                             │ │
│ │            use_cache = True                                                                                                                                           │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/dependencies/utils.py:290 in get_dependant                                         │
│                                                                                                                                                                           │
│    287 │   │   │   if isinstance(param_details.depends, params.Security):                                                                                                 │
│    288 │   │   │   │   if param_details.depends.scopes:                                                                                                                   │
│    289 │   │   │   │   │   sub_own_oauth_scopes = list(param_details.depends.scopes)                                                                                      │
│ ❱  290 │   │   │   sub_dependant = get_dependant(                                                                                                                         │
│    291 │   │   │   │   path=path,                                                                                                                                         │
│    292 │   │   │   │   call=param_details.depends.dependency,                                                                                                             │
│    293 │   │   │   │   name=param_name,                                                                                                                                   │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │       current_scopes = []                                                                                                                                             │ │
│ │            dependant = Dependant(                                                                                                                                     │ │
│ │                        │   path_params=[],                                                                                                                            │ │
│ │                        │   query_params=[],                                                                                                                           │ │
│ │                        │   header_params=[],                                                                                                                          │ │
│ │                        │   cookie_params=[],                                                                                                                          │ │
│ │                        │   body_params=[],                                                                                                                            │ │
│ │                        │   dependencies=[                                                                                                                             │ │
│ │                        │   │   Dependant(                                                                                                                             │ │
│ │                        │   │   │   path_params=[],                                                                                                                    │ │
│ │                        │   │   │   query_params=[],                                                                                                                   │ │
│ │                        │   │   │   header_params=[],                                                                                                                  │ │
│ │                        │   │   │   cookie_params=[],                                                                                                                  │ │
│ │                        │   │   │   body_params=[],                                                                                                                    │ │
│ │                        │   │   │   dependencies=[                                                                                                                     │ │
│ │                        │   │   │   │   Dependant(                                                                                                                     │ │
│ │                        │   │   │   │   │   path_params=[],                                                                                                            │ │
│ │                        │   │   │   │   │   query_params=[],                                                                                                           │ │
│ │                        │   │   │   │   │   header_params=[],                                                                                                          │ │
│ │                        │   │   │   │   │   cookie_params=[],                                                                                                          │ │
│ │                        │   │   │   │   │   body_params=[],                                                                                                            │ │
│ │                        │   │   │   │   │   dependencies=[                                                                                                             │ │
│ │                        │   │   │   │   │   │   Dependant(                                                                                                             │ │
│ │                        │   │   │   │   │   │   │   path_params=[],                                                                                                    │ │
│ │                        │   │   │   │   │   │   │   query_params=[],                                                                                                   │ │
│ │                        │   │   │   │   │   │   │   header_params=[],                                                                                                  │ │
│ │                        │   │   │   │   │   │   │   cookie_params=[],                                                                                                  │ │
│ │                        │   │   │   │   │   │   │   body_params=[],                                                                                                    │ │
│ │                        │   │   │   │   │   │   │   dependencies=[],                                                                                                   │ │
│ │                        │   │   │   │   │   │   │   security_requirements=[],                                                                                          │ │
│ │                        │   │   │   │   │   │   │   name='session',                                                                                                    │ │
│ │                        │   │   │   │   │   │   │   call=<function get_db.<locals>.get_async_session at 0x7c1adff24ca0>,                                               │ │
│ │                        │   │   │   │   │   │   │   request_param_name=None,                                                                                           │ │
│ │                        │   │   │   │   │   │   │   websocket_param_name=None,                                                                                         │ │
│ │                        │   │   │   │   │   │   │   http_connection_param_name=None,                                                                                   │ │
│ │                        │   │   │   │   │   │   │   response_param_name=None,                                                                                          │ │
│ │                        │   │   │   │   │   │   │   background_tasks_param_name=None,                                                                                  │ │
│ │                        │   │   │   │   │   │   │   security_scopes_param_name=None,                                                                                   │ │
│ │                        │   │   │   │   │   │   │   own_oauth_scopes=[],                                                                                               │ │
│ │                        │   │   │   │   │   │   │   parent_oauth_scopes=[],                                                                                            │ │
│ │                        │   │   │   │   │   │   │   use_cache=True,                                                                                                    │ │
│ │                        │   │   │   │   │   │   │   path='/auth/users',                                                                                                │ │
│ │                        │   │   │   │   │   │   │   scope=None                                                                                                         │ │
│ │                        │   │   │   │   │   │   )                                                                                                                      │ │
│ │                        │   │   │   │   │   ],                                                                                                                         │ │
│ │                        │   │   │   │   │   security_requirements=[],                                                                                                  │ │
│ │                        │   │   │   │   │   name='user_db',                                                                                                            │ │
│ │                        │   │   │   │   │   call=<function get_db.<locals>.get_user_db at 0x7c1adff24e00>,                                                             │ │
│ │                        │   │   │   │   │   request_param_name=None,                                                                                                   │ │
│ │                        │   │   │   │   │   websocket_param_name=None,                                                                                                 │ │
│ │                        │   │   │   │   │   http_connection_param_name=None,                                                                                           │ │
│ │                        │   │   │   │   │   response_param_name=None,                                                                                                  │ │
│ │                        │   │   │   │   │   background_tasks_param_name=None,                                                                                          │ │
│ │                        │   │   │   │   │   security_scopes_param_name=None,                                                                                           │ │
│ │                        │   │   │   │   │   own_oauth_scopes=[],                                                                                                       │ │
│ │                        │   │   │   │   │   parent_oauth_scopes=[],                                                                                                    │ │
│ │                        │   │   │   │   │   use_cache=True,                                                                                                            │ │
│ │                        │   │   │   │   │   path='/auth/users',                                                                                                        │ │
│ │                        │   │   │   │   │   scope=None                                                                                                                 │ │
│ │                        │   │   │   │   )                                                                                                                              │ │
│ │                        │   │   │   ],                                                                                                                                 │ │
│ │                        │   │   │   security_requirements=[],                                                                                                          │ │
│ │                        │   │   │   name='user_manager',                                                                                                               │ │
│ │                        │   │   │   call=<function get_backend.<locals>.get_user_manager at 0x7c1adff25dd0>,                                                           │ │
│ │                        │   │   │   request_param_name=None,                                                                                                           │ │
│ │                        │   │   │   websocket_param_name=None,                                                                                                         │ │
│ │                        │   │   │   http_connection_param_name=None,                                                                                                   │ │
│ │                        │   │   │   response_param_name=None,                                                                                                          │ │
│ │                        │   │   │   background_tasks_param_name=None,                                                                                                  │ │
│ │                        │   │   │   security_scopes_param_name=None,                                                                                                   │ │
│ │                        │   │   │   own_oauth_scopes=[],                                                                                                               │ │
│ │                        │   │   │   parent_oauth_scopes=[],                                                                                                            │ │
│ │                        │   │   │   use_cache=True,                                                                                                                    │ │
│ │                        │   │   │   path='/auth/users',                                                                                                                │ │
│ │                        │   │   │   scope=None                                                                                                                         │ │
│ │                        │   │   ),                                                                                                                                     │ │
│ │                        │   │   Dependant(                                                                                                                             │ │
│ │                        │   │   │   path_params=[],                                                                                                                    │ │
│ │                        │   │   │   query_params=[],                                                                                                                   │ │
│ │                        │   │   │   header_params=[],                                                                                                                  │ │
│ │                        │   │   │   cookie_params=[],                                                                                                                  │ │
│ │                        │   │   │   body_params=[],                                                                                                                    │ │
│ │                        │   │   │   dependencies=[],                                                                                                                   │ │
│ │                        │   │   │   security_requirements=[],                                                                                                          │ │
│ │                        │   │   │   name='noauth',                                                                                                                     │ │
│ │                        │   │   │   call=<fps_auth.backends.get_backend.<locals>.NoAuthScheme object at 0x7c1adff01a90>,                                               │ │
│ │                        │   │   │   request_param_name=None,                                                                                                           │ │
│ │                        │   │   │   websocket_param_name=None,                                                                                                         │ │
│ │                        │   │   │   http_connection_param_name=None,                                                                                                   │ │
│ │                        │   │   │   response_param_name=None,                                                                                                          │ │
│ │                        │   │   │   background_tasks_param_name=None,                                                                                                  │ │
│ │                        │   │   │   security_scopes_param_name=None,                                                                                                   │ │
│ │                        │   │   │   own_oauth_scopes=[],                                                                                                               │ │
│ │                        │   │   │   parent_oauth_scopes=[],                                                                                                            │ │
│ │                        │   │   │   use_cache=True,                                                                                                                    │ │
│ │                        │   │   │   path='/auth/users',                                                                                                                │ │
│ │                        │   │   │   scope=None                                                                                                                         │ │
│ │                        │   │   )                                                                                                                                      │ │
│ │                        │   ],                                                                                                                                         │ │
│ │                        │   security_requirements=[],                                                                                                                  │ │
│ │                        │   name='user',                                                                                                                               │ │
│ │                        │   call=<function Authenticator.current_user.<locals>.current_user_dependency at 0x7c1adff27a00>,                                             │ │
│ │                        │   request_param_name=None,                                                                                                                   │ │
│ │                        │   websocket_param_name=None,                                                                                                                 │ │
│ │                        │   http_connection_param_name=None,                                                                                                           │ │
│ │                        │   response_param_name=None,                                                                                                                  │ │
│ │                        │   background_tasks_param_name=None,                                                                                                          │ │
│ │                        │   security_scopes_param_name=None,                                                                                                           │ │
│ │                        │   own_oauth_scopes=[],                                                                                                                       │ │
│ │                        │   parent_oauth_scopes=[],                                                                                                                    │ │
│ │                        │   use_cache=True,                                                                                                                            │ │
│ │                        │   path='/auth/users',                                                                                                                        │ │
│ │                        │   scope=None                                                                                                                                 │ │
│ │                        )                                                                                                                                              │ │
│ │   endpoint_signature = <Signature (user_manager=Depends(dependency=<function get_backend.<locals>.get_user_manager at 0x7c1adff25dd0>, use_cache=True, scope=None),   │ │
│ │                        noauth=Depends(dependency=<fps_auth.backends.get_backend.<locals>.NoAuthScheme object at 0x7c1adff01a90>, use_cache=True, scope=None),         │ │
│ │                        strategy_noauth=Depends(dependency=<function get_backend.<locals>.get_noauth_strategy at 0x7c1adff259b0>, use_cache=True, scope=None),         │ │
│ │                        cookie=Depends(dependency=<fastapi.security.api_key.APIKeyCookie object at 0x7c1adff01fd0>, use_cache=True, scope=None),                       │ │
│ │                        strategy_cookie=Depends(dependency=<function get_backend.<locals>.get_jwt_strategy at 0x7c1adff25b10>, use_cache=True, scope=None),            │ │
│ │                        github=Depends(dependency=<fastapi.security.api_key.APIKeyCookie object at 0x7c1adfedd6d0>, use_cache=True, scope=None),                       │ │
│ │                        strategy_github=Depends(dependency=<function get_backend.<locals>.get_jwt_strategy at 0x7c1adff25b10>, use_cache=True, scope=None),            │ │
│ │                        enabled_backends=Depends(dependency=<function get_backend.<locals>.get_enabled_backends at 0x7c1adff25e80>, use_cache=True, scope=None))>      │ │
│ │        is_path_param = False                                                                                                                                          │ │
│ │                 name = 'user'                                                                                                                                         │ │
│ │     own_oauth_scopes = []                                                                                                                                             │ │
│ │                param = <Parameter "strategy_noauth=Depends(dependency=<function get_backend.<locals>.get_noauth_strategy at 0x7c1adff259b0>, use_cache=True,          │ │
│ │                        scope=None)">                                                                                                                                  │ │
│ │        param_details = ParamDetails(                                                                                                                                  │ │
│ │                        │   type_annotation=typing.Any,                                                                                                                │ │
│ │                        │   depends=Depends(dependency=<function get_backend.<locals>.get_noauth_strategy at 0x7c1adff259b0>, use_cache=True, scope=None),             │ │
│ │                        │   field=None                                                                                                                                 │ │
│ │                        )                                                                                                                                              │ │
│ │           param_name = 'strategy_noauth'                                                                                                                              │ │
│ │  parent_oauth_scopes = []                                                                                                                                             │ │
│ │                 path = '/auth/users'                                                                                                                                  │ │
│ │     path_param_names = set()                                                                                                                                          │ │
│ │                scope = None                                                                                                                                           │ │
│ │     signature_params = mappingproxy({                                                                                                                                 │ │
│ │                        │   'user_manager': <Parameter "user_manager=Depends(dependency=<function get_backend.<locals>.get_user_manager at 0x7c1adff25dd0>,            │ │
│ │                        use_cache=True, scope=None)">,                                                                                                                 │ │
│ │                        │   'noauth': <Parameter "noauth=Depends(dependency=<fps_auth.backends.get_backend.<locals>.NoAuthScheme object at 0x7c1adff01a90>,            │ │
│ │                        use_cache=True, scope=None)">,                                                                                                                 │ │
│ │                        │   'strategy_noauth': <Parameter "strategy_noauth=Depends(dependency=<function get_backend.<locals>.get_noauth_strategy at 0x7c1adff259b0>,   │ │
│ │                        use_cache=True, scope=None)">,                                                                                                                 │ │
│ │                        │   'cookie': <Parameter "cookie=Depends(dependency=<fastapi.security.api_key.APIKeyCookie object at 0x7c1adff01fd0>, use_cache=True,          │ │
│ │                        scope=None)">,                                                                                                                                 │ │
│ │                        │   'strategy_cookie': <Parameter "strategy_cookie=Depends(dependency=<function get_backend.<locals>.get_jwt_strategy at 0x7c1adff25b10>,      │ │
│ │                        use_cache=True, scope=None)">,                                                                                                                 │ │
│ │                        │   'github': <Parameter "github=Depends(dependency=<fastapi.security.api_key.APIKeyCookie object at 0x7c1adfedd6d0>, use_cache=True,          │ │
│ │                        scope=None)">,                                                                                                                                 │ │
│ │                        │   'strategy_github': <Parameter "strategy_github=Depends(dependency=<function get_backend.<locals>.get_jwt_strategy at 0x7c1adff25b10>,      │ │
│ │                        use_cache=True, scope=None)">,                                                                                                                 │ │
│ │                        │   'enabled_backends': <Parameter "enabled_backends=Depends(dependency=<function get_backend.<locals>.get_enabled_backends at                 │ │
│ │                        0x7c1adff25e80>, use_cache=True, scope=None)">                                                                                                 │ │
│ │                        })                                                                                                                                             │ │
│ │        sub_dependant = Dependant(                                                                                                                                     │ │
│ │                        │   path_params=[],                                                                                                                            │ │
│ │                        │   query_params=[],                                                                                                                           │ │
│ │                        │   header_params=[],                                                                                                                          │ │
│ │                        │   cookie_params=[],                                                                                                                          │ │
│ │                        │   body_params=[],                                                                                                                            │ │
│ │                        │   dependencies=[],                                                                                                                           │ │
│ │                        │   security_requirements=[],                                                                                                                  │ │
│ │                        │   name='noauth',                                                                                                                             │ │
│ │                        │   call=<fps_auth.backends.get_backend.<locals>.NoAuthScheme object at 0x7c1adff01a90>,                                                       │ │
│ │                        │   request_param_name=None,                                                                                                                   │ │
│ │                        │   websocket_param_name=None,                                                                                                                 │ │
│ │                        │   http_connection_param_name=None,                                                                                                           │ │
│ │                        │   response_param_name=None,                                                                                                                  │ │
│ │                        │   background_tasks_param_name=None,                                                                                                          │ │
│ │                        │   security_scopes_param_name=None,                                                                                                           │ │
│ │                        │   own_oauth_scopes=[],                                                                                                                       │ │
│ │                        │   parent_oauth_scopes=[],                                                                                                                    │ │
│ │                        │   use_cache=True,                                                                                                                            │ │
│ │                        │   path='/auth/users',                                                                                                                        │ │
│ │                        │   scope=None                                                                                                                                 │ │
│ │                        )                                                                                                                                              │ │
│ │ sub_own_oauth_scopes = []                                                                                                                                             │ │
│ │            use_cache = True                                                                                                                                           │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/dependencies/utils.py:259 in get_dependant                                         │
│                                                                                                                                                                           │
│    256 │   )                                                                                                                                                              │
│    257 │   current_scopes = (parent_oauth_scopes or []) + (own_oauth_scopes or [])                                                                                        │
│    258 │   path_param_names = get_path_param_names(path)                                                                                                                  │
│ ❱  259 │   endpoint_signature = get_typed_signature(call)                                                                                                                 │
│    260 │   signature_params = endpoint_signature.parameters                                                                                                               │
│    261 │   if isinstance(call, SecurityBase):                                                                                                                             │
│    262 │   │   security_requirement = SecurityRequirement(                                                                                                                │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────── locals ────────────────────────────────────────────────╮                                                                 │
│ │      current_scopes = []                                                                              │                                                                 │
│ │           dependant = Dependant(                                                                      │                                                                 │
│ │                       │   path_params=[],                                                             │                                                                 │
│ │                       │   query_params=[],                                                            │                                                                 │
│ │                       │   header_params=[],                                                           │                                                                 │
│ │                       │   cookie_params=[],                                                           │                                                                 │
│ │                       │   body_params=[],                                                             │                                                                 │
│ │                       │   dependencies=[],                                                            │                                                                 │
│ │                       │   security_requirements=[],                                                   │                                                                 │
│ │                       │   name='strategy_noauth',                                                     │                                                                 │
│ │                       │   call=<function get_backend.<locals>.get_noauth_strategy at 0x7c1adff259b0>, │                                                                 │
│ │                       │   request_param_name=None,                                                    │                                                                 │
│ │                       │   websocket_param_name=None,                                                  │                                                                 │
│ │                       │   http_connection_param_name=None,                                            │                                                                 │
│ │                       │   response_param_name=None,                                                   │                                                                 │
│ │                       │   background_tasks_param_name=None,                                           │                                                                 │
│ │                       │   security_scopes_param_name=None,                                            │                                                                 │
│ │                       │   own_oauth_scopes=[],                                                        │                                                                 │
│ │                       │   parent_oauth_scopes=[],                                                     │                                                                 │
│ │                       │   use_cache=True,                                                             │                                                                 │
│ │                       │   path='/auth/users',                                                         │                                                                 │
│ │                       │   scope=None                                                                  │                                                                 │
│ │                       )                                                                               │                                                                 │
│ │                name = 'strategy_noauth'                                                               │                                                                 │
│ │    own_oauth_scopes = []                                                                              │                                                                 │
│ │ parent_oauth_scopes = []                                                                              │                                                                 │
│ │                path = '/auth/users'                                                                   │                                                                 │
│ │    path_param_names = set()                                                                           │                                                                 │
│ │               scope = None                                                                            │                                                                 │
│ │           use_cache = True                                                                            │                                                                 │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯                                                                 │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi/dependencies/utils.py:196 in get_typed_signature                                   │
│                                                                                                                                                                           │
│    193                                                                                                                                                                    │
│    194 def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature:                                                                                            │
│    195 │   if sys.version_info >= (3, 10):                                                                                                                                │
│ ❱  196 │   │   signature = inspect.signature(call, eval_str=True)                                                                                                         │
│    197 │   else:                                                                                                                                                          │
│    198 │   │   signature = inspect.signature(call)                                                                                                                        │
│    199 │   unwrapped = inspect.unwrap(call)                                                                                                                               │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/inspect.py:3321 in signature                                                                             │
│                                                                                                                                                                           │
│   3318 def signature(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False,    ╭─────────────── locals ────────────────╮                                 │
│   3319 │   │   │     annotation_format=Format.VALUE):                                           │ annotation_format = <Format.VALUE: 1> │                                 │
│   3320 │   """Get a signature object for the passed callable."""                                │          eval_str = True              │                                 │
│ ❱ 3321 │   return Signature.from_callable(obj, follow_wrapped=follow_wrapped,                   │    follow_wrapped = True              │                                 │
│   3322 │   │   │   │   │   │   │   │      globals=globals, locals=locals, eval_str=eval_str,    │           globals = None              │                                 │
│   3323 │   │   │   │   │   │   │   │      annotation_format=annotation_format)                  │            locals = None              │                                 │
│   3324                                                                                          ╰───────────────────────────────────────╯                                 │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/inspect.py:3036 in from_callable                                                                         │
│                                                                                                                                                                           │
│   3033 │   │   │   │   │     follow_wrapped=True, globals=None, locals=None, eval_str=False,    ╭─────────────── locals ────────────────╮                                 │
│   3034 │   │   │   │   │     annotation_format=Format.VALUE):                                   │ annotation_format = <Format.VALUE: 1> │                                 │
│   3035 │   │   """Constructs Signature for the given callable object."""                        │          eval_str = True              │                                 │
│ ❱ 3036 │   │   return _signature_from_callable(obj, sigcls=cls,                                 │    follow_wrapped = True              │                                 │
│   3037 │   │   │   │   │   │   │   │   │   │   follow_wrapper_chains=follow_wrapped,            │           globals = None              │                                 │
│   3038 │   │   │   │   │   │   │   │   │   │   globals=globals, locals=locals,                  │            locals = None              │                                 │
│        eval_str=eval_str,                                                                       ╰───────────────────────────────────────╯                                 │
│   3039 │   │   │   │   │   │   │   │   │   │   annotation_format=annotation_format)                                                                                       │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/inspect.py:2511 in _signature_from_callable                                                              │
│                                                                                                                                                                           │
│   2508 │   if isfunction(obj) or _signature_is_functionlike(obj):                                                                                                         │
│   2509 │   │   # If it's a pure Python function, or an object that is duck type                                                                                           │
│   2510 │   │   # of a Python function (Cython functions, for instance), then:                                                                                             │
│ ❱ 2511 │   │   return _signature_from_function(sigcls, obj,                                                                                                               │
│   2512 │   │   │   │   │   │   │   │   │   │   skip_bound_arg=skip_bound_arg,                                                                                             │
│   2513 │   │   │   │   │   │   │   │   │   │   globals=globals, locals=locals,                                                                                            │
│        eval_str=eval_str,                                                                                                                                                 │
│   2514 │   │   │   │   │   │   │   │   │   │   annotation_format=annotation_format)                                                                                       │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │     _get_signature_of = functools.partial(<function _signature_from_callable at 0x7c1ae7575640>, follow_wrapper_chains=True, skip_bound_arg=True, globals=None,       │ │
│ │                         locals=None, sigcls=<class 'inspect.Signature'>, eval_str=True, annotation_format=<Format.VALUE: 1>)                                          │ │
│ │     annotation_format = <Format.VALUE: 1>                                                                                                                             │ │
│ │              eval_str = True                                                                                                                                          │ │
│ │ follow_wrapper_chains = True                                                                                                                                          │ │
│ │               globals = None                                                                                                                                          │ │
│ │                locals = None                                                                                                                                          │ │
│ │        skip_bound_arg = True                                                                                                                                          │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/inspect.py:2334 in _signature_from_function                                                              │
│                                                                                                                                                                           │
│   2331 │   positional = arg_names[:pos_count]                                                                                                                             │
│   2332 │   keyword_only_count = func_code.co_kwonlyargcount                                                                                                               │
│   2333 │   keyword_only = arg_names[pos_count:pos_count + keyword_only_count]                                                                                             │
│ ❱ 2334 │   annotations = get_annotations(func, globals=globals, locals=locals,                                                                                            │
│        eval_str=eval_str,                                                                                                                                                 │
│   2335 │   │   │   │   │   │   │   │     format=annotation_format)                                                                                                        │
│   2336 │   defaults = func.__defaults__                                                                                                                                   │
│   2337 │   kwdefaults = func.__kwdefaults__                                                                                                                               │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │  annotation_format = <Format.VALUE: 1>                                                                                                                                │ │
│ │          arg_names = ()                                                                                                                                               │ │
│ │           eval_str = True                                                                                                                                             │ │
│ │          func_code = <code object get_noauth_strategy at 0x7c1ae1351a70, file                                                                                         │ │
│ │                      "/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps_auth/backends.py", line 87>                                  │ │
│ │            globals = None                                                                                                                                             │ │
│ │   is_duck_function = False                                                                                                                                            │ │
│ │       keyword_only = ()                                                                                                                                               │ │
│ │ keyword_only_count = 0                                                                                                                                                │ │
│ │             locals = None                                                                                                                                             │ │
│ │          pos_count = 0                                                                                                                                                │ │
│ │         positional = ()                                                                                                                                               │ │
│ │      posonly_count = 0                                                                                                                                                │ │
│ │                  s = None                                                                                                                                             │ │
│ │     skip_bound_arg = True                                                                                                                                             │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                                           │
│ /home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/annotationlib.py:1058 in get_annotations                                                                 │
│                                                                                                                                                                           │
│   1055 │                                                                                                                                                                  │
│   1056 │   return_value = {                                                                                                                                               │
│   1057 │   │   key: value if not isinstance(value, str)                                                                                                                   │
│ ❱ 1058 │   │   else eval(_rewrite_star_unpack(value), globals, locals)                                                                                                    │
│   1059 │   │   for key, value in ann.items()                                                                                                                              │
│   1060 │   }                                                                                                                                                              │
│   1061 │   return return_value                                                                                                                                            │
│                                                                                                                                                                           │
│ ╭─────────────────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────────────────╮ │
│ │         ann = {'return': 'NoAuthStrategy'}                                                                                                                            │ │
│ │    eval_str = True                                                                                                                                                    │ │
│ │      format = <Format.VALUE: 1>                                                                                                                                       │ │
│ │   functools = <module 'functools' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/functools.py'>                                               │ │
│ │     globals = {                                                                                                                                                       │ │
│ │               │   '__name__': 'fps_auth.backends',                                                                                                                    │ │
│ │               │   '__doc__': None,                                                                                                                                    │ │
│ │               │   '__package__': 'fps_auth',                                                                                                                          │ │
│ │               │   '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7c1ae132f950>,                                                               │ │
│ │               │   '__spec__': ModuleSpec(name='fps_auth.backends', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7c1ae132f950>,                     │ │
│ │               origin='/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps_auth/backends.py'),                                          │ │
│ │               │   '__file__': '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/f'+19,                                                  │ │
│ │               │   '__cached__': '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/f'+44,                                                │ │
│ │               │   '__builtins__': {                                                                                                                                   │ │
│ │               │   │   '__name__': 'builtins',                                                                                                                         │ │
│ │               │   │   '__doc__': 'Built-in functions, types, exceptions, and other objects.\n\nThis module provides '+346,                                            │ │
│ │               │   │   '__package__': '',                                                                                                                              │ │
│ │               │   │   '__loader__': <class '_frozen_importlib.BuiltinImporter'>,                                                                                      │ │
│ │               │   │   '__spec__': ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>, origin='built-in'),                                 │ │
│ │               │   │   '__build_class__': <built-in function __build_class__>,                                                                                         │ │
│ │               │   │   '__import__': <built-in function __import__>,                                                                                                   │ │
│ │               │   │   'abs': <built-in function abs>,                                                                                                                 │ │
│ │               │   │   'all': <built-in function all>,                                                                                                                 │ │
│ │               │   │   'any': <built-in function any>,                                                                                                                 │ │
│ │               │   │   ... +149                                                                                                                                        │ │
│ │               │   },                                                                                                                                                  │ │
│ │               │   'annotations': _Feature((3, 7, 0, 'beta', 1), None, 16777216),                                                                                      │ │
│ │               │   'uuid': <module 'uuid' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/uuid.py'>,                                            │ │
│ │               │   ... +30                                                                                                                                             │ │
│ │               }                                                                                                                                                       │ │
│ │      locals = None                                                                                                                                                    │ │
│ │ obj_globals = {                                                                                                                                                       │ │
│ │               │   '__name__': 'fps_auth.backends',                                                                                                                    │ │
│ │               │   '__doc__': None,                                                                                                                                    │ │
│ │               │   '__package__': 'fps_auth',                                                                                                                          │ │
│ │               │   '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7c1ae132f950>,                                                               │ │
│ │               │   '__spec__': ModuleSpec(name='fps_auth.backends', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7c1ae132f950>,                     │ │
│ │               origin='/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fps_auth/backends.py'),                                          │ │
│ │               │   '__file__': '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/f'+19,                                                  │ │
│ │               │   '__cached__': '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/f'+44,                                                │ │
│ │               │   '__builtins__': {                                                                                                                                   │ │
│ │               │   │   '__name__': 'builtins',                                                                                                                         │ │
│ │               │   │   '__doc__': 'Built-in functions, types, exceptions, and other objects.\n\nThis module provides '+346,                                            │ │
│ │               │   │   '__package__': '',                                                                                                                              │ │
│ │               │   │   '__loader__': <class '_frozen_importlib.BuiltinImporter'>,                                                                                      │ │
│ │               │   │   '__spec__': ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>, origin='built-in'),                                 │ │
│ │               │   │   '__build_class__': <built-in function __build_class__>,                                                                                         │ │
│ │               │   │   '__import__': <built-in function __import__>,                                                                                                   │ │
│ │               │   │   'abs': <built-in function abs>,                                                                                                                 │ │
│ │               │   │   'all': <built-in function all>,                                                                                                                 │ │
│ │               │   │   'any': <built-in function any>,                                                                                                                 │ │
│ │               │   │   ... +149                                                                                                                                        │ │
│ │               │   },                                                                                                                                                  │ │
│ │               │   'annotations': _Feature((3, 7, 0, 'beta', 1), None, 16777216),                                                                                      │ │
│ │               │   'uuid': <module 'uuid' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/uuid.py'>,                                            │ │
│ │               │   ... +30                                                                                                                                             │ │
│ │               }                                                                                                                                                       │ │
│ │  obj_locals = None                                                                                                                                                    │ │
│ │ type_params = ()                                                                                                                                                      │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ in <module>:1                                                                                                                                                             │
│ ╭────────────────────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────────────────────╮           │
│ │ annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)                                                                                                │           │
│ │       httpx = <module 'httpx' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/httpx/__init__.py'>                      │           │
│ │      models = <module 'fastapi_users.models' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/fastapi_users/models.py'> │           │
│ │      status = <module 'starlette.status' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/site-packages/starlette/status.py'>         │           │
│ │        uuid = <module 'uuid' from '/home/david/.local/share/mamba/envs/tmp-jupyverse/lib/python3.14/uuid.py'>                                               │           │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯           │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
NameError: name 'NoAuthStrategy' is not defined

Copy link
Contributor

@davidbrochart davidbrochart Dec 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removing from __future__ import annotations in this file seems to solve the issue.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similarly seeing

src/hub_api/api/api_v1/endpoints/__init__.py:3: in <module>
    from hub_api.api.api_v1.endpoints import maintainers, plugins
src/hub_api/api/api_v1/endpoints/maintainers.py:15: in <module>
    @router.get(
.venv/lib/python3.14/site-packages/fastapi/routing.py:1072: in decorator
    self.add_api_route(
.venv/lib/python3.14/site-packages/fastapi/routing.py:1011: in add_api_route
    route = route_class(
.venv/lib/python3.14/site-packages/fastapi/routing.py:630: in __init__
    self.dependant = get_dependant(
.venv/lib/python3.14/site-packages/fastapi/dependencies/utils.py:290: in get_dependant
    sub_dependant = get_dependant(
.venv/lib/python3.14/site-packages/fastapi/dependencies/utils.py:259: in get_dependant
    endpoint_signature = get_typed_signature(call)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14/site-packages/fastapi/dependencies/utils.py:196: in get_typed_signature
    signature = inspect.signature(call, eval_str=True)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../../.local/share/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/inspect.py:3312: in signature
    return Signature.from_callable(obj, follow_wrapped=follow_wrapped,
../../.local/share/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/inspect.py:3027: in from_callable
    return _signature_from_callable(obj, sigcls=cls,
../../.local/share/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/inspect.py:2502: in _signature_from_callable
    return _signature_from_function(sigcls, obj,
../../.local/share/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/inspect.py:2325: in _signature_from_function
    annotations = get_annotations(func, globals=globals, locals=locals, eval_str=eval_str,
../../.local/share/uv/python/cpython-3.14.0-macos-aarch64-none/lib/python3.14/annotationlib.py:990: in get_annotations
    key: value if not isinstance(value, str) else eval(value, globals, locals)
                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<string>:1: in <module>
    ???
E   NameError: name 'AsyncGenerator' is not defined

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sector119

This comment was marked as off-topic.

@martincpt
Copy link

We’re also receiving a NameError: name 'xyz' is not defined when using dependencies referenced inside if TYPE_CHECKING: blocks. We obviously don’t want to remove these imports, since that would reintroduce circular import errors on Python 3.12.

I reviewed the changes in 0.123.7, and I’m not convinced the condition is correct. Shouldn’t the new handling apply to any Python version less than or equal to 3.10, rather than greater than or equal to 3.10?

I also ran the test provided in the PR, and it does not throw an error on Python 3.12 when using version 0.123.6. This further suggests that the new condition might be reversed.

if sys.version_info <= (3, 10):  # condition reversed
    signature = inspect.signature(call, eval_str=True)
else:
    signature = inspect.signature(call)

@sector119
Copy link

We’re also receiving a NameError: name 'xyz' is not defined when using dependencies referenced inside if TYPE_CHECKING: blocks. We obviously don’t want to remove these imports, since that would reintroduce circular import errors on Python 3.12.

I reviewed the changes in 0.123.7, and I’m not convinced the condition is correct. Shouldn’t the new handling apply to any Python version less than or equal to 3.10, rather than greater than or equal to 3.10?

I also ran the test provided in the PR, and it does not throw an error on Python 3.12 when using version 0.123.6. This further suggests that the new condition might be reversed.

if sys.version_info <= (3, 10):  # condition reversed
    signature = inspect.signature(call, eval_str=True)
else:
    signature = inspect.signature(call)

Same here... Why from future import annotations and TYPE_CHECKING have to be removed to get everything work as it was before 0.123.7

@tirkarthi
Copy link

@martincpt eval_str was added in Python 3.10 . Using it in prior Python versions will result in TypeError.

https://docs.python.org/3/library/inspect.html#inspect.signature

Changed in version 3.10: The globals, locals, and eval_str parameters were added.

python3.9           
Python 3.9.13 (main, May 23 2022, 22:01:06) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import inspect
>>> def foo(): pass
... 
>>> inspect.signature(foo, eval_str=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: signature() got an unexpected keyword argument 'eval_str'

@martincpt
Copy link

@tirkarthi Thanks — but then what exactly does the test in test_stringified_annotations_simple.py solve?
I would expect this dependency to fail on versions lower than 0.123.7, yet it doesn’t.

Also, it’s quite clear that using eval_str=True introduces new errors on Python 3.12 and 3.13 that were not present before.

So either the test is incorrect, or the condition in the version check is.

@tiangolo
Copy link
Member

The recent problems were discussed here: #14464

I created an issue for completeness here: #14484

It was solved here: #14485

The fix is available in FastAPI 0.124.2, just released 🎉

736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
This MR contains the following updates:

| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [celery](https://docs.celeryq.dev/) ([source](https://github.com/celery/celery), [changelog](https://docs.celeryq.dev/en/stable/changelog.html)) | dependencies | minor | `5.5.3` → `5.6.2` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/celery/celery/badge)](https://securityscorecards.dev/viewer/?uri=github.com/celery/celery) |
| [celery-types](https://github.com/sbdchd/celery-types) | dependencies | minor | `^0.22.0` → `^0.24.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sbdchd/celery-types/badge)](https://securityscorecards.dev/viewer/?uri=github.com/sbdchd/celery-types) |
| [fastapi](https://github.com/fastapi/fastapi) ([changelog](https://fastapi.tiangolo.com/release-notes/)) | dependencies | minor | `^0.115.12` → `^0.128.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fastapi/fastapi/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fastapi/fastapi) |
| [filelock](https://github.com/tox-dev/py-filelock) | dependencies | minor | `3.14.0` → `3.20.3` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/tox-dev/py-filelock/badge)](https://securityscorecards.dev/viewer/?uri=github.com/tox-dev/py-filelock) |
| [luqum](https://github.com/jurismarches/luqum) | dependencies | minor | `^0.13.0` → `^0.14.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jurismarches/luqum/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jurismarches/luqum) |
| [ollama](https://github.com/ollama/ollama-python) | dependencies | minor | `^0.5.1` → `^0.6.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/ollama/ollama-python/badge)](https://securityscorecards.dev/viewer/?uri=github.com/ollama/ollama-python) |
| [pycryptodome](https://www.pycryptodome.org) ([source](https://github.com/Legrandin/pycryptodome), [changelog](https://www.pycryptodome.org/src/changelog)) | dependencies | minor | `3.20.0` → `3.23.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Legrandin/pycryptodome/badge)](https://securityscorecards.dev/viewer/?uri=github.com/Legrandin/pycryptodome) |
| [pydantic-mongo](https://github.com/jefersondaniel/pydantic-mongo) | dependencies | minor | `2.3.0` → `2.4.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jefersondaniel/pydantic-mongo/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jefersondaniel/pydantic-mongo) |
| [pydantic-settings](https://github.com/pydantic/pydantic-settings) ([changelog](https://github.com/pydantic/pydantic-settings/releases)) | dependencies | minor | `2.2.1` → `2.12.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pydantic/pydantic-settings/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pydantic/pydantic-settings) |
| [pymongo](https://github.com/mongodb/mongo-python-driver) | dependencies | minor | `4.15.5` → `4.16.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mongodb/mongo-python-driver/badge)](https://securityscorecards.dev/viewer/?uri=github.com/mongodb/mongo-python-driver) |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) ([changelog](https://pytest-asyncio.readthedocs.io/en/latest/reference/changelog.html)) | dependencies | minor | `^0.23.6` → `^0.26.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-asyncio/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-asyncio) |
| [pytest-timeout](https://github.com/pytest-dev/pytest-timeout) | dependencies | minor | `2.3.1` → `2.4.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-timeout/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-timeout) |
| [scikit-learn](https://github.com/scikit-learn/scikit-learn) ([changelog](https://scikit-learn.org/stable/whats_new)) | dependencies | minor | `1.7.0` → `1.8.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/scikit-learn/scikit-learn/badge)](https://securityscorecards.dev/viewer/?uri=github.com/scikit-learn/scikit-learn) |
| [scikit-learn](https://github.com/scikit-learn/scikit-learn) ([changelog](https://scikit-learn.org/stable/whats_new)) | dependencies | minor | `1.6.1` → `1.8.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/scikit-learn/scikit-learn/badge)](https://securityscorecards.dev/viewer/?uri=github.com/scikit-learn/scikit-learn) |
| [scipy](https://github.com/scipy/scipy) | dependencies | minor | `1.15.3` → `1.17.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/scipy/scipy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/scipy/scipy) |
| [uvicorn](https://github.com/Kludex/uvicorn) ([changelog](https://uvicorn.dev/release-notes)) | dependencies | minor | `^0.29.0` → `^0.40.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Kludex/uvicorn/badge)](https://securityscorecards.dev/viewer/?uri=github.com/Kludex/uvicorn) |

---

### Release Notes

<details>
<summary>celery/celery (celery)</summary>

### [`v5.6.2`](https://github.com/celery/celery/blob/HEAD/Changelog.rst#562)

[Compare Source](https://github.com/celery/celery/compare/v5.6.1...v5.6.2)

\=====

:release-date: 2026-01-04
:release-by: Tomer Nosrati

What's Changed

```

- Fix recursive WorkController instantiation in DjangoWorkerFixup + AttributeError when pool_cls is a string (#&#8203;10045)
- Bugfix: Revoked tasks now immediately update backend status to REVOKED (#&#8203;9869)
- Prepare for release: v5.6.2 (#&#8203;10049)

.. _version-5.6.1:

5.6.1
=====

:release-date: 2025-12-29
:release-by: Tomer Nosrati

What's Changed
```

- Fix Redis Sentinel ACL authentication support ([#&#8203;10013](https://github.com/celery/celery/issues/10013))
- Fix: Broker heartbeats not sent during graceful shutdown ([#&#8203;9986](https://github.com/celery/celery/issues/9986))
- docs [#&#8203;5410](https://github.com/celery/celery/issues/5410) -- Document confirm\_publish broker transport option ([#&#8203;10016](https://github.com/celery/celery/issues/10016))
- close DB pools only in prefork mode ([#&#8203;10020](https://github.com/celery/celery/issues/10020))
- Fix: Avoid unnecessary Django database connection creation during cleanup ([#&#8203;10015](https://github.com/celery/celery/issues/10015))
- reliable prefork detection ([#&#8203;10023](https://github.com/celery/celery/issues/10023))
- better coverage ([#&#8203;10029](https://github.com/celery/celery/issues/10029))
- Docs: clarify `result_extended` vs periodic task metadata and show `headers["periodic_task_name"]` example ([#&#8203;10030](https://github.com/celery/celery/issues/10030))
- Stop importing pytest\_subtests ([#&#8203;10032](https://github.com/celery/celery/issues/10032))
- Only use exceptiongroup backport for Python < 3.11 ([#&#8203;10033](https://github.com/celery/celery/issues/10033))
- Prepare for release: v5.6.1 ([#&#8203;10037](https://github.com/celery/celery/issues/10037))

.. \_version-5.6.0:

### [`v5.6.1`](https://github.com/celery/celery/releases/tag/v5.6.1)

[Compare Source](https://github.com/celery/celery/compare/v5.6.0...v5.6.1)

#### What's Changed

- Fix Redis Sentinel ACL authentication support by [@&#8203;anthonykuzmich7](https://github.com/anthonykuzmich7) in [#&#8203;10013](https://github.com/celery/celery/pull/10013)
- Fix: Broker heartbeats not sent during graceful shutdown by [@&#8203;weetster](https://github.com/weetster) in [#&#8203;9986](https://github.com/celery/celery/pull/9986)
- docs [#&#8203;5410](https://github.com/celery/celery/issues/5410) -- Document confirm\_publish broker transport option by [@&#8203;JaeHyuckSa](https://github.com/JaeHyuckSa) in [#&#8203;10016](https://github.com/celery/celery/pull/10016)
- close DB pools only in prefork mode by [@&#8203;petrprikryl](https://github.com/petrprikryl) in [#&#8203;10020](https://github.com/celery/celery/pull/10020)
- Fix: Avoid unnecessary Django database connection creation during cleanup by [@&#8203;snopoke](https://github.com/snopoke) in [#&#8203;10015](https://github.com/celery/celery/pull/10015)
- reliable prefork detection by [@&#8203;petrprikryl](https://github.com/petrprikryl) in [#&#8203;10023](https://github.com/celery/celery/pull/10023)
- better coverage by [@&#8203;petrprikryl](https://github.com/petrprikryl) in [#&#8203;10029](https://github.com/celery/celery/pull/10029)
- Docs: clarify `result_extended` vs periodic task metadata and show `headers["periodic_task_name"]` example by [@&#8203;SpaceShaman](https://github.com/SpaceShaman) in [#&#8203;10030](https://github.com/celery/celery/pull/10030)
- Stop importing pytest\_subtests by [@&#8203;cjwatson](https://github.com/cjwatson) in [#&#8203;10032](https://github.com/celery/celery/pull/10032)
- Only use exceptiongroup backport for Python < 3.11 by [@&#8203;cjwatson](https://github.com/cjwatson) in [#&#8203;10033](https://github.com/celery/celery/pull/10033)
- Prepare for release: v5.6.1 by [@&#8203;Nusnus](https://github.com/Nusnus) in [#&#8203;10037](https://github.com/celery/celery/pull/10037)

#### New Contributors

- [@&#8203;anthonykuzmich7](https://github.com/anthonykuzmich7) made their first contribution in [#&#8203;10013](https://github.com/celery/celery/pull/10013)
- [@&#8203;weetster](https://github.com/weetster) made their first contribution in [#&#8203;9986](https://github.com/celery/celery/pull/9986)
- [@&#8203;JaeHyuckSa](https://github.com/JaeHyuckSa) made their first contribution in [#&#8203;10016](https://github.com/celery/celery/pull/10016)
- [@&#8203;snopoke](https://github.com/snopoke) made their first contribution in [#&#8203;10015](https://github.com/celery/celery/pull/10015)
- [@&#8203;SpaceShaman](https://github.com/SpaceShaman) made their first contribution in [#&#8203;10030](https://github.com/celery/celery/pull/10030)

**Full Changelog**: <https://github.com/celery/celery/compare/v5.6.0...v5.6.1>

### [`v5.6.0`](https://github.com/celery/celery/blob/HEAD/Changelog.rst#560)

[Compare Source](https://github.com/celery/celery/compare/v5.5.3...v5.6.0)

\=====

:release-date: 2025-11-30
:release-by: Tomer Nosrati

Celery v5.6.0 is now available.

Key Highlights

```

See :ref:`whatsnew-5.6` for a complete overview or read the main highlights below.

Python 3.9 Minimum Version
--------------------------

Celery 5.6.0 drops support for Python 3.8 (EOL). The minimum required Python
version is now 3.9. Users still on Python 3.8 must upgrade their Python version
before upgrading to Celery 5.6.0.

Additionally, this release includes initial support for Python 3.14.

SQS: Reverted to ``pycurl`` from ``urllib3``
--------------------------------------------

The switch from ``pycurl`` to ``urllib3`` for the SQS transport (introduced in
Celery 5.5.0 via Kombu) has been reverted due to critical issues affecting SQS
users:

- Processing throughput dropped from ~100 tasks/sec to ~3/sec in some environments
- ``UnknownOperationException`` errors causing container crash loops
- Silent message processing failures with no error logs

Users of the SQS transport must ensure ``pycurl`` is installed. If you removed
``pycurl`` after upgrading to Celery 5.5.0, you will need to reinstall it.

Contributed by `@auvipy <https://github.com/auvipy>`_ in
`#&#8203;9620 <https://github.com/celery/celery/pull/9620>`_.

Security Fix: Broker Credential Leak Prevention
------------------------------------------------

Fixed a security issue where broker URLs containing passwords were being logged
in plaintext by the delayed delivery mechanism. Broker credentials are now
properly sanitized in all log output.

Contributed by `@giancarloromeo <https://github.com/giancarloromeo>`_ in
`#&#8203;9997 <https://github.com/celery/celery/pull/9997>`_.

Memory Leak Fixes
-----------------

Two significant memory leaks have been fixed in this release:

**Exception Handling Memory Leak**: Fixed a critical memory leak in task exception
handling that was particularly severe on Python 3.11+ due to enhanced traceback
data. The fix properly breaks reference cycles in tracebacks to allow garbage
collection.

Contributed by `@jaiganeshs21 <https://github.com/jaiganeshs21>`_ in
`#&#8203;9799 <https://github.com/celery/celery/pull/9799>`_.

**Pending Result Memory Leak**: Fixed a memory leak where ``AsyncResult``
subscriptions were not being cleaned up when results were forgotten.

Contributed by `@tsoos99dev <https://github.com/tsoos99dev>`_ in
`#&#8203;9806 <https://github.com/celery/celery/pull/9806>`_.

ETA Task Memory Limit
---------------------

New configuration option :setting:`worker_eta_task_limit` to prevent out-of-memory
crashes when workers fetch large numbers of ETA or countdown tasks. Previously,
workers could exhaust available memory when the broker contained many scheduled tasks.

Example usage:

.. code-block:: python

    app.conf.worker_eta_task_limit = 1000

Contributed by `@sashu2310 <https://github.com/sashu2310>`_ in
`#&#8203;9853 <https://github.com/celery/celery/pull/9853>`_.

Queue Type Selection for Auto-created Queues
--------------------------------------------

New configuration options allow specifying the queue type and exchange type when
Celery auto-creates missing queues. This is particularly useful for RabbitMQ users
who want to use quorum queues with auto-created queues.

Configuration options:

- :setting:`task_create_missing_queue_type`: Sets the queue type for auto-created
  queues (e.g., ``quorum``, ``classic``)
- :setting:`task_create_missing_queue_exchange_type`: Sets the exchange type for
  auto-created queues

Example usage:

.. code-block:: python

    app.conf.task_create_missing_queue_type = 'quorum'

Contributed by `@ghirailghiro <https://github.com/ghirailghiro>`_ in
`#&#8203;9815 <https://github.com/celery/celery/pull/9815>`_.

What's Changed
```

- Prepare for release: v5.6.0 ([#&#8203;10010](https://github.com/celery/celery/issues/10010))

.. \_version-5.6.0rc2:

</details>

<details>
<summary>fastapi/fastapi (fastapi)</summary>

### [`v0.128.0`](https://github.com/fastapi/fastapi/releases/tag/0.128.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.127.1...0.128.0)

##### Breaking Changes

- ➖ Drop support for `pydantic.v1`. MR [#&#8203;14609](https://github.com/fastapi/fastapi/pull/14609) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ✅ Run performance tests only on Pydantic v2. MR [#&#8203;14608](https://github.com/fastapi/fastapi/pull/14608) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.127.1`](https://github.com/fastapi/fastapi/releases/tag/0.127.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.127.0...0.127.1)

##### Refactors

- 🔊 Add a custom `FastAPIDeprecationWarning`. MR [#&#8203;14605](https://github.com/fastapi/fastapi/pull/14605) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Add documentary to website. MR [#&#8203;14600](https://github.com/fastapi/fastapi/pull/14600) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Update translations for de (update-outdated). MR [#&#8203;14602](https://github.com/fastapi/fastapi/pull/14602) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🌐 Update translations for de (update-outdated). MR [#&#8203;14581](https://github.com/fastapi/fastapi/pull/14581) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- 🔧 Update pre-commit to use local Ruff instead of hook. MR [#&#8203;14604](https://github.com/fastapi/fastapi/pull/14604) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ✅ Add missing tests for code examples. MR [#&#8203;14569](https://github.com/fastapi/fastapi/pull/14569) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👷 Remove `lint` job from `test` CI workflow. MR [#&#8203;14593](https://github.com/fastapi/fastapi/pull/14593) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👷 Update secrets check. MR [#&#8203;14592](https://github.com/fastapi/fastapi/pull/14592) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Run CodSpeed tests in parallel to other tests to speed up CI. MR [#&#8203;14586](https://github.com/fastapi/fastapi/pull/14586) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔨 Update scripts and pre-commit to autofix files. MR [#&#8203;14585](https://github.com/fastapi/fastapi/pull/14585) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.127.0`](https://github.com/fastapi/fastapi/releases/tag/0.127.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.126.0...0.127.0)

##### Breaking Changes

- 🔊 Add deprecation warnings when using `pydantic.v1`. MR [#&#8203;14583](https://github.com/fastapi/fastapi/pull/14583) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🔧 Add LLM prompt file for Korean, generated from the existing translations. MR [#&#8203;14546](https://github.com/fastapi/fastapi/pull/14546) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔧 Add LLM prompt file for Japanese, generated from the existing translations. MR [#&#8203;14545](https://github.com/fastapi/fastapi/pull/14545) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆️ Upgrade OpenAI model for translations to gpt-5.2. MR [#&#8203;14579](https://github.com/fastapi/fastapi/pull/14579) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.126.0`](https://github.com/fastapi/fastapi/releases/tag/0.126.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.125.0...0.126.0)

##### Upgrades

- ➖ Drop support for Pydantic v1, keeping short temporary support for Pydantic v2's `pydantic.v1`. MR [#&#8203;14575](https://github.com/fastapi/fastapi/pull/14575) by [@&#8203;tiangolo](https://github.com/tiangolo).
  - The minimum version of Pydantic installed is now `pydantic >=2.7.0`.
  - The `standard` dependencies now include `pydantic-settings >=2.0.0` and `pydantic-extra-types >=2.0.0`.

##### Docs

- 📝 Fix duplicated variable in `docs_src/python_types/tutorial005_py39.py`. MR [#&#8203;14565](https://github.com/fastapi/fastapi/pull/14565) by [@&#8203;paras-verma7454](https://github.com/paras-verma7454).

##### Translations

- 🔧 Add LLM prompt file for Ukrainian, generated from the existing translations. MR [#&#8203;14548](https://github.com/fastapi/fastapi/pull/14548) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- 🔧 Tweak pre-commit to allow committing release-notes. MR [#&#8203;14577](https://github.com/fastapi/fastapi/pull/14577) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆️ Use prek as a pre-commit alternative. MR [#&#8203;14572](https://github.com/fastapi/fastapi/pull/14572) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Add performance tests with CodSpeed. MR [#&#8203;14558](https://github.com/fastapi/fastapi/pull/14558) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.125.0`](https://github.com/fastapi/fastapi/releases/tag/0.125.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.4...0.125.0)

##### Breaking Changes

- 🔧 Drop support for Python 3.8. MR [#&#8203;14563](https://github.com/fastapi/fastapi/pull/14563) by [@&#8203;tiangolo](https://github.com/tiangolo).
  - This would actually not be a *breaking* change as no code would really break. Any Python 3.8 installer would just refuse to install the latest version of FastAPI and would only install 0.124.4. Only marking it as a "breaking change" to make it visible.

##### Refactors

- ♻️ Upgrade internal syntax to Python 3.9+ 🎉. MR [#&#8203;14564](https://github.com/fastapi/fastapi/pull/14564) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- ⚰️ Remove Python 3.8 from CI and remove Python 3.8 examples from source docs. MR [#&#8203;14559](https://github.com/fastapi/fastapi/pull/14559) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov) and [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Update translations for pt (add-missing). MR [#&#8203;14539](https://github.com/fastapi/fastapi/pull/14539) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔧 Add LLM prompt file for French, generated from the existing French docs. MR [#&#8203;14544](https://github.com/fastapi/fastapi/pull/14544) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Sync Portuguese docs (pages found with script). MR [#&#8203;14554](https://github.com/fastapi/fastapi/pull/14554) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync Spanish docs (outdated pages found with script). MR [#&#8203;14553](https://github.com/fastapi/fastapi/pull/14553) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync German docs. MR [#&#8203;14519](https://github.com/fastapi/fastapi/pull/14519) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🔥 Remove inactive/scarce translations to Vietnamese. MR [#&#8203;14543](https://github.com/fastapi/fastapi/pull/14543) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔥 Remove inactive/scarce translations to Persian. MR [#&#8203;14542](https://github.com/fastapi/fastapi/pull/14542) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔥 Remove translation to emoji to simplify the new setup with LLM autotranslations. MR [#&#8203;14541](https://github.com/fastapi/fastapi/pull/14541) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Update translations for pt (update-outdated). MR [#&#8203;14537](https://github.com/fastapi/fastapi/pull/14537) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Update translations for es (update-outdated). MR [#&#8203;14532](https://github.com/fastapi/fastapi/pull/14532) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Update translations for es (add-missing). MR [#&#8203;14533](https://github.com/fastapi/fastapi/pull/14533) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Remove translations for removed docs. MR [#&#8203;14516](https://github.com/fastapi/fastapi/pull/14516) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆ Bump `markdown-include-variants` from 0.0.7 to 0.0.8. MR [#&#8203;14556](https://github.com/fastapi/fastapi/pull/14556) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🔧 Temporarily disable translations still in progress, being migrated to the new LLM setup. MR [#&#8203;14555](https://github.com/fastapi/fastapi/pull/14555) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🔧 Update test workflow config, remove commented code. MR [#&#8203;14540](https://github.com/fastapi/fastapi/pull/14540) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Configure coverage, error on main tests, don't wait for Smokeshow. MR [#&#8203;14536](https://github.com/fastapi/fastapi/pull/14536) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Run Smokeshow always, even on test failures. MR [#&#8203;14538](https://github.com/fastapi/fastapi/pull/14538) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Make Pydantic versions customizable in CI. MR [#&#8203;14535](https://github.com/fastapi/fastapi/pull/14535) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Fix checkout GitHub Action fetch-depth for LLM translations, enable cron monthly. MR [#&#8203;14531](https://github.com/fastapi/fastapi/pull/14531) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Fix Typer command for CI LLM translations. MR [#&#8203;14530](https://github.com/fastapi/fastapi/pull/14530) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Update LLM translation CI, add language matrix and extra commands, prepare for scheduled run. MR [#&#8203;14529](https://github.com/fastapi/fastapi/pull/14529) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Update github-actions user for GitHub Actions workflows. MR [#&#8203;14528](https://github.com/fastapi/fastapi/pull/14528) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ➕ Add requirements for translations. MR [#&#8203;14515](https://github.com/fastapi/fastapi/pull/14515) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.124.4`](https://github.com/fastapi/fastapi/releases/tag/0.124.4)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.3...0.124.4)

##### Fixes

- 🐛 Fix parameter aliases. MR [#&#8203;14371](https://github.com/fastapi/fastapi/pull/14371) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.124.3`](https://github.com/fastapi/fastapi/releases/tag/0.124.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.2...0.124.3)

##### Fixes

- 🐛 Fix support for tagged union with discriminator inside of `Annotated` with `Body()`. MR [#&#8203;14512](https://github.com/fastapi/fastapi/pull/14512) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Refactors

- ✅ Add set of tests for request parameters and alias. MR [#&#8203;14358](https://github.com/fastapi/fastapi/pull/14358) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Docs

- 📝 Tweak links format. MR [#&#8203;14505](https://github.com/fastapi/fastapi/pull/14505) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 📝 Update docs about re-raising validation errors, do not include string as is to not leak information. MR [#&#8203;14487](https://github.com/fastapi/fastapi/pull/14487) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔥 Remove external links section. MR [#&#8203;14486](https://github.com/fastapi/fastapi/pull/14486) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Sync Russian docs. MR [#&#8203;14509](https://github.com/fastapi/fastapi/pull/14509) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync German docs. MR [#&#8203;14488](https://github.com/fastapi/fastapi/pull/14488) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- 👷 Tweak coverage to not pass Smokeshow max file size limit. MR [#&#8203;14507](https://github.com/fastapi/fastapi/pull/14507) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ✅ Expand test matrix to include Windows and MacOS. MR [#&#8203;14171](https://github.com/fastapi/fastapi/pull/14171) by [@&#8203;svlandeg](https://github.com/svlandeg).

### [`v0.124.2`](https://github.com/fastapi/fastapi/releases/tag/0.124.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.1...0.124.2)

##### Fixes

- 🐛 Fix support for `if TYPE_CHECKING`,  non-evaluated stringified annotations. MR [#&#8203;14485](https://github.com/fastapi/fastapi/pull/14485) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.124.1`](https://github.com/fastapi/fastapi/releases/tag/0.124.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.0...0.124.1)

##### Fixes

- 🐛 Fix handling arbitrary types when using `arbitrary_types_allowed=True`. MR [#&#8203;14482](https://github.com/fastapi/fastapi/pull/14482) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Add variants for code examples in "Advanced User Guide". MR [#&#8203;14413](https://github.com/fastapi/fastapi/pull/14413) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 📝 Update tech stack in project generation docs. MR [#&#8203;14472](https://github.com/fastapi/fastapi/pull/14472) by [@&#8203;alejsdev](https://github.com/alejsdev).

##### Internal

- ✅ Add test for Pydantic v2, dataclasses, UUID, and `__annotations__`. MR [#&#8203;14477](https://github.com/fastapi/fastapi/pull/14477) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.124.0`](https://github.com/fastapi/fastapi/releases/tag/0.124.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.10...0.124.0)

##### Features

- 🚸  Improve tracebacks by adding endpoint metadata. MR [#&#8203;14306](https://github.com/fastapi/fastapi/pull/14306) by [@&#8203;savannahostrowski](https://github.com/savannahostrowski).

##### Internal

- ✏️ Fix typo in `scripts/mkdocs_hooks.py`. MR [#&#8203;14457](https://github.com/fastapi/fastapi/pull/14457) by [@&#8203;yujiteshima](https://github.com/yujiteshima).

### [`v0.123.10`](https://github.com/fastapi/fastapi/releases/tag/0.123.10)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.9...0.123.10)

##### Fixes

- 🐛 Fix using class (not instance) dependency that has `__call__` method. MR [#&#8203;14458](https://github.com/fastapi/fastapi/pull/14458) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix `separate_input_output_schemas=False` with `computed_field`. MR [#&#8203;14453](https://github.com/fastapi/fastapi/pull/14453) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.123.9`](https://github.com/fastapi/fastapi/releases/tag/0.123.9)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.8...0.123.9)

##### Fixes

- 🐛 Fix OAuth2 scopes in OpenAPI in extra corner cases, parent dependency with scopes, sub-dependency security scheme without scopes. MR [#&#8203;14459](https://github.com/fastapi/fastapi/pull/14459) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.8`](https://github.com/fastapi/fastapi/releases/tag/0.123.8)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.7...0.123.8)

##### Fixes

- 🐛 Fix OpenAPI security scheme OAuth2 scopes declaration, deduplicate security schemes with different scopes. MR [#&#8203;14455](https://github.com/fastapi/fastapi/pull/14455) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.7`](https://github.com/fastapi/fastapi/releases/tag/0.123.7)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.6...0.123.7)

##### Fixes

- 🐛 Fix evaluating stringified annotations in Python 3.10. MR [#&#8203;11355](https://github.com/fastapi/fastapi/pull/11355) by [@&#8203;chaen](https://github.com/chaen).

### [`v0.123.6`](https://github.com/fastapi/fastapi/releases/tag/0.123.6)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.5...0.123.6)

##### Fixes

- 🐛 Fix support for functools wraps and partial combined, for async and regular functions and classes in path operations and dependencies. MR [#&#8203;14448](https://github.com/fastapi/fastapi/pull/14448) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.5`](https://github.com/fastapi/fastapi/releases/tag/0.123.5)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.4...0.123.5)

##### Features

- ✨ Allow using dependables with `functools.partial()`. MR [#&#8203;9753](https://github.com/fastapi/fastapi/pull/9753) by [@&#8203;lieryan](https://github.com/lieryan).
- ✨ Add support for wrapped functions (e.g. `@functools.wraps()`) used with forward references. MR [#&#8203;5077](https://github.com/fastapi/fastapi/pull/5077) by [@&#8203;lucaswiman](https://github.com/lucaswiman).
- ✨ Handle wrapped dependencies. MR [#&#8203;9555](https://github.com/fastapi/fastapi/pull/9555) by [@&#8203;phy1729](https://github.com/phy1729).

##### Fixes

- 🐛 Fix optional sequence handling with new union syntax from Python 3.10. MR [#&#8203;14430](https://github.com/fastapi/fastapi/pull/14430) by [@&#8203;Viicos](https://github.com/Viicos).

##### Refactors

- 🔥 Remove dangling extra condiitonal no longer needed. MR [#&#8203;14435](https://github.com/fastapi/fastapi/pull/14435) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ♻️ Refactor internals, update `is_coroutine` check to reuse internal supported variants (unwrap, check class). MR [#&#8203;14434](https://github.com/fastapi/fastapi/pull/14434) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Sync German docs. MR [#&#8203;14367](https://github.com/fastapi/fastapi/pull/14367) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

### [`v0.123.4`](https://github.com/fastapi/fastapi/releases/tag/0.123.4)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.3...0.123.4)

##### Fixes

- 🐛 Fix OpenAPI schema support for computed fields when using `separate_input_output_schemas=False`. MR [#&#8203;13207](https://github.com/fastapi/fastapi/pull/13207) by [@&#8203;vgrafe](https://github.com/vgrafe).

##### Docs

- 📝 Fix docstring of `servers` parameter. MR [#&#8203;14405](https://github.com/fastapi/fastapi/pull/14405) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.123.3`](https://github.com/fastapi/fastapi/releases/tag/0.123.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.2...0.123.3)

##### Fixes

- 🐛 Fix Query\Header\Cookie parameter model alias. MR [#&#8203;14360](https://github.com/fastapi/fastapi/pull/14360) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix optional sequence handling in `serialize sequence value` with Pydantic V2. MR [#&#8203;14297](https://github.com/fastapi/fastapi/pull/14297) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.123.2`](https://github.com/fastapi/fastapi/releases/tag/0.123.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.1...0.123.2)

##### Fixes

- 🐛 Fix unformatted `{type_}` in FastAPIError. MR [#&#8203;14416](https://github.com/fastapi/fastapi/pull/14416) by [@&#8203;Just-Helpful](https://github.com/Just-Helpful).
- 🐛 Fix parsing extra non-body parameter list. MR [#&#8203;14356](https://github.com/fastapi/fastapi/pull/14356) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix parsing extra `Form` parameter list. MR [#&#8203;14303](https://github.com/fastapi/fastapi/pull/14303) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix support for form values with empty strings interpreted as missing (`None` if that's the default), for compatibility with HTML forms. MR [#&#8203;13537](https://github.com/fastapi/fastapi/pull/13537) by [@&#8203;MarinPostma](https://github.com/MarinPostma).

##### Docs

- 📝 Add tip on how to install `pip` in case of `No module named pip` error in `virtual-environments.md`. MR [#&#8203;14211](https://github.com/fastapi/fastapi/pull/14211) by [@&#8203;zadevhub](https://github.com/zadevhub).
- 📝 Update Primary Key notes for the SQL databases tutorial to avoid confusion. MR [#&#8203;14120](https://github.com/fastapi/fastapi/pull/14120) by [@&#8203;FlaviusRaducu](https://github.com/FlaviusRaducu).
- 📝 Clarify estimation note in documentation. MR [#&#8203;14070](https://github.com/fastapi/fastapi/pull/14070) by [@&#8203;SaisakthiM](https://github.com/SaisakthiM).

### [`v0.123.1`](https://github.com/fastapi/fastapi/releases/tag/0.123.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.0...0.123.1)

##### Fixes

- 🐛 Avoid accessing non-existing "$ref" key for Pydantic v2 compat remapping. MR [#&#8203;14361](https://github.com/fastapi/fastapi/pull/14361) by [@&#8203;svlandeg](https://github.com/svlandeg).
- 🐛 Fix `TypeError` when encoding a decimal with a `NaN` or `Infinity` value. MR [#&#8203;12935](https://github.com/fastapi/fastapi/pull/12935) by [@&#8203;kentwelcome](https://github.com/kentwelcome).

##### Internal

- 🐛 Fix Windows UnicodeEncodeError in CLI test. MR [#&#8203;14295](https://github.com/fastapi/fastapi/pull/14295) by [@&#8203;hemanth-thirthahalli](https://github.com/hemanth-thirthahalli).
- 🔧 Update sponsors: add Greptile. MR [#&#8203;14429](https://github.com/fastapi/fastapi/pull/14429) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI GitHub topic repositories. MR [#&#8203;14426](https://github.com/fastapi/fastapi/pull/14426) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump markdown-include-variants from 0.0.6 to 0.0.7. MR [#&#8203;14423](https://github.com/fastapi/fastapi/pull/14423) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👥 Update FastAPI People - Sponsors. MR [#&#8203;14422](https://github.com/fastapi/fastapi/pull/14422) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Contributors and Translators. MR [#&#8203;14420](https://github.com/fastapi/fastapi/pull/14420) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.0`](https://github.com/fastapi/fastapi/releases/tag/0.123.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.122.1...0.123.0)

##### Fixes

- 🐛 Cache dependencies that don't use scopes and don't have sub-dependencies with scopes. MR [#&#8203;14419](https://github.com/fastapi/fastapi/pull/14419) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.122.1`](https://github.com/fastapi/fastapi/releases/tag/0.122.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.122.0...0.122.1)

##### Fixes

- 🐛 Fix hierarchical security scope propagation. MR [#&#8203;5624](https://github.com/fastapi/fastapi/pull/5624) by [@&#8203;kristjanvalur](https://github.com/kristjanvalur).

##### Docs

- 💅 Update CSS to explicitly use emoji font. MR [#&#8203;14415](https://github.com/fastapi/fastapi/pull/14415) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆ Bump markdown-include-variants from 0.0.5 to 0.0.6. MR [#&#8203;14418](https://github.com/fastapi/fastapi/pull/14418) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.122.0`](https://github.com/fastapi/fastapi/releases/tag/0.122.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.3...0.122.0)

##### Fixes

- 🐛 Use `401` status code in security classes when credentials are missing. MR [#&#8203;13786](https://github.com/fastapi/fastapi/pull/13786) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
  - If your code depended on these classes raising the old (less correct) `403` status code, check the new docs about how to override the classes, to use the same old behavior: [Use Old 403 Authentication Error Status Codes](https://fastapi.tiangolo.com/how-to/authentication-error-status-code/).

##### Internal

- 🔧 Configure labeler to exclude files that start from underscore for `lang-all` label. MR [#&#8203;14213](https://github.com/fastapi/fastapi/pull/14213) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👷 Add pre-commit config with local script for permalinks. MR [#&#8203;14398](https://github.com/fastapi/fastapi/pull/14398) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 💄 Use font Fira Code to fix display of Rich panels in docs in Windows. MR [#&#8203;14387](https://github.com/fastapi/fastapi/pull/14387) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Add custom pre-commit CI. MR [#&#8203;14397](https://github.com/fastapi/fastapi/pull/14397) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump actions/checkout from 5 to 6. MR [#&#8203;14381](https://github.com/fastapi/fastapi/pull/14381) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- 👷 Upgrade `latest-changes` GitHub Action and pin `actions/checkout@v5`. MR [#&#8203;14403](https://github.com/fastapi/fastapi/pull/14403) by [@&#8203;svlandeg](https://github.com/svlandeg).
- 🛠️ Add `add-permalinks` and `add-permalinks-page` to `scripts/docs.py`. MR [#&#8203;14033](https://github.com/fastapi/fastapi/pull/14033) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🔧 Upgrade Material for MkDocs and remove insiders. MR [#&#8203;14375](https://github.com/fastapi/fastapi/pull/14375) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.121.3`](https://github.com/fastapi/fastapi/releases/tag/0.121.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.2...0.121.3)

##### 0.121.3

##### Refactors

- ♻️ Make the result of `Depends()` and `Security()` hashable, as a workaround for other tools interacting with these internal parts. MR [#&#8203;14372](https://github.com/fastapi/fastapi/pull/14372) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Upgrades

- ⬆️ Bump Starlette to <`0.51.0`. MR [#&#8203;14282](https://github.com/fastapi/fastapi/pull/14282) by [@&#8203;musicinmybrain](https://github.com/musicinmybrain).

##### Docs

- 📝 Add missing hash part. MR [#&#8203;14369](https://github.com/fastapi/fastapi/pull/14369) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 📝 Fix typos in code comments. MR [#&#8203;14364](https://github.com/fastapi/fastapi/pull/14364) by [@&#8203;Edge-Seven](https://github.com/Edge-Seven).
- 📝 Add docs for using FastAPI Cloud. MR [#&#8203;14359](https://github.com/fastapi/fastapi/pull/14359) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.121.2`](https://github.com/fastapi/fastapi/releases/tag/0.121.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.1...0.121.2)

##### Fixes

- 🐛 Fix handling of JSON Schema attributes named "$ref". MR [#&#8203;14349](https://github.com/fastapi/fastapi/pull/14349) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Add EuroPython talk & podcast episode with Sebastián Ramírez. MR [#&#8203;14260](https://github.com/fastapi/fastapi/pull/14260) by [@&#8203;clytaemnestra](https://github.com/clytaemnestra).
- ✏️ Fix links and add missing permalink in docs. MR [#&#8203;14217](https://github.com/fastapi/fastapi/pull/14217) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Translations

- 🌐 Update Portuguese translations with LLM prompt. MR [#&#8203;14228](https://github.com/fastapi/fastapi/pull/14228) by [@&#8203;ceb10n](https://github.com/ceb10n).
- 🔨 Add Portuguese translations LLM prompt. MR [#&#8203;14208](https://github.com/fastapi/fastapi/pull/14208) by [@&#8203;ceb10n](https://github.com/ceb10n).
- 🌐 Sync Russian docs. MR [#&#8203;14331](https://github.com/fastapi/fastapi/pull/14331) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync German docs. MR [#&#8203;14317](https://github.com/fastapi/fastapi/pull/14317) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

### [`v0.121.1`](https://github.com/fastapi/fastapi/releases/tag/0.121.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.0...0.121.1)

##### Fixes

- 🐛 Fix `Depends(func, scope='function')` for top level (parameterless) dependencies. MR [#&#8203;14301](https://github.com/fastapi/fastapi/pull/14301) by [@&#8203;luzzodev](https://github.com/luzzodev).

##### Docs

- 📝 Upate docs for advanced dependencies with `yield`, noting the changes in 0.121.0, adding `scope`. MR [#&#8203;14287](https://github.com/fastapi/fastapi/pull/14287) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆ Bump ruff from 0.13.2 to 0.14.3. MR [#&#8203;14276](https://github.com/fastapi/fastapi/pull/14276) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14289](https://github.com/fastapi/fastapi/pull/14289) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).

### [`v0.121.0`](https://github.com/fastapi/fastapi/releases/tag/0.121.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.4...0.121.0)

##### Features

- ✨ Add support for dependencies with scopes, support `scope="request"` for dependencies with `yield` that exit before the response is sent. MR [#&#8203;14262](https://github.com/fastapi/fastapi/pull/14262) by [@&#8203;tiangolo](https://github.com/tiangolo).
  - New docs: [Dependencies with `yield` - Early exit and `scope`](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#early-exit-and-scope).

##### Internal

- 👥 Update FastAPI People - Contributors and Translators. MR [#&#8203;14273](https://github.com/fastapi/fastapi/pull/14273) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Sponsors. MR [#&#8203;14274](https://github.com/fastapi/fastapi/pull/14274) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI GitHub topic repositories. MR [#&#8203;14280](https://github.com/fastapi/fastapi/pull/14280) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump mkdocs-macros-plugin from 1.4.0 to 1.4.1. MR [#&#8203;14277](https://github.com/fastapi/fastapi/pull/14277) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump mkdocstrings\[python] from 0.26.1 to 0.30.1. MR [#&#8203;14279](https://github.com/fastapi/fastapi/pull/14279) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).

### [`v0.120.4`](https://github.com/fastapi/fastapi/releases/tag/0.120.4)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.3...0.120.4)

##### Fixes

- 🐛 Fix security schemes in OpenAPI when added at the top level app. MR [#&#8203;14266](https://github.com/fastapi/fastapi/pull/14266) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.120.3`](https://github.com/fastapi/fastapi/releases/tag/0.120.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.2...0.120.3)

##### Refactors

- ♻️ Reduce internal cyclic recursion in dependencies, from 2 functions calling each other to 1 calling itself. MR [#&#8203;14256](https://github.com/fastapi/fastapi/pull/14256) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ♻️ Refactor internals of dependencies, simplify code and remove `get_param_sub_dependant`. MR [#&#8203;14255](https://github.com/fastapi/fastapi/pull/14255) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ♻️ Refactor internals of dependencies, simplify using dataclasses. MR [#&#8203;14254](https://github.com/fastapi/fastapi/pull/14254) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Update note for untranslated pages. MR [#&#8203;14257](https://github.com/fastapi/fastapi/pull/14257) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.120.2`](https://github.com/fastapi/fastapi/releases/tag/0.120.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.1...0.120.2)

##### Fixes

- 🐛 Fix separation of schemas with nested models introduced in 0.119.0. MR [#&#8203;14246](https://github.com/fastapi/fastapi/pull/14246) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- 🔧 Add sponsor: SerpApi. MR [#&#8203;14248](https://github.com/fastapi/fastapi/pull/14248) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump actions/download-artifact from 5 to 6. MR [#&#8203;14236](https://github.com/fastapi/fastapi/pull/14236) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14237](https://github.com/fastapi/fastapi/pull/14237) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- ⬆ Bump actions/upload-artifact from 4 to 5. MR [#&#8203;14235](https://github.com/fastapi/fastapi/pull/14235) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).

### [`v0.120.1`](https://github.com/fastapi/fastapi/releases/tag/0.120.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.0...0.120.1)

##### Upgrades

- ⬆️ Bump Starlette to <`0.50.0`. MR [#&#8203;14234](https://github.com/fastapi/fastapi/pull/14234) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Internal

- 🔧 Add `license` and `license-files` to `pyproject.toml`, remove `License` from `classifiers`. MR [#&#8203;14230](https://github.com/fastapi/fastapi/pull/14230) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.120.0`](https://github.com/fastapi/fastapi/releases/tag/0.120.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.119.1...0.120.0)

There are no major nor breaking changes in this release. ☕️

The internal reference documentation now uses `annotated_doc.Doc` instead of `typing_extensions.Doc`, this adds a new (very small) dependency on [`annotated-doc`](https://github.com/fastapi/annotated-doc), a package made just to provide that `Doc` documentation utility class.

I would expect `typing_extensions.Doc` to be deprecated and then removed at some point from `typing_extensions`, for that reason there's the new `annotated-doc` micro-package. If you are curious about this, you can read more in the repo for [`annotated-doc`](https://github.com/fastapi/annotated-doc).

This new version `0.120.0` only contains that transition to the new home package for that utility class `Doc`.

##### Translations

- 🌐 Sync German docs. MR [#&#8203;14188](https://github.com/fastapi/fastapi/pull/14188) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- ➕ Migrate internal reference documentation from `typing_extensions.Doc` to `annotated_doc.Doc`. MR [#&#8203;14222](https://github.com/fastapi/fastapi/pull/14222) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🛠️ Update German LLM prompt and test file. MR [#&#8203;14189](https://github.com/fastapi/fastapi/pull/14189) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14181](https://github.com/fastapi/fastapi/pull/14181) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).

### [`v0.119.1`](https://github.com/fastapi/fastapi/releases/tag/0.119.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.119.0...0.119.1)

##### Fixes

- 🐛 Fix internal Pydantic v1 compatibility (warnings) for Python 3.14 and Pydantic 2.12.1. MR [#&#8203;14186](https://github.com/fastapi/fastapi/pull/14186) by [@&#8203;svlandeg](https://github.com/svlandeg).

##### Docs

- 📝 Replace `starlette.io` by `starlette.dev` and `uvicorn.org` by `uvicorn.dev`. MR [#&#8203;14176](https://github.com/fastapi/fastapi/pull/14176) by [@&#8203;Kludex](https://github.com/Kludex).

##### Internal

- 🔧 Add sponsor Requestly. MR [#&#8203;14205](https://github.com/fastapi/fastapi/pull/14205) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔧 Configure reminder for `waiting` label in `issue-manager`. MR [#&#8203;14156](https://github.com/fastapi/fastapi/pull/14156) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.119.0`](https://github.com/fastapi/fastapi/releases/tag/0.119.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.3...0.119.0)

FastAPI now (temporarily) supports both Pydantic v2 models and `pydantic.v1` models at the same time in the same app, to make it easier for any FastAPI apps still using Pydantic v1 to gradually but quickly **migrate to Pydantic v2**.

```Python
from fastapi import FastAPI
from pydantic import BaseModel as BaseModelV2
from pydantic.v1 import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None

class ItemV2(BaseModelV2):
    title: str
    summary: str | None = None

app = FastAPI()

@&#8203;app.post("/items/", response_model=ItemV2)
def create_item(item: Item):
    return {"title": item.name, "summary": item.description}
```

Adding this feature was a big effort with the main objective of making it easier for the few applications still stuck in Pydantic v1 to migrate to Pydantic v2.

And with this, support for **Pydantic v1 is now deprecated** and will be **removed** from FastAPI in a future version soon.

**Note**: have in mind that the Pydantic team already stopped supporting Pydantic v1 for recent versions of Python, starting with Python 3.14.

You can read in the docs more about how to [Migrate from Pydantic v1 to Pydantic v2](https://fastapi.tiangolo.com/how-to/migrate-from-pydantic-v1-to-pydantic-v2/).

##### Features

- ✨ Add support for `from pydantic.v1 import BaseModel`, mixed Pydantic v1 and v2 models in the same app. MR [#&#8203;14168](https://github.com/fastapi/fastapi/pull/14168) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.118.3`](https://github.com/fastapi/fastapi/releases/tag/0.118.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.2...0.118.3)

##### Upgrades

- ⬆️ Add support for Python 3.14. MR [#&#8203;14165](https://github.com/fastapi/fastapi/pull/14165) by [@&#8203;svlandeg](https://github.com/svlandeg).

### [`v0.118.2`](https://github.com/fastapi/fastapi/releases/tag/0.118.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.1...0.118.2)

##### Fixes

- 🐛 Fix tagged discriminated union not recognized as body field. MR [#&#8203;12942](https://github.com/fastapi/fastapi/pull/12942) by [@&#8203;frankie567](https://github.com/frankie567).

##### Internal

- ⬆ Bump astral-sh/setup-uv from 6 to 7. MR [#&#8203;14167](https://github.com/fastapi/fastapi/pull/14167) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).

### [`v0.118.1`](https://github.com/fastapi/fastapi/releases/tag/0.118.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.0...0.118.1)

##### Upgrades

- 👽️ Ensure compatibility with Pydantic 2.12.0. MR [#&#8203;14036](https://github.com/fastapi/fastapi/pull/14036) by [@&#8203;cjwatson](https://github.com/cjwatson).

##### Docs

- 📝 Add External Link: Getting started with logging in FastAPI. MR [#&#8203;14152](https://github.com/fastapi/fastapi/pull/14152) by [@&#8203;itssimon](https://github.com/itssimon).

##### Translations

- 🔨 Add Russian translations LLM prompt. MR [#&#8203;13936](https://github.com/fastapi/fastapi/pull/13936) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Sync German docs. MR [#&#8203;14149](https://github.com/fastapi/fastapi/pull/14149) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🌐 Add Russian translations for missing pages (LLM-generated). MR [#&#8203;14135](https://github.com/fastapi/fastapi/pull/14135) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Update Russian translations for existing pages (LLM-generated). MR [#&#8203;14123](https://github.com/fastapi/fastapi/pull/14123) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Remove configuration files for inactive translations. MR [#&#8203;14130](https://github.com/fastapi/fastapi/pull/14130) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- 🔨 Move local coverage logic to its own script. MR [#&#8203;14166](https://github.com/fastapi/fastapi/pull/14166) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14161](https://github.com/fastapi/fastapi/pull/14161) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- ⬆ Bump griffe-typingdoc from 0.2.8 to 0.2.9. MR [#&#8203;14144](https://github.com/fastapi/fastapi/pull/14144) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump mkdocs-macros-plugin from 1.3.9 to 1.4.0. MR [#&#8203;14145](https://github.com/fastapi/fastapi/pull/14145) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump markdown-include-variants from 0.0.4 to 0.0.5. MR [#&#8203;14146](https://github.com/fastapi/fastapi/pull/14146) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14126](https://github.com/fastapi/fastapi/pull/14126) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- 👥 Update FastAPI GitHub topic repositories. MR [#&#8203;14150](https://github.com/fastapi/fastapi/pull/14150) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Sponsors. MR [#&#8203;14139](https://github.com/fastapi/fastapi/pull/14139) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Contributors and Translators. MR [#&#8203;14138](https://github.com/fastapi/fastapi/pull/14138) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump ruff from 0.12.7 to 0.13.2. MR [#&#8203;14147](https://github.com/fastapi/fastapi/pull/14147) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump sqlmodel from 0.0.24 to 0.0.25. MR [#&#8203;14143](https://github.com/fastapi/fastapi/pull/14143) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump tiangolo/issue-manager from 0.5.1 to 0.6.0. MR [#&#8203;14148](https://github.com/fastapi/fastapi/pull/14148) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- 👷 Update docs previews comment, single comment, add failure status. MR [#&#8203;14129](https://github.com/fastapi/fastapi/pull/14129) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔨 Modify `mkdocs_hooks.py` to add `title` to page's metadata (remove permalinks in social cards). MR [#&#8203;14125](https://github.com/fastapi/fastapi/pull/14125) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.118.0`](https://github.com/fastapi/fastapi/releases/tag/0.118.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.117.1...0.118.0)

##### 0.118.0

##### Fixes

- 🐛 Fix support for `StreamingResponse`s with dependencies with `yield` or `UploadFile`s, close after the response is done. MR [#&#8203;14099](https://github.com/fastapi/fastapi/pull/14099) by [@&#8203;tiangolo](https://github.com/tiangolo).

Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.

This change also meant that if you returned a `StreamingResponse`, the exit code of the dependency with `yield` would have been already run.

For example, if you had a database session in a dependency with `yield`, the `StreamingResponse` would not be able to use that session while streaming data because the session would have already been closed in the exit code after `yield`.

This behavior was reverted in 0.118.0, to make the exit code after `yield` be executed after the response is sent.

You can read more about it in the docs for [Advanced Dependencies - Dependencies with `yield`, `HTTPException`, `except` and Background Tasks](https://fastapi.tiangolo.com/advanced/advanced-dependencies#dependencies-with-yield-httpexception-except-and-background-tasks). Including what you could do if you wanted to close a database session earlier, before returning the response to the client.

##### Docs

- 📝 Update `tutorial/security/oauth2-jwt/` to use `pwdlib` with Argon2 instead of `passlib`. MR [#&#8203;13917](https://github.com/fastapi/fastapi/pull/13917) by [@&#8203;Neizvestnyj](https://github.com/Neizvestnyj).
- ✏️ Fix typos in OAuth2 password request forms. MR [#&#8203;14112](https://github.com/fastapi/fastapi/pull/14112) by [@&#8203;alv2017](https://github.com/alv2017).
- 📝 Update contributing guidelines for installing requirements. MR [#&#8203;14095](https://github.com/fastapi/fastapi/pull/14095) by [@&#8203;alejsdev](https://github.com/alejsdev).

##### Translations

- 🌐 Sync German docs. MR [#&#8203;14098](https://github.com/fastapi/fastapi/pull/14098) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14103](https://github.com/fastapi/fastapi/pull/14103) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- ♻️ Refactor sponsor image handling. MR [#&#8203;14102](https://github.com/fastapi/fastapi/pull/14102) by [@&#8203;alejsdev](https://github.com/alejsdev).
- 🐛 Fix sponsor display issue by hiding element on image error. MR [#&#8203;14097](https://github.com/fastapi/fastapi/pull/14097) by [@&#8203;alejsdev](https://github.com/alejsdev).
- 🐛 Hide sponsor badge when sponsor image is not displayed. MR [#&#8203;14096](https://github.com/fastapi/fastapi/pull/14096) by [@&#8203;alejsdev](https://github.com/alejsdev).

### [`v0.117.1`](https://github.com/fastapi/fastapi/releases/tag/0.117.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.117.0...0.117.1)

##### Fixes

- 🐛 Fix validation error when `File` is declared after `Form` parameter. MR [#&#8203;11194](https://github.com/fastapi/fastapi/pull/11194) by [@&#8203;thomasleveil](https://github.com/thomasleveil).

### [`v0.117.0`](https://github.com/fastapi/fastapi/releases/tag/0.117.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.116.2...0.117.0)

##### Features

- ✨  Allow `None` as return type for bodiless responses. MR [#&#8203;9425](https://github.com/fastapi/fastapi/pull/9425) by [@&#8203;hofrob](https://github.com/hofrob).
- ✨ Allow array values for OpenAPI schema `type` field. MR [#&#8203;13639](https://github.com/fastapi/fastapi/pull/13639) by [@&#8203;sammasak](https://github.com/sammasak).
- ✨ Add OpenAPI `external_docs` parameter to `FastAPI`. MR [#&#8203;13713](https://github.com/fastapi/fastapi/pull/13713) by [@&#8203;cmtoro](https://github.com/cmtoro).

##### Fixes

- ⚡️ Fix `default_factory` for response model field with Pydantic V1. MR [#&#8203;9704](https://github.com/fastapi/fastapi/pull/9704) by [@&#8203;vvanglro](https://github.com/vvanglro).
- 🐛 Fix inconsistent processing of model docstring formfeed char with Pydantic V1. MR [#&#8203;6039](https://github.com/fastapi/fastapi/pull/6039) by [@&#8203;MaxwellPayne](https://github.com/MaxwellPayne).
- 🐛 Fix `jsonable_encoder` alters `json_encoders` of Pydantic v1 objects. MR [#&#8203;4972](https://github.com/fastapi/fastapi/pull/4972) by [@&#8203;aboubacs](https://github.com/aboubacs).
- 🐛 Reenable `allow_arbitrary_types` when only 1 argument is used on the API endpoint. MR [#&#8203;13694](https://github.com/fastapi/fastapi/pull/13694) by [@&#8203;rmawatson](https://github.com/rmawatson).
- 🐛 Fix `inspect.getcoroutinefunction()` can break testing with `unittest.mock.patch()`. MR [#&#8203;14022](https://github.com/fastapi/fastapi/pull/14022) by [@&#8203;secrett2633](https://github.com/secrett2633).

##### Refactors

- ♻️ Create `dependency-cache` dict in `solve_dependencies` only if `None` (don't re-create if empty). MR [#&#8203;13689](https://github.com/fastapi/fastapi/pull/13689) by [@&#8203;bokshitsky](https://github.com/bokshitsky).
- ✅ Enable test case for duplicated headers in `test_tutorial/test_header_params/test_tutorial003.py`. MR [#&#8203;13864](https://github.com/fastapi/fastapi/pull/13864) by [@&#8203;Amogha-ark](https://github.com/Amogha-ark).
- 📌 Pin `httpx` to `>=0.23.0,<1.0.0`. MR [#&#8203;14086](https://github.com/fastapi/fastapi/pull/14086) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Docs

- 📝 Add note about Cookies and JavaScript on `tutorial/cookie-params.md`. MR [#&#8203;13510](https://github.com/fastapi/fastapi/pull/13510) by [@&#8203;Kludex](https://github.com/Kludex).
- 📝 Remove outdated formatting from `path-params-numeric-validations.md` for languages `en`, `es` and `uk`.. MR [#&#8203;14059](https://github.com/fastapi/fastapi/pull/14059) by [@&#8203;svlandeg](https://github.com/svlandeg).
- 📝 Fix and Improve English Documentation. MR [#&#8203;14048](https://github.com/fastapi/fastapi/pull/14048) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Translations

- 📝 Update prompts and German translation. MR [#&#8203;14015](https://github.com/fastapi/fastapi/pull/14015) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- ✅ Simplify tests for response\_model. MR [#&#8203;14062](https://github.com/fastapi/fastapi/pull/14062) by [@&#8203;dynamicy](https://github.com/dynamicy).
- 🚨 Install pydantic.mypy plugin. MR [#&#8203;14081](https://github.com/fastapi/fastapi/pull/14081) by [@&#8203;svlandeg](https://github.com/svlandeg).
- ✅ Add LLM test file. MR [#&#8203;14049](https://github.com/fastapi/fastapi/pull/14049) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🔨 Update translations script. MR [#&#8203;13968](https://github.com/fastapi/fastapi/pull/13968) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🛠️ Update `docs.py generate-readme` command to remove permalinks from headers. MR [#&#8203;14055](https://github.com/fastapi/fastapi/pull/14055) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- ⬆️ Update mypy to 1.14.1. MR [#&#8203;12970](https://github.com/fastapi/fastapi/pull/12970) by [@&#8203;tamird](https://github.com/tamird).

### [`v0.116.2`](https://github.com/fastapi/fastapi/releases/tag/0.116.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.116.1...0.116.2)

##### Upgrades

- ⬆️ Upgrade Starlette supported version range to >=0.40.0,<0.49.0. MR [#&#8203;14077](https://github.com/fastapi/fastapi/pull/14077) by [@&#8203;musicinmybrain](https://github.com/musicinmybrain).

##### Docs

- 📝 Add documentation for Behind a Proxy - Proxy Forwarded Headers, using `--forwarded-allow-ips="*"`. MR [#&#8203;14028](https://github.com/fastapi/fastapi/pull/14028) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 📝 Add deprecation info block about `dict()` in `docs/tutorial/body.md`. MR [#&#8203;13906](https://github.com/fastapi/fastapi/pull/13906) by [@&#8203;jomkv](https://github.com/jomkv).
- 📝 Fix Twitter to be X (Twitter) everywhere in documentation. MR [#&#8203;13809](https://gith…
736-c41-2c1-e464fc974 added a commit to Swiss-Armed-Forces/Loom that referenced this pull request Jan 14, 2026
fix(deps): update backend dependencies (minor) (minor)

This MR contains the following updates:

| Package | Type | Update | Change | OpenSSF |
|---|---|---|---|---|
| [celery](https://docs.celeryq.dev/) ([source](https://github.com/celery/celery), [changelog](https://docs.celeryq.dev/en/stable/changelog.html)) | dependencies | minor | `5.5.3` → `5.6.2` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/celery/celery/badge)](https://securityscorecards.dev/viewer/?uri=github.com/celery/celery) |
| [celery-types](https://github.com/sbdchd/celery-types) | dependencies | minor | `^0.22.0` → `^0.24.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/sbdchd/celery-types/badge)](https://securityscorecards.dev/viewer/?uri=github.com/sbdchd/celery-types) |
| [fastapi](https://github.com/fastapi/fastapi) ([changelog](https://fastapi.tiangolo.com/release-notes/)) | dependencies | minor | `^0.115.12` → `^0.128.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/fastapi/fastapi/badge)](https://securityscorecards.dev/viewer/?uri=github.com/fastapi/fastapi) |
| [filelock](https://github.com/tox-dev/py-filelock) | dependencies | minor | `3.14.0` → `3.20.3` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/tox-dev/py-filelock/badge)](https://securityscorecards.dev/viewer/?uri=github.com/tox-dev/py-filelock) |
| [luqum](https://github.com/jurismarches/luqum) | dependencies | minor | `^0.13.0` → `^0.14.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jurismarches/luqum/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jurismarches/luqum) |
| [ollama](https://github.com/ollama/ollama-python) | dependencies | minor | `^0.5.1` → `^0.6.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/ollama/ollama-python/badge)](https://securityscorecards.dev/viewer/?uri=github.com/ollama/ollama-python) |
| [pycryptodome](https://www.pycryptodome.org) ([source](https://github.com/Legrandin/pycryptodome), [changelog](https://www.pycryptodome.org/src/changelog)) | dependencies | minor | `3.20.0` → `3.23.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Legrandin/pycryptodome/badge)](https://securityscorecards.dev/viewer/?uri=github.com/Legrandin/pycryptodome) |
| [pydantic-mongo](https://github.com/jefersondaniel/pydantic-mongo) | dependencies | minor | `2.3.0` → `2.4.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/jefersondaniel/pydantic-mongo/badge)](https://securityscorecards.dev/viewer/?uri=github.com/jefersondaniel/pydantic-mongo) |
| [pydantic-settings](https://github.com/pydantic/pydantic-settings) ([changelog](https://github.com/pydantic/pydantic-settings/releases)) | dependencies | minor | `2.2.1` → `2.12.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pydantic/pydantic-settings/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pydantic/pydantic-settings) |
| [pymongo](https://github.com/mongodb/mongo-python-driver) | dependencies | minor | `4.15.5` → `4.16.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mongodb/mongo-python-driver/badge)](https://securityscorecards.dev/viewer/?uri=github.com/mongodb/mongo-python-driver) |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) ([changelog](https://pytest-asyncio.readthedocs.io/en/latest/reference/changelog.html)) | dependencies | minor | `^0.23.6` → `^0.26.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-asyncio/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-asyncio) |
| [pytest-timeout](https://github.com/pytest-dev/pytest-timeout) | dependencies | minor | `2.3.1` → `2.4.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/pytest-dev/pytest-timeout/badge)](https://securityscorecards.dev/viewer/?uri=github.com/pytest-dev/pytest-timeout) |
| [scikit-learn](https://github.com/scikit-learn/scikit-learn) ([changelog](https://scikit-learn.org/stable/whats_new)) | dependencies | minor | `1.7.0` → `1.8.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/scikit-learn/scikit-learn/badge)](https://securityscorecards.dev/viewer/?uri=github.com/scikit-learn/scikit-learn) |
| [scikit-learn](https://github.com/scikit-learn/scikit-learn) ([changelog](https://scikit-learn.org/stable/whats_new)) | dependencies | minor | `1.6.1` → `1.8.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/scikit-learn/scikit-learn/badge)](https://securityscorecards.dev/viewer/?uri=github.com/scikit-learn/scikit-learn) |
| [scipy](https://github.com/scipy/scipy) | dependencies | minor | `1.15.3` → `1.17.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/scipy/scipy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/scipy/scipy) |
| [uvicorn](https://github.com/Kludex/uvicorn) ([changelog](https://uvicorn.dev/release-notes)) | dependencies | minor | `^0.29.0` → `^0.40.0` | [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/Kludex/uvicorn/badge)](https://securityscorecards.dev/viewer/?uri=github.com/Kludex/uvicorn) |

---

### Release Notes

<details>
<summary>celery/celery (celery)</summary>

### [`v5.6.2`](https://github.com/celery/celery/blob/HEAD/Changelog.rst#562)

[Compare Source](https://github.com/celery/celery/compare/v5.6.1...v5.6.2)

\=====

:release-date: 2026-01-04
:release-by: Tomer Nosrati

What's Changed

```

- Fix recursive WorkController instantiation in DjangoWorkerFixup + AttributeError when pool_cls is a string (#&#8203;10045)
- Bugfix: Revoked tasks now immediately update backend status to REVOKED (#&#8203;9869)
- Prepare for release: v5.6.2 (#&#8203;10049)

.. _version-5.6.1:

5.6.1
=====

:release-date: 2025-12-29
:release-by: Tomer Nosrati

What's Changed
```

- Fix Redis Sentinel ACL authentication support ([#&#8203;10013](https://github.com/celery/celery/issues/10013))
- Fix: Broker heartbeats not sent during graceful shutdown ([#&#8203;9986](https://github.com/celery/celery/issues/9986))
- docs [#&#8203;5410](https://github.com/celery/celery/issues/5410) -- Document confirm\_publish broker transport option ([#&#8203;10016](https://github.com/celery/celery/issues/10016))
- close DB pools only in prefork mode ([#&#8203;10020](https://github.com/celery/celery/issues/10020))
- Fix: Avoid unnecessary Django database connection creation during cleanup ([#&#8203;10015](https://github.com/celery/celery/issues/10015))
- reliable prefork detection ([#&#8203;10023](https://github.com/celery/celery/issues/10023))
- better coverage ([#&#8203;10029](https://github.com/celery/celery/issues/10029))
- Docs: clarify `result_extended` vs periodic task metadata and show `headers["periodic_task_name"]` example ([#&#8203;10030](https://github.com/celery/celery/issues/10030))
- Stop importing pytest\_subtests ([#&#8203;10032](https://github.com/celery/celery/issues/10032))
- Only use exceptiongroup backport for Python < 3.11 ([#&#8203;10033](https://github.com/celery/celery/issues/10033))
- Prepare for release: v5.6.1 ([#&#8203;10037](https://github.com/celery/celery/issues/10037))

.. \_version-5.6.0:

### [`v5.6.1`](https://github.com/celery/celery/releases/tag/v5.6.1)

[Compare Source](https://github.com/celery/celery/compare/v5.6.0...v5.6.1)

#### What's Changed

- Fix Redis Sentinel ACL authentication support by [@&#8203;anthonykuzmich7](https://github.com/anthonykuzmich7) in [#&#8203;10013](https://github.com/celery/celery/pull/10013)
- Fix: Broker heartbeats not sent during graceful shutdown by [@&#8203;weetster](https://github.com/weetster) in [#&#8203;9986](https://github.com/celery/celery/pull/9986)
- docs [#&#8203;5410](https://github.com/celery/celery/issues/5410) -- Document confirm\_publish broker transport option by [@&#8203;JaeHyuckSa](https://github.com/JaeHyuckSa) in [#&#8203;10016](https://github.com/celery/celery/pull/10016)
- close DB pools only in prefork mode by [@&#8203;petrprikryl](https://github.com/petrprikryl) in [#&#8203;10020](https://github.com/celery/celery/pull/10020)
- Fix: Avoid unnecessary Django database connection creation during cleanup by [@&#8203;snopoke](https://github.com/snopoke) in [#&#8203;10015](https://github.com/celery/celery/pull/10015)
- reliable prefork detection by [@&#8203;petrprikryl](https://github.com/petrprikryl) in [#&#8203;10023](https://github.com/celery/celery/pull/10023)
- better coverage by [@&#8203;petrprikryl](https://github.com/petrprikryl) in [#&#8203;10029](https://github.com/celery/celery/pull/10029)
- Docs: clarify `result_extended` vs periodic task metadata and show `headers["periodic_task_name"]` example by [@&#8203;SpaceShaman](https://github.com/SpaceShaman) in [#&#8203;10030](https://github.com/celery/celery/pull/10030)
- Stop importing pytest\_subtests by [@&#8203;cjwatson](https://github.com/cjwatson) in [#&#8203;10032](https://github.com/celery/celery/pull/10032)
- Only use exceptiongroup backport for Python < 3.11 by [@&#8203;cjwatson](https://github.com/cjwatson) in [#&#8203;10033](https://github.com/celery/celery/pull/10033)
- Prepare for release: v5.6.1 by [@&#8203;Nusnus](https://github.com/Nusnus) in [#&#8203;10037](https://github.com/celery/celery/pull/10037)

#### New Contributors

- [@&#8203;anthonykuzmich7](https://github.com/anthonykuzmich7) made their first contribution in [#&#8203;10013](https://github.com/celery/celery/pull/10013)
- [@&#8203;weetster](https://github.com/weetster) made their first contribution in [#&#8203;9986](https://github.com/celery/celery/pull/9986)
- [@&#8203;JaeHyuckSa](https://github.com/JaeHyuckSa) made their first contribution in [#&#8203;10016](https://github.com/celery/celery/pull/10016)
- [@&#8203;snopoke](https://github.com/snopoke) made their first contribution in [#&#8203;10015](https://github.com/celery/celery/pull/10015)
- [@&#8203;SpaceShaman](https://github.com/SpaceShaman) made their first contribution in [#&#8203;10030](https://github.com/celery/celery/pull/10030)

**Full Changelog**: <https://github.com/celery/celery/compare/v5.6.0...v5.6.1>

### [`v5.6.0`](https://github.com/celery/celery/blob/HEAD/Changelog.rst#560)

[Compare Source](https://github.com/celery/celery/compare/v5.5.3...v5.6.0)

\=====

:release-date: 2025-11-30
:release-by: Tomer Nosrati

Celery v5.6.0 is now available.

Key Highlights

```

See :ref:`whatsnew-5.6` for a complete overview or read the main highlights below.

Python 3.9 Minimum Version
--------------------------

Celery 5.6.0 drops support for Python 3.8 (EOL). The minimum required Python
version is now 3.9. Users still on Python 3.8 must upgrade their Python version
before upgrading to Celery 5.6.0.

Additionally, this release includes initial support for Python 3.14.

SQS: Reverted to ``pycurl`` from ``urllib3``
--------------------------------------------

The switch from ``pycurl`` to ``urllib3`` for the SQS transport (introduced in
Celery 5.5.0 via Kombu) has been reverted due to critical issues affecting SQS
users:

- Processing throughput dropped from ~100 tasks/sec to ~3/sec in some environments
- ``UnknownOperationException`` errors causing container crash loops
- Silent message processing failures with no error logs

Users of the SQS transport must ensure ``pycurl`` is installed. If you removed
``pycurl`` after upgrading to Celery 5.5.0, you will need to reinstall it.

Contributed by `@auvipy <https://github.com/auvipy>`_ in
`#&#8203;9620 <https://github.com/celery/celery/pull/9620>`_.

Security Fix: Broker Credential Leak Prevention
------------------------------------------------

Fixed a security issue where broker URLs containing passwords were being logged
in plaintext by the delayed delivery mechanism. Broker credentials are now
properly sanitized in all log output.

Contributed by `@giancarloromeo <https://github.com/giancarloromeo>`_ in
`#&#8203;9997 <https://github.com/celery/celery/pull/9997>`_.

Memory Leak Fixes
-----------------

Two significant memory leaks have been fixed in this release:

**Exception Handling Memory Leak**: Fixed a critical memory leak in task exception
handling that was particularly severe on Python 3.11+ due to enhanced traceback
data. The fix properly breaks reference cycles in tracebacks to allow garbage
collection.

Contributed by `@jaiganeshs21 <https://github.com/jaiganeshs21>`_ in
`#&#8203;9799 <https://github.com/celery/celery/pull/9799>`_.

**Pending Result Memory Leak**: Fixed a memory leak where ``AsyncResult``
subscriptions were not being cleaned up when results were forgotten.

Contributed by `@tsoos99dev <https://github.com/tsoos99dev>`_ in
`#&#8203;9806 <https://github.com/celery/celery/pull/9806>`_.

ETA Task Memory Limit
---------------------

New configuration option :setting:`worker_eta_task_limit` to prevent out-of-memory
crashes when workers fetch large numbers of ETA or countdown tasks. Previously,
workers could exhaust available memory when the broker contained many scheduled tasks.

Example usage:

.. code-block:: python

    app.conf.worker_eta_task_limit = 1000

Contributed by `@sashu2310 <https://github.com/sashu2310>`_ in
`#&#8203;9853 <https://github.com/celery/celery/pull/9853>`_.

Queue Type Selection for Auto-created Queues
--------------------------------------------

New configuration options allow specifying the queue type and exchange type when
Celery auto-creates missing queues. This is particularly useful for RabbitMQ users
who want to use quorum queues with auto-created queues.

Configuration options:

- :setting:`task_create_missing_queue_type`: Sets the queue type for auto-created
  queues (e.g., ``quorum``, ``classic``)
- :setting:`task_create_missing_queue_exchange_type`: Sets the exchange type for
  auto-created queues

Example usage:

.. code-block:: python

    app.conf.task_create_missing_queue_type = 'quorum'

Contributed by `@ghirailghiro <https://github.com/ghirailghiro>`_ in
`#&#8203;9815 <https://github.com/celery/celery/pull/9815>`_.

What's Changed
```

- Prepare for release: v5.6.0 ([#&#8203;10010](https://github.com/celery/celery/issues/10010))

.. \_version-5.6.0rc2:

</details>

<details>
<summary>fastapi/fastapi (fastapi)</summary>

### [`v0.128.0`](https://github.com/fastapi/fastapi/releases/tag/0.128.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.127.1...0.128.0)

##### Breaking Changes

- ➖ Drop support for `pydantic.v1`. MR [#&#8203;14609](https://github.com/fastapi/fastapi/pull/14609) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ✅ Run performance tests only on Pydantic v2. MR [#&#8203;14608](https://github.com/fastapi/fastapi/pull/14608) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.127.1`](https://github.com/fastapi/fastapi/releases/tag/0.127.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.127.0...0.127.1)

##### Refactors

- 🔊 Add a custom `FastAPIDeprecationWarning`. MR [#&#8203;14605](https://github.com/fastapi/fastapi/pull/14605) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Add documentary to website. MR [#&#8203;14600](https://github.com/fastapi/fastapi/pull/14600) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Update translations for de (update-outdated). MR [#&#8203;14602](https://github.com/fastapi/fastapi/pull/14602) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🌐 Update translations for de (update-outdated). MR [#&#8203;14581](https://github.com/fastapi/fastapi/pull/14581) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- 🔧 Update pre-commit to use local Ruff instead of hook. MR [#&#8203;14604](https://github.com/fastapi/fastapi/pull/14604) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ✅ Add missing tests for code examples. MR [#&#8203;14569](https://github.com/fastapi/fastapi/pull/14569) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👷 Remove `lint` job from `test` CI workflow. MR [#&#8203;14593](https://github.com/fastapi/fastapi/pull/14593) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👷 Update secrets check. MR [#&#8203;14592](https://github.com/fastapi/fastapi/pull/14592) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Run CodSpeed tests in parallel to other tests to speed up CI. MR [#&#8203;14586](https://github.com/fastapi/fastapi/pull/14586) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔨 Update scripts and pre-commit to autofix files. MR [#&#8203;14585](https://github.com/fastapi/fastapi/pull/14585) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.127.0`](https://github.com/fastapi/fastapi/releases/tag/0.127.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.126.0...0.127.0)

##### Breaking Changes

- 🔊 Add deprecation warnings when using `pydantic.v1`. MR [#&#8203;14583](https://github.com/fastapi/fastapi/pull/14583) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🔧 Add LLM prompt file for Korean, generated from the existing translations. MR [#&#8203;14546](https://github.com/fastapi/fastapi/pull/14546) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔧 Add LLM prompt file for Japanese, generated from the existing translations. MR [#&#8203;14545](https://github.com/fastapi/fastapi/pull/14545) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆️ Upgrade OpenAI model for translations to gpt-5.2. MR [#&#8203;14579](https://github.com/fastapi/fastapi/pull/14579) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.126.0`](https://github.com/fastapi/fastapi/releases/tag/0.126.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.125.0...0.126.0)

##### Upgrades

- ➖ Drop support for Pydantic v1, keeping short temporary support for Pydantic v2's `pydantic.v1`. MR [#&#8203;14575](https://github.com/fastapi/fastapi/pull/14575) by [@&#8203;tiangolo](https://github.com/tiangolo).
  - The minimum version of Pydantic installed is now `pydantic >=2.7.0`.
  - The `standard` dependencies now include `pydantic-settings >=2.0.0` and `pydantic-extra-types >=2.0.0`.

##### Docs

- 📝 Fix duplicated variable in `docs_src/python_types/tutorial005_py39.py`. MR [#&#8203;14565](https://github.com/fastapi/fastapi/pull/14565) by [@&#8203;paras-verma7454](https://github.com/paras-verma7454).

##### Translations

- 🔧 Add LLM prompt file for Ukrainian, generated from the existing translations. MR [#&#8203;14548](https://github.com/fastapi/fastapi/pull/14548) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- 🔧 Tweak pre-commit to allow committing release-notes. MR [#&#8203;14577](https://github.com/fastapi/fastapi/pull/14577) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆️ Use prek as a pre-commit alternative. MR [#&#8203;14572](https://github.com/fastapi/fastapi/pull/14572) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Add performance tests with CodSpeed. MR [#&#8203;14558](https://github.com/fastapi/fastapi/pull/14558) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.125.0`](https://github.com/fastapi/fastapi/releases/tag/0.125.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.4...0.125.0)

##### Breaking Changes

- 🔧 Drop support for Python 3.8. MR [#&#8203;14563](https://github.com/fastapi/fastapi/pull/14563) by [@&#8203;tiangolo](https://github.com/tiangolo).
  - This would actually not be a *breaking* change as no code would really break. Any Python 3.8 installer would just refuse to install the latest version of FastAPI and would only install 0.124.4. Only marking it as a "breaking change" to make it visible.

##### Refactors

- ♻️ Upgrade internal syntax to Python 3.9+ 🎉. MR [#&#8203;14564](https://github.com/fastapi/fastapi/pull/14564) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- ⚰️ Remove Python 3.8 from CI and remove Python 3.8 examples from source docs. MR [#&#8203;14559](https://github.com/fastapi/fastapi/pull/14559) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov) and [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Update translations for pt (add-missing). MR [#&#8203;14539](https://github.com/fastapi/fastapi/pull/14539) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔧 Add LLM prompt file for French, generated from the existing French docs. MR [#&#8203;14544](https://github.com/fastapi/fastapi/pull/14544) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Sync Portuguese docs (pages found with script). MR [#&#8203;14554](https://github.com/fastapi/fastapi/pull/14554) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync Spanish docs (outdated pages found with script). MR [#&#8203;14553](https://github.com/fastapi/fastapi/pull/14553) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync German docs. MR [#&#8203;14519](https://github.com/fastapi/fastapi/pull/14519) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🔥 Remove inactive/scarce translations to Vietnamese. MR [#&#8203;14543](https://github.com/fastapi/fastapi/pull/14543) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔥 Remove inactive/scarce translations to Persian. MR [#&#8203;14542](https://github.com/fastapi/fastapi/pull/14542) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔥 Remove translation to emoji to simplify the new setup with LLM autotranslations. MR [#&#8203;14541](https://github.com/fastapi/fastapi/pull/14541) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Update translations for pt (update-outdated). MR [#&#8203;14537](https://github.com/fastapi/fastapi/pull/14537) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Update translations for es (update-outdated). MR [#&#8203;14532](https://github.com/fastapi/fastapi/pull/14532) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Update translations for es (add-missing). MR [#&#8203;14533](https://github.com/fastapi/fastapi/pull/14533) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Remove translations for removed docs. MR [#&#8203;14516](https://github.com/fastapi/fastapi/pull/14516) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆ Bump `markdown-include-variants` from 0.0.7 to 0.0.8. MR [#&#8203;14556](https://github.com/fastapi/fastapi/pull/14556) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🔧 Temporarily disable translations still in progress, being migrated to the new LLM setup. MR [#&#8203;14555](https://github.com/fastapi/fastapi/pull/14555) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🔧 Update test workflow config, remove commented code. MR [#&#8203;14540](https://github.com/fastapi/fastapi/pull/14540) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Configure coverage, error on main tests, don't wait for Smokeshow. MR [#&#8203;14536](https://github.com/fastapi/fastapi/pull/14536) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Run Smokeshow always, even on test failures. MR [#&#8203;14538](https://github.com/fastapi/fastapi/pull/14538) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Make Pydantic versions customizable in CI. MR [#&#8203;14535](https://github.com/fastapi/fastapi/pull/14535) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Fix checkout GitHub Action fetch-depth for LLM translations, enable cron monthly. MR [#&#8203;14531](https://github.com/fastapi/fastapi/pull/14531) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Fix Typer command for CI LLM translations. MR [#&#8203;14530](https://github.com/fastapi/fastapi/pull/14530) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Update LLM translation CI, add language matrix and extra commands, prepare for scheduled run. MR [#&#8203;14529](https://github.com/fastapi/fastapi/pull/14529) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Update github-actions user for GitHub Actions workflows. MR [#&#8203;14528](https://github.com/fastapi/fastapi/pull/14528) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ➕ Add requirements for translations. MR [#&#8203;14515](https://github.com/fastapi/fastapi/pull/14515) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.124.4`](https://github.com/fastapi/fastapi/releases/tag/0.124.4)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.3...0.124.4)

##### Fixes

- 🐛 Fix parameter aliases. MR [#&#8203;14371](https://github.com/fastapi/fastapi/pull/14371) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.124.3`](https://github.com/fastapi/fastapi/releases/tag/0.124.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.2...0.124.3)

##### Fixes

- 🐛 Fix support for tagged union with discriminator inside of `Annotated` with `Body()`. MR [#&#8203;14512](https://github.com/fastapi/fastapi/pull/14512) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Refactors

- ✅ Add set of tests for request parameters and alias. MR [#&#8203;14358](https://github.com/fastapi/fastapi/pull/14358) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Docs

- 📝 Tweak links format. MR [#&#8203;14505](https://github.com/fastapi/fastapi/pull/14505) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 📝 Update docs about re-raising validation errors, do not include string as is to not leak information. MR [#&#8203;14487](https://github.com/fastapi/fastapi/pull/14487) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔥 Remove external links section. MR [#&#8203;14486](https://github.com/fastapi/fastapi/pull/14486) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Sync Russian docs. MR [#&#8203;14509](https://github.com/fastapi/fastapi/pull/14509) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync German docs. MR [#&#8203;14488](https://github.com/fastapi/fastapi/pull/14488) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- 👷 Tweak coverage to not pass Smokeshow max file size limit. MR [#&#8203;14507](https://github.com/fastapi/fastapi/pull/14507) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ✅ Expand test matrix to include Windows and MacOS. MR [#&#8203;14171](https://github.com/fastapi/fastapi/pull/14171) by [@&#8203;svlandeg](https://github.com/svlandeg).

### [`v0.124.2`](https://github.com/fastapi/fastapi/releases/tag/0.124.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.1...0.124.2)

##### Fixes

- 🐛 Fix support for `if TYPE_CHECKING`,  non-evaluated stringified annotations. MR [#&#8203;14485](https://github.com/fastapi/fastapi/pull/14485) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.124.1`](https://github.com/fastapi/fastapi/releases/tag/0.124.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.124.0...0.124.1)

##### Fixes

- 🐛 Fix handling arbitrary types when using `arbitrary_types_allowed=True`. MR [#&#8203;14482](https://github.com/fastapi/fastapi/pull/14482) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Add variants for code examples in "Advanced User Guide". MR [#&#8203;14413](https://github.com/fastapi/fastapi/pull/14413) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 📝 Update tech stack in project generation docs. MR [#&#8203;14472](https://github.com/fastapi/fastapi/pull/14472) by [@&#8203;alejsdev](https://github.com/alejsdev).

##### Internal

- ✅ Add test for Pydantic v2, dataclasses, UUID, and `__annotations__`. MR [#&#8203;14477](https://github.com/fastapi/fastapi/pull/14477) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.124.0`](https://github.com/fastapi/fastapi/releases/tag/0.124.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.10...0.124.0)

##### Features

- 🚸  Improve tracebacks by adding endpoint metadata. MR [#&#8203;14306](https://github.com/fastapi/fastapi/pull/14306) by [@&#8203;savannahostrowski](https://github.com/savannahostrowski).

##### Internal

- ✏️ Fix typo in `scripts/mkdocs_hooks.py`. MR [#&#8203;14457](https://github.com/fastapi/fastapi/pull/14457) by [@&#8203;yujiteshima](https://github.com/yujiteshima).

### [`v0.123.10`](https://github.com/fastapi/fastapi/releases/tag/0.123.10)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.9...0.123.10)

##### Fixes

- 🐛 Fix using class (not instance) dependency that has `__call__` method. MR [#&#8203;14458](https://github.com/fastapi/fastapi/pull/14458) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix `separate_input_output_schemas=False` with `computed_field`. MR [#&#8203;14453](https://github.com/fastapi/fastapi/pull/14453) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.123.9`](https://github.com/fastapi/fastapi/releases/tag/0.123.9)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.8...0.123.9)

##### Fixes

- 🐛 Fix OAuth2 scopes in OpenAPI in extra corner cases, parent dependency with scopes, sub-dependency security scheme without scopes. MR [#&#8203;14459](https://github.com/fastapi/fastapi/pull/14459) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.8`](https://github.com/fastapi/fastapi/releases/tag/0.123.8)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.7...0.123.8)

##### Fixes

- 🐛 Fix OpenAPI security scheme OAuth2 scopes declaration, deduplicate security schemes with different scopes. MR [#&#8203;14455](https://github.com/fastapi/fastapi/pull/14455) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.7`](https://github.com/fastapi/fastapi/releases/tag/0.123.7)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.6...0.123.7)

##### Fixes

- 🐛 Fix evaluating stringified annotations in Python 3.10. MR [#&#8203;11355](https://github.com/fastapi/fastapi/pull/11355) by [@&#8203;chaen](https://github.com/chaen).

### [`v0.123.6`](https://github.com/fastapi/fastapi/releases/tag/0.123.6)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.5...0.123.6)

##### Fixes

- 🐛 Fix support for functools wraps and partial combined, for async and regular functions and classes in path operations and dependencies. MR [#&#8203;14448](https://github.com/fastapi/fastapi/pull/14448) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.5`](https://github.com/fastapi/fastapi/releases/tag/0.123.5)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.4...0.123.5)

##### Features

- ✨ Allow using dependables with `functools.partial()`. MR [#&#8203;9753](https://github.com/fastapi/fastapi/pull/9753) by [@&#8203;lieryan](https://github.com/lieryan).
- ✨ Add support for wrapped functions (e.g. `@functools.wraps()`) used with forward references. MR [#&#8203;5077](https://github.com/fastapi/fastapi/pull/5077) by [@&#8203;lucaswiman](https://github.com/lucaswiman).
- ✨ Handle wrapped dependencies. MR [#&#8203;9555](https://github.com/fastapi/fastapi/pull/9555) by [@&#8203;phy1729](https://github.com/phy1729).

##### Fixes

- 🐛 Fix optional sequence handling with new union syntax from Python 3.10. MR [#&#8203;14430](https://github.com/fastapi/fastapi/pull/14430) by [@&#8203;Viicos](https://github.com/Viicos).

##### Refactors

- 🔥 Remove dangling extra condiitonal no longer needed. MR [#&#8203;14435](https://github.com/fastapi/fastapi/pull/14435) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ♻️ Refactor internals, update `is_coroutine` check to reuse internal supported variants (unwrap, check class). MR [#&#8203;14434](https://github.com/fastapi/fastapi/pull/14434) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Translations

- 🌐 Sync German docs. MR [#&#8203;14367](https://github.com/fastapi/fastapi/pull/14367) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

### [`v0.123.4`](https://github.com/fastapi/fastapi/releases/tag/0.123.4)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.3...0.123.4)

##### Fixes

- 🐛 Fix OpenAPI schema support for computed fields when using `separate_input_output_schemas=False`. MR [#&#8203;13207](https://github.com/fastapi/fastapi/pull/13207) by [@&#8203;vgrafe](https://github.com/vgrafe).

##### Docs

- 📝 Fix docstring of `servers` parameter. MR [#&#8203;14405](https://github.com/fastapi/fastapi/pull/14405) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.123.3`](https://github.com/fastapi/fastapi/releases/tag/0.123.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.2...0.123.3)

##### Fixes

- 🐛 Fix Query\Header\Cookie parameter model alias. MR [#&#8203;14360](https://github.com/fastapi/fastapi/pull/14360) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix optional sequence handling in `serialize sequence value` with Pydantic V2. MR [#&#8203;14297](https://github.com/fastapi/fastapi/pull/14297) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.123.2`](https://github.com/fastapi/fastapi/releases/tag/0.123.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.1...0.123.2)

##### Fixes

- 🐛 Fix unformatted `{type_}` in FastAPIError. MR [#&#8203;14416](https://github.com/fastapi/fastapi/pull/14416) by [@&#8203;Just-Helpful](https://github.com/Just-Helpful).
- 🐛 Fix parsing extra non-body parameter list. MR [#&#8203;14356](https://github.com/fastapi/fastapi/pull/14356) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix parsing extra `Form` parameter list. MR [#&#8203;14303](https://github.com/fastapi/fastapi/pull/14303) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🐛 Fix support for form values with empty strings interpreted as missing (`None` if that's the default), for compatibility with HTML forms. MR [#&#8203;13537](https://github.com/fastapi/fastapi/pull/13537) by [@&#8203;MarinPostma](https://github.com/MarinPostma).

##### Docs

- 📝 Add tip on how to install `pip` in case of `No module named pip` error in `virtual-environments.md`. MR [#&#8203;14211](https://github.com/fastapi/fastapi/pull/14211) by [@&#8203;zadevhub](https://github.com/zadevhub).
- 📝 Update Primary Key notes for the SQL databases tutorial to avoid confusion. MR [#&#8203;14120](https://github.com/fastapi/fastapi/pull/14120) by [@&#8203;FlaviusRaducu](https://github.com/FlaviusRaducu).
- 📝 Clarify estimation note in documentation. MR [#&#8203;14070](https://github.com/fastapi/fastapi/pull/14070) by [@&#8203;SaisakthiM](https://github.com/SaisakthiM).

### [`v0.123.1`](https://github.com/fastapi/fastapi/releases/tag/0.123.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.123.0...0.123.1)

##### Fixes

- 🐛 Avoid accessing non-existing "$ref" key for Pydantic v2 compat remapping. MR [#&#8203;14361](https://github.com/fastapi/fastapi/pull/14361) by [@&#8203;svlandeg](https://github.com/svlandeg).
- 🐛 Fix `TypeError` when encoding a decimal with a `NaN` or `Infinity` value. MR [#&#8203;12935](https://github.com/fastapi/fastapi/pull/12935) by [@&#8203;kentwelcome](https://github.com/kentwelcome).

##### Internal

- 🐛 Fix Windows UnicodeEncodeError in CLI test. MR [#&#8203;14295](https://github.com/fastapi/fastapi/pull/14295) by [@&#8203;hemanth-thirthahalli](https://github.com/hemanth-thirthahalli).
- 🔧 Update sponsors: add Greptile. MR [#&#8203;14429](https://github.com/fastapi/fastapi/pull/14429) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI GitHub topic repositories. MR [#&#8203;14426](https://github.com/fastapi/fastapi/pull/14426) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump markdown-include-variants from 0.0.6 to 0.0.7. MR [#&#8203;14423](https://github.com/fastapi/fastapi/pull/14423) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👥 Update FastAPI People - Sponsors. MR [#&#8203;14422](https://github.com/fastapi/fastapi/pull/14422) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Contributors and Translators. MR [#&#8203;14420](https://github.com/fastapi/fastapi/pull/14420) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.123.0`](https://github.com/fastapi/fastapi/releases/tag/0.123.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.122.1...0.123.0)

##### Fixes

- 🐛 Cache dependencies that don't use scopes and don't have sub-dependencies with scopes. MR [#&#8203;14419](https://github.com/fastapi/fastapi/pull/14419) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.122.1`](https://github.com/fastapi/fastapi/releases/tag/0.122.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.122.0...0.122.1)

##### Fixes

- 🐛 Fix hierarchical security scope propagation. MR [#&#8203;5624](https://github.com/fastapi/fastapi/pull/5624) by [@&#8203;kristjanvalur](https://github.com/kristjanvalur).

##### Docs

- 💅 Update CSS to explicitly use emoji font. MR [#&#8203;14415](https://github.com/fastapi/fastapi/pull/14415) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆ Bump markdown-include-variants from 0.0.5 to 0.0.6. MR [#&#8203;14418](https://github.com/fastapi/fastapi/pull/14418) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.122.0`](https://github.com/fastapi/fastapi/releases/tag/0.122.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.3...0.122.0)

##### Fixes

- 🐛 Use `401` status code in security classes when credentials are missing. MR [#&#8203;13786](https://github.com/fastapi/fastapi/pull/13786) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
  - If your code depended on these classes raising the old (less correct) `403` status code, check the new docs about how to override the classes, to use the same old behavior: [Use Old 403 Authentication Error Status Codes](https://fastapi.tiangolo.com/how-to/authentication-error-status-code/).

##### Internal

- 🔧 Configure labeler to exclude files that start from underscore for `lang-all` label. MR [#&#8203;14213](https://github.com/fastapi/fastapi/pull/14213) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 👷 Add pre-commit config with local script for permalinks. MR [#&#8203;14398](https://github.com/fastapi/fastapi/pull/14398) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 💄 Use font Fira Code to fix display of Rich panels in docs in Windows. MR [#&#8203;14387](https://github.com/fastapi/fastapi/pull/14387) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👷 Add custom pre-commit CI. MR [#&#8203;14397](https://github.com/fastapi/fastapi/pull/14397) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump actions/checkout from 5 to 6. MR [#&#8203;14381](https://github.com/fastapi/fastapi/pull/14381) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- 👷 Upgrade `latest-changes` GitHub Action and pin `actions/checkout@v5`. MR [#&#8203;14403](https://github.com/fastapi/fastapi/pull/14403) by [@&#8203;svlandeg](https://github.com/svlandeg).
- 🛠️ Add `add-permalinks` and `add-permalinks-page` to `scripts/docs.py`. MR [#&#8203;14033](https://github.com/fastapi/fastapi/pull/14033) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🔧 Upgrade Material for MkDocs and remove insiders. MR [#&#8203;14375](https://github.com/fastapi/fastapi/pull/14375) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.121.3`](https://github.com/fastapi/fastapi/releases/tag/0.121.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.2...0.121.3)

##### 0.121.3

##### Refactors

- ♻️ Make the result of `Depends()` and `Security()` hashable, as a workaround for other tools interacting with these internal parts. MR [#&#8203;14372](https://github.com/fastapi/fastapi/pull/14372) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Upgrades

- ⬆️ Bump Starlette to <`0.51.0`. MR [#&#8203;14282](https://github.com/fastapi/fastapi/pull/14282) by [@&#8203;musicinmybrain](https://github.com/musicinmybrain).

##### Docs

- 📝 Add missing hash part. MR [#&#8203;14369](https://github.com/fastapi/fastapi/pull/14369) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 📝 Fix typos in code comments. MR [#&#8203;14364](https://github.com/fastapi/fastapi/pull/14364) by [@&#8203;Edge-Seven](https://github.com/Edge-Seven).
- 📝 Add docs for using FastAPI Cloud. MR [#&#8203;14359](https://github.com/fastapi/fastapi/pull/14359) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.121.2`](https://github.com/fastapi/fastapi/releases/tag/0.121.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.1...0.121.2)

##### Fixes

- 🐛 Fix handling of JSON Schema attributes named "$ref". MR [#&#8203;14349](https://github.com/fastapi/fastapi/pull/14349) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Add EuroPython talk & podcast episode with Sebastián Ramírez. MR [#&#8203;14260](https://github.com/fastapi/fastapi/pull/14260) by [@&#8203;clytaemnestra](https://github.com/clytaemnestra).
- ✏️ Fix links and add missing permalink in docs. MR [#&#8203;14217](https://github.com/fastapi/fastapi/pull/14217) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Translations

- 🌐 Update Portuguese translations with LLM prompt. MR [#&#8203;14228](https://github.com/fastapi/fastapi/pull/14228) by [@&#8203;ceb10n](https://github.com/ceb10n).
- 🔨 Add Portuguese translations LLM prompt. MR [#&#8203;14208](https://github.com/fastapi/fastapi/pull/14208) by [@&#8203;ceb10n](https://github.com/ceb10n).
- 🌐 Sync Russian docs. MR [#&#8203;14331](https://github.com/fastapi/fastapi/pull/14331) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Sync German docs. MR [#&#8203;14317](https://github.com/fastapi/fastapi/pull/14317) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

### [`v0.121.1`](https://github.com/fastapi/fastapi/releases/tag/0.121.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.121.0...0.121.1)

##### Fixes

- 🐛 Fix `Depends(func, scope='function')` for top level (parameterless) dependencies. MR [#&#8203;14301](https://github.com/fastapi/fastapi/pull/14301) by [@&#8203;luzzodev](https://github.com/luzzodev).

##### Docs

- 📝 Upate docs for advanced dependencies with `yield`, noting the changes in 0.121.0, adding `scope`. MR [#&#8203;14287](https://github.com/fastapi/fastapi/pull/14287) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- ⬆ Bump ruff from 0.13.2 to 0.14.3. MR [#&#8203;14276](https://github.com/fastapi/fastapi/pull/14276) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14289](https://github.com/fastapi/fastapi/pull/14289) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).

### [`v0.121.0`](https://github.com/fastapi/fastapi/releases/tag/0.121.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.4...0.121.0)

##### Features

- ✨ Add support for dependencies with scopes, support `scope="request"` for dependencies with `yield` that exit before the response is sent. MR [#&#8203;14262](https://github.com/fastapi/fastapi/pull/14262) by [@&#8203;tiangolo](https://github.com/tiangolo).
  - New docs: [Dependencies with `yield` - Early exit and `scope`](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#early-exit-and-scope).

##### Internal

- 👥 Update FastAPI People - Contributors and Translators. MR [#&#8203;14273](https://github.com/fastapi/fastapi/pull/14273) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Sponsors. MR [#&#8203;14274](https://github.com/fastapi/fastapi/pull/14274) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI GitHub topic repositories. MR [#&#8203;14280](https://github.com/fastapi/fastapi/pull/14280) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump mkdocs-macros-plugin from 1.4.0 to 1.4.1. MR [#&#8203;14277](https://github.com/fastapi/fastapi/pull/14277) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump mkdocstrings\[python] from 0.26.1 to 0.30.1. MR [#&#8203;14279](https://github.com/fastapi/fastapi/pull/14279) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).

### [`v0.120.4`](https://github.com/fastapi/fastapi/releases/tag/0.120.4)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.3...0.120.4)

##### Fixes

- 🐛 Fix security schemes in OpenAPI when added at the top level app. MR [#&#8203;14266](https://github.com/fastapi/fastapi/pull/14266) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.120.3`](https://github.com/fastapi/fastapi/releases/tag/0.120.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.2...0.120.3)

##### Refactors

- ♻️ Reduce internal cyclic recursion in dependencies, from 2 functions calling each other to 1 calling itself. MR [#&#8203;14256](https://github.com/fastapi/fastapi/pull/14256) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ♻️ Refactor internals of dependencies, simplify code and remove `get_param_sub_dependant`. MR [#&#8203;14255](https://github.com/fastapi/fastapi/pull/14255) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ♻️ Refactor internals of dependencies, simplify using dataclasses. MR [#&#8203;14254](https://github.com/fastapi/fastapi/pull/14254) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Docs

- 📝 Update note for untranslated pages. MR [#&#8203;14257](https://github.com/fastapi/fastapi/pull/14257) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.120.2`](https://github.com/fastapi/fastapi/releases/tag/0.120.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.1...0.120.2)

##### Fixes

- 🐛 Fix separation of schemas with nested models introduced in 0.119.0. MR [#&#8203;14246](https://github.com/fastapi/fastapi/pull/14246) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- 🔧 Add sponsor: SerpApi. MR [#&#8203;14248](https://github.com/fastapi/fastapi/pull/14248) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump actions/download-artifact from 5 to 6. MR [#&#8203;14236](https://github.com/fastapi/fastapi/pull/14236) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14237](https://github.com/fastapi/fastapi/pull/14237) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- ⬆ Bump actions/upload-artifact from 4 to 5. MR [#&#8203;14235](https://github.com/fastapi/fastapi/pull/14235) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).

### [`v0.120.1`](https://github.com/fastapi/fastapi/releases/tag/0.120.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.120.0...0.120.1)

##### Upgrades

- ⬆️ Bump Starlette to <`0.50.0`. MR [#&#8203;14234](https://github.com/fastapi/fastapi/pull/14234) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Internal

- 🔧 Add `license` and `license-files` to `pyproject.toml`, remove `License` from `classifiers`. MR [#&#8203;14230](https://github.com/fastapi/fastapi/pull/14230) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.120.0`](https://github.com/fastapi/fastapi/releases/tag/0.120.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.119.1...0.120.0)

There are no major nor breaking changes in this release. ☕️

The internal reference documentation now uses `annotated_doc.Doc` instead of `typing_extensions.Doc`, this adds a new (very small) dependency on [`annotated-doc`](https://github.com/fastapi/annotated-doc), a package made just to provide that `Doc` documentation utility class.

I would expect `typing_extensions.Doc` to be deprecated and then removed at some point from `typing_extensions`, for that reason there's the new `annotated-doc` micro-package. If you are curious about this, you can read more in the repo for [`annotated-doc`](https://github.com/fastapi/annotated-doc).

This new version `0.120.0` only contains that transition to the new home package for that utility class `Doc`.

##### Translations

- 🌐 Sync German docs. MR [#&#8203;14188](https://github.com/fastapi/fastapi/pull/14188) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- ➕ Migrate internal reference documentation from `typing_extensions.Doc` to `annotated_doc.Doc`. MR [#&#8203;14222](https://github.com/fastapi/fastapi/pull/14222) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🛠️ Update German LLM prompt and test file. MR [#&#8203;14189](https://github.com/fastapi/fastapi/pull/14189) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14181](https://github.com/fastapi/fastapi/pull/14181) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).

### [`v0.119.1`](https://github.com/fastapi/fastapi/releases/tag/0.119.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.119.0...0.119.1)

##### Fixes

- 🐛 Fix internal Pydantic v1 compatibility (warnings) for Python 3.14 and Pydantic 2.12.1. MR [#&#8203;14186](https://github.com/fastapi/fastapi/pull/14186) by [@&#8203;svlandeg](https://github.com/svlandeg).

##### Docs

- 📝 Replace `starlette.io` by `starlette.dev` and `uvicorn.org` by `uvicorn.dev`. MR [#&#8203;14176](https://github.com/fastapi/fastapi/pull/14176) by [@&#8203;Kludex](https://github.com/Kludex).

##### Internal

- 🔧 Add sponsor Requestly. MR [#&#8203;14205](https://github.com/fastapi/fastapi/pull/14205) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔧 Configure reminder for `waiting` label in `issue-manager`. MR [#&#8203;14156](https://github.com/fastapi/fastapi/pull/14156) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.119.0`](https://github.com/fastapi/fastapi/releases/tag/0.119.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.3...0.119.0)

FastAPI now (temporarily) supports both Pydantic v2 models and `pydantic.v1` models at the same time in the same app, to make it easier for any FastAPI apps still using Pydantic v1 to gradually but quickly **migrate to Pydantic v2**.

```Python
from fastapi import FastAPI
from pydantic import BaseModel as BaseModelV2
from pydantic.v1 import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None

class ItemV2(BaseModelV2):
    title: str
    summary: str | None = None

app = FastAPI()

@&#8203;app.post("/items/", response_model=ItemV2)
def create_item(item: Item):
    return {"title": item.name, "summary": item.description}
```

Adding this feature was a big effort with the main objective of making it easier for the few applications still stuck in Pydantic v1 to migrate to Pydantic v2.

And with this, support for **Pydantic v1 is now deprecated** and will be **removed** from FastAPI in a future version soon.

**Note**: have in mind that the Pydantic team already stopped supporting Pydantic v1 for recent versions of Python, starting with Python 3.14.

You can read in the docs more about how to [Migrate from Pydantic v1 to Pydantic v2](https://fastapi.tiangolo.com/how-to/migrate-from-pydantic-v1-to-pydantic-v2/).

##### Features

- ✨ Add support for `from pydantic.v1 import BaseModel`, mixed Pydantic v1 and v2 models in the same app. MR [#&#8203;14168](https://github.com/fastapi/fastapi/pull/14168) by [@&#8203;tiangolo](https://github.com/tiangolo).

### [`v0.118.3`](https://github.com/fastapi/fastapi/releases/tag/0.118.3)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.2...0.118.3)

##### Upgrades

- ⬆️ Add support for Python 3.14. MR [#&#8203;14165](https://github.com/fastapi/fastapi/pull/14165) by [@&#8203;svlandeg](https://github.com/svlandeg).

### [`v0.118.2`](https://github.com/fastapi/fastapi/releases/tag/0.118.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.1...0.118.2)

##### Fixes

- 🐛 Fix tagged discriminated union not recognized as body field. MR [#&#8203;12942](https://github.com/fastapi/fastapi/pull/12942) by [@&#8203;frankie567](https://github.com/frankie567).

##### Internal

- ⬆ Bump astral-sh/setup-uv from 6 to 7. MR [#&#8203;14167](https://github.com/fastapi/fastapi/pull/14167) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).

### [`v0.118.1`](https://github.com/fastapi/fastapi/releases/tag/0.118.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.118.0...0.118.1)

##### Upgrades

- 👽️ Ensure compatibility with Pydantic 2.12.0. MR [#&#8203;14036](https://github.com/fastapi/fastapi/pull/14036) by [@&#8203;cjwatson](https://github.com/cjwatson).

##### Docs

- 📝 Add External Link: Getting started with logging in FastAPI. MR [#&#8203;14152](https://github.com/fastapi/fastapi/pull/14152) by [@&#8203;itssimon](https://github.com/itssimon).

##### Translations

- 🔨 Add Russian translations LLM prompt. MR [#&#8203;13936](https://github.com/fastapi/fastapi/pull/13936) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🌐 Sync German docs. MR [#&#8203;14149](https://github.com/fastapi/fastapi/pull/14149) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🌐 Add Russian translations for missing pages (LLM-generated). MR [#&#8203;14135](https://github.com/fastapi/fastapi/pull/14135) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Update Russian translations for existing pages (LLM-generated). MR [#&#8203;14123](https://github.com/fastapi/fastapi/pull/14123) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🌐 Remove configuration files for inactive translations. MR [#&#8203;14130](https://github.com/fastapi/fastapi/pull/14130) by [@&#8203;tiangolo](https://github.com/tiangolo).

##### Internal

- 🔨 Move local coverage logic to its own script. MR [#&#8203;14166](https://github.com/fastapi/fastapi/pull/14166) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14161](https://github.com/fastapi/fastapi/pull/14161) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- ⬆ Bump griffe-typingdoc from 0.2.8 to 0.2.9. MR [#&#8203;14144](https://github.com/fastapi/fastapi/pull/14144) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump mkdocs-macros-plugin from 1.3.9 to 1.4.0. MR [#&#8203;14145](https://github.com/fastapi/fastapi/pull/14145) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump markdown-include-variants from 0.0.4 to 0.0.5. MR [#&#8203;14146](https://github.com/fastapi/fastapi/pull/14146) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14126](https://github.com/fastapi/fastapi/pull/14126) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- 👥 Update FastAPI GitHub topic repositories. MR [#&#8203;14150](https://github.com/fastapi/fastapi/pull/14150) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Sponsors. MR [#&#8203;14139](https://github.com/fastapi/fastapi/pull/14139) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 👥 Update FastAPI People - Contributors and Translators. MR [#&#8203;14138](https://github.com/fastapi/fastapi/pull/14138) by [@&#8203;tiangolo](https://github.com/tiangolo).
- ⬆ Bump ruff from 0.12.7 to 0.13.2. MR [#&#8203;14147](https://github.com/fastapi/fastapi/pull/14147) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump sqlmodel from 0.0.24 to 0.0.25. MR [#&#8203;14143](https://github.com/fastapi/fastapi/pull/14143) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- ⬆ Bump tiangolo/issue-manager from 0.5.1 to 0.6.0. MR [#&#8203;14148](https://github.com/fastapi/fastapi/pull/14148) by [@&#8203;dependabot\[bot\]](https://github.com/apps/dependabot).
- 👷 Update docs previews comment, single comment, add failure status. MR [#&#8203;14129](https://github.com/fastapi/fastapi/pull/14129) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 🔨 Modify `mkdocs_hooks.py` to add `title` to page's metadata (remove permalinks in social cards). MR [#&#8203;14125](https://github.com/fastapi/fastapi/pull/14125) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

### [`v0.118.0`](https://github.com/fastapi/fastapi/releases/tag/0.118.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.117.1...0.118.0)

##### 0.118.0

##### Fixes

- 🐛 Fix support for `StreamingResponse`s with dependencies with `yield` or `UploadFile`s, close after the response is done. MR [#&#8203;14099](https://github.com/fastapi/fastapi/pull/14099) by [@&#8203;tiangolo](https://github.com/tiangolo).

Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.

This change also meant that if you returned a `StreamingResponse`, the exit code of the dependency with `yield` would have been already run.

For example, if you had a database session in a dependency with `yield`, the `StreamingResponse` would not be able to use that session while streaming data because the session would have already been closed in the exit code after `yield`.

This behavior was reverted in 0.118.0, to make the exit code after `yield` be executed after the response is sent.

You can read more about it in the docs for [Advanced Dependencies - Dependencies with `yield`, `HTTPException`, `except` and Background Tasks](https://fastapi.tiangolo.com/advanced/advanced-dependencies#dependencies-with-yield-httpexception-except-and-background-tasks). Including what you could do if you wanted to close a database session earlier, before returning the response to the client.

##### Docs

- 📝 Update `tutorial/security/oauth2-jwt/` to use `pwdlib` with Argon2 instead of `passlib`. MR [#&#8203;13917](https://github.com/fastapi/fastapi/pull/13917) by [@&#8203;Neizvestnyj](https://github.com/Neizvestnyj).
- ✏️ Fix typos in OAuth2 password request forms. MR [#&#8203;14112](https://github.com/fastapi/fastapi/pull/14112) by [@&#8203;alv2017](https://github.com/alv2017).
- 📝 Update contributing guidelines for installing requirements. MR [#&#8203;14095](https://github.com/fastapi/fastapi/pull/14095) by [@&#8203;alejsdev](https://github.com/alejsdev).

##### Translations

- 🌐 Sync German docs. MR [#&#8203;14098](https://github.com/fastapi/fastapi/pull/14098) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- ⬆ \[pre-commit.ci] pre-commit autoupdate. MR [#&#8203;14103](https://github.com/fastapi/fastapi/pull/14103) by [@&#8203;pre-commit-ci\[bot\]](https://github.com/apps/pre-commit-ci).
- ♻️ Refactor sponsor image handling. MR [#&#8203;14102](https://github.com/fastapi/fastapi/pull/14102) by [@&#8203;alejsdev](https://github.com/alejsdev).
- 🐛 Fix sponsor display issue by hiding element on image error. MR [#&#8203;14097](https://github.com/fastapi/fastapi/pull/14097) by [@&#8203;alejsdev](https://github.com/alejsdev).
- 🐛 Hide sponsor badge when sponsor image is not displayed. MR [#&#8203;14096](https://github.com/fastapi/fastapi/pull/14096) by [@&#8203;alejsdev](https://github.com/alejsdev).

### [`v0.117.1`](https://github.com/fastapi/fastapi/releases/tag/0.117.1)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.117.0...0.117.1)

##### Fixes

- 🐛 Fix validation error when `File` is declared after `Form` parameter. MR [#&#8203;11194](https://github.com/fastapi/fastapi/pull/11194) by [@&#8203;thomasleveil](https://github.com/thomasleveil).

### [`v0.117.0`](https://github.com/fastapi/fastapi/releases/tag/0.117.0)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.116.2...0.117.0)

##### Features

- ✨  Allow `None` as return type for bodiless responses. MR [#&#8203;9425](https://github.com/fastapi/fastapi/pull/9425) by [@&#8203;hofrob](https://github.com/hofrob).
- ✨ Allow array values for OpenAPI schema `type` field. MR [#&#8203;13639](https://github.com/fastapi/fastapi/pull/13639) by [@&#8203;sammasak](https://github.com/sammasak).
- ✨ Add OpenAPI `external_docs` parameter to `FastAPI`. MR [#&#8203;13713](https://github.com/fastapi/fastapi/pull/13713) by [@&#8203;cmtoro](https://github.com/cmtoro).

##### Fixes

- ⚡️ Fix `default_factory` for response model field with Pydantic V1. MR [#&#8203;9704](https://github.com/fastapi/fastapi/pull/9704) by [@&#8203;vvanglro](https://github.com/vvanglro).
- 🐛 Fix inconsistent processing of model docstring formfeed char with Pydantic V1. MR [#&#8203;6039](https://github.com/fastapi/fastapi/pull/6039) by [@&#8203;MaxwellPayne](https://github.com/MaxwellPayne).
- 🐛 Fix `jsonable_encoder` alters `json_encoders` of Pydantic v1 objects. MR [#&#8203;4972](https://github.com/fastapi/fastapi/pull/4972) by [@&#8203;aboubacs](https://github.com/aboubacs).
- 🐛 Reenable `allow_arbitrary_types` when only 1 argument is used on the API endpoint. MR [#&#8203;13694](https://github.com/fastapi/fastapi/pull/13694) by [@&#8203;rmawatson](https://github.com/rmawatson).
- 🐛 Fix `inspect.getcoroutinefunction()` can break testing with `unittest.mock.patch()`. MR [#&#8203;14022](https://github.com/fastapi/fastapi/pull/14022) by [@&#8203;secrett2633](https://github.com/secrett2633).

##### Refactors

- ♻️ Create `dependency-cache` dict in `solve_dependencies` only if `None` (don't re-create if empty). MR [#&#8203;13689](https://github.com/fastapi/fastapi/pull/13689) by [@&#8203;bokshitsky](https://github.com/bokshitsky).
- ✅ Enable test case for duplicated headers in `test_tutorial/test_header_params/test_tutorial003.py`. MR [#&#8203;13864](https://github.com/fastapi/fastapi/pull/13864) by [@&#8203;Amogha-ark](https://github.com/Amogha-ark).
- 📌 Pin `httpx` to `>=0.23.0,<1.0.0`. MR [#&#8203;14086](https://github.com/fastapi/fastapi/pull/14086) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).

##### Docs

- 📝 Add note about Cookies and JavaScript on `tutorial/cookie-params.md`. MR [#&#8203;13510](https://github.com/fastapi/fastapi/pull/13510) by [@&#8203;Kludex](https://github.com/Kludex).
- 📝 Remove outdated formatting from `path-params-numeric-validations.md` for languages `en`, `es` and `uk`.. MR [#&#8203;14059](https://github.com/fastapi/fastapi/pull/14059) by [@&#8203;svlandeg](https://github.com/svlandeg).
- 📝 Fix and Improve English Documentation. MR [#&#8203;14048](https://github.com/fastapi/fastapi/pull/14048) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Translations

- 📝 Update prompts and German translation. MR [#&#8203;14015](https://github.com/fastapi/fastapi/pull/14015) by [@&#8203;nilslindemann](https://github.com/nilslindemann).

##### Internal

- ✅ Simplify tests for response\_model. MR [#&#8203;14062](https://github.com/fastapi/fastapi/pull/14062) by [@&#8203;dynamicy](https://github.com/dynamicy).
- 🚨 Install pydantic.mypy plugin. MR [#&#8203;14081](https://github.com/fastapi/fastapi/pull/14081) by [@&#8203;svlandeg](https://github.com/svlandeg).
- ✅ Add LLM test file. MR [#&#8203;14049](https://github.com/fastapi/fastapi/pull/14049) by [@&#8203;nilslindemann](https://github.com/nilslindemann).
- 🔨 Update translations script. MR [#&#8203;13968](https://github.com/fastapi/fastapi/pull/13968) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- 🛠️ Update `docs.py generate-readme` command to remove permalinks from headers. MR [#&#8203;14055](https://github.com/fastapi/fastapi/pull/14055) by [@&#8203;YuriiMotov](https://github.com/YuriiMotov).
- ⬆️ Update mypy to 1.14.1. MR [#&#8203;12970](https://github.com/fastapi/fastapi/pull/12970) by [@&#8203;tamird](https://github.com/tamird).

### [`v0.116.2`](https://github.com/fastapi/fastapi/releases/tag/0.116.2)

[Compare Source](https://github.com/fastapi/fastapi/compare/0.116.1...0.116.2)

##### Upgrades

- ⬆️ Upgrade Starlette supported version range to >=0.40.0,<0.49.0. MR [#&#8203;14077](https://github.com/fastapi/fastapi/pull/14077) by [@&#8203;musicinmybrain](https://github.com/musicinmybrain).

##### Docs

- 📝 Add documentation for Behind a Proxy - Proxy Forwarded Headers, using `--forwarded-allow-ips="*"`. MR [#&#8203;14028](https://github.com/fastapi/fastapi/pull/14028) by [@&#8203;tiangolo](https://github.com/tiangolo).
- 📝 Add deprecation info block about `dict()` in `docs/tutorial/body.md`. MR [#&#8203;13906](https://github.com/fastapi/fastapi/pull/13906) by [@&#8203;jomkv](https://github.com/jomkv).
- 📝 Fix Twitter to be X (Twitter) ev…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working p2

Projects

None yet

Development

Successfully merging this pull request may close these issues.