Skip to content

Reconnecting Issues when using client with username and password #2

Description

@mathis-lambert

After having been logged in for half-an-hour (which is tha default duration of a session), the client is unable to log in back.

Here's the stack trace:

INFO:     127.0.0.1:64976 - "POST /api/chat/completions HTTP/1.1" 200 OK
[2025-03-04 20:41:32] [WARNING] [ml_api_client.api_client] - Erreur de connexion, nouvelle tentative dans 1.07s (tentative 1/3) : 401, message='Unauthorized', url='https://api.mathislambert.fr/v1/chat/completions'
[2025-03-04 20:41:33] [WARNING] [ml_api_client.api_client] - Erreur de connexion, nouvelle tentative dans 2.19s (tentative 2/3) : 401, message='Unauthorized', url='https://api.mathislambert.fr/v1/chat/completions'
[2025-03-04 20:41:36] [WARNING] [ml_api_client.api_client] - Erreur de connexion, nouvelle tentative dans 4.22s (tentative 3/3) : 401, message='Unauthorized', url='https://api.mathislambert.fr/v1/chat/completions'
ERROR:    Exception in ASGI application
  + Exception Group Traceback (most recent call last):
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 180, in __call__
  |     await response(scope, wrapped_receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 215, in __call__
  |     async for chunk in self.body_iterator:
  |         await send({"type": "http.response.body", "body": chunk, "more_body": True})
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 169, in body_stream
  |     raise app_exc
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 141, in coro
  |     await self.app(scope, receive_or_disconnect, send_no_error)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/cors.py", line 93, in __call__
  |     await self.simple_response(scope, receive, send, request_headers=headers)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/cors.py", line 144, in simple_response
  |     await self.app(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
  |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
  |     raise exc
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
  |     await app(scope, receive, sender)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 715, in __call__
  |     await self.middleware_stack(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 735, in app
  |     await route.handle(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 288, in handle
  |     await self.app(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 76, in app
  |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
  |     raise exc
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
  |     await app(scope, receive, sender)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 74, in app
  |     await response(scope, receive, send)
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 261, in __call__
  |     async with anyio.create_task_group() as task_group:
  |                ~~~~~~~~~~~~~~~~~~~~~~~^^
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
  |     raise BaseExceptionGroup(
  |         "unhandled errors in a TaskGroup", self._exceptions
  |     )
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi
    |     result = await app(  # type: ignore[func-returns-value]
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |         self.scope, self.receive, self.send
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |     )
    |     ^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    |     return await self.app(scope, receive, send)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/fastapi/applications.py", line 1054, in __call__
    |     await super().__call__(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/applications.py", line 112, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 187, in __call__
    |     raise exc
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 165, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 177, in __call__
    |     with recv_stream, send_stream, collapse_excgroups():
    |                                    ~~~~~~~~~~~~~~~~~~^^
    |   File "/opt/homebrew/Cellar/[email protected]/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__
    |     self.gen.throw(value)
    |     ~~~~~~~~~~~~~~^^^^^^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    |     raise exc
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 264, in wrap
    |     await func()
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 245, in stream_response
    |     async for chunk in self.body_iterator:
    |     ...<2 lines>...
    |         await send({"type": "http.response.body", "body": chunk, "more_body": True})
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/ml_api_client/endpoints/chat.py", line 203, in stream_sse
    |     raise ConnectionError(
    |         f"Nombre maximal de tentatives ({self.max_stream_retries}) dépassé : {str(e)}"
    |     )
    | ConnectionError: Nombre maximal de tentatives (3) dépassé : 401, message='Unauthorized', url='https://api.mathislambert.fr/v1/chat/completions'
    +------------------------------------

During handling of the above exception, another exception occurred:

  + Exception Group Traceback (most recent call last):
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_utils.py", line 76, in collapse_excgroups
  |     yield
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 178, in __call__
  |     async with anyio.create_task_group() as task_group:
  |                ~~~~~~~~~~~~~~~~~~~~~~~^^
  |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
  |     raise BaseExceptionGroup(
  |         "unhandled errors in a TaskGroup", self._exceptions
  |     )
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 268, in __call__
    |     await wrap(partial(self.listen_for_disconnect, receive))
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 264, in wrap
    |     await func()
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 233, in listen_for_disconnect
    |     message = await receive()
    |               ^^^^^^^^^^^^^^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 114, in receive_or_disconnect
    |     async with anyio.create_task_group() as task_group:
    |                ~~~~~~~~~~~~~~~~~~~~~~~^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 771, in __aexit__
    |     raise exc_val
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 122, in receive_or_disconnect
    |     message = await wrap(wrapped_receive)
    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 117, in wrap
    |     result = await func()
    |              ^^^^^^^^^^^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 50, in wrapped_receive
    |     msg = await self.receive()
    |           ^^^^^^^^^^^^^^^^^^^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/httptools_impl.py", line 563, in receive
    |     await self.message_event.wait()
    |   File "/opt/homebrew/Cellar/[email protected]/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/asyncio/locks.py", line 213, in wait
    |     await fut
    | asyncio.exceptions.CancelledError: Cancelled by cancel scope 10769a410
    | 
    | During handling of the above exception, another exception occurred:
    | 
    | Exception Group Traceback (most recent call last):
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 180, in __call__
    |     await response(scope, wrapped_receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 215, in __call__
    |     async for chunk in self.body_iterator:
    |         await send({"type": "http.response.body", "body": chunk, "more_body": True})
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 169, in body_stream
    |     raise app_exc
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 141, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/cors.py", line 93, in __call__
    |     await self.simple_response(scope, receive, send, request_headers=headers)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/cors.py", line 144, in simple_response
    |     await self.app(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 715, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 735, in app
    |     await route.handle(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 288, in handle
    |     await self.app(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 76, in app
    |     await wrap_app_handling_exceptions(app, request)(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/routing.py", line 74, in app
    |     await response(scope, receive, send)
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 261, in __call__
    |     async with anyio.create_task_group() as task_group:
    |                ~~~~~~~~~~~~~~~~~~~~~~~^^
    |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/anyio/_backends/_asyncio.py", line 767, in __aexit__
    |     raise BaseExceptionGroup(
    |         "unhandled errors in a TaskGroup", self._exceptions
    |     )
    | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
    +-+---------------- 1 ----------------
      | Traceback (most recent call last):
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi
      |     result = await app(  # type: ignore[func-returns-value]
      |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |         self.scope, self.receive, self.send
      |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |     )
      |     ^
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
      |     return await self.app(scope, receive, send)
      |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/fastapi/applications.py", line 1054, in __call__
      |     await super().__call__(scope, receive, send)
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/applications.py", line 112, in __call__
      |     await self.middleware_stack(scope, receive, send)
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 187, in __call__
      |     raise exc
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 165, in __call__
      |     await self.app(scope, receive, _send)
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 177, in __call__
      |     with recv_stream, send_stream, collapse_excgroups():
      |                                    ~~~~~~~~~~~~~~~~~~^^
      |   File "/opt/homebrew/Cellar/[email protected]/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__
      |     self.gen.throw(value)
      |     ~~~~~~~~~~~~~~^^^^^^^
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
      |     raise exc
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 264, in wrap
      |     await func()
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 245, in stream_response
      |     async for chunk in self.body_iterator:
      |     ...<2 lines>...
      |         await send({"type": "http.response.body", "body": chunk, "more_body": True})
      |   File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/ml_api_client/endpoints/chat.py", line 203, in stream_sse
      |     raise ConnectionError(
      |         f"Nombre maximal de tentatives ({self.max_stream_retries}) dépassé : {str(e)}"
      |     )
      | ConnectionError: Nombre maximal de tentatives (3) dépassé : 401, message='Unauthorized', url='https://api.mathislambert.fr/v1/chat/completions'
      +------------------------------------

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/httptools_impl.py", line 409, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self.scope, self.receive, self.send
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    return await self.app(scope, receive, send)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/fastapi/applications.py", line 1054, in __call__
    await super().__call__(scope, receive, send)
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 187, in __call__
    raise exc
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/errors.py", line 165, in __call__
    await self.app(scope, receive, _send)
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/middleware/base.py", line 177, in __call__
    with recv_stream, send_stream, collapse_excgroups():
                                   ~~~~~~~~~~~~~~~~~~^^
  File "/opt/homebrew/Cellar/[email protected]/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/contextlib.py", line 162, in __exit__
    self.gen.throw(value)
    ~~~~~~~~~~~~~~^^^^^^^
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    raise exc
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 264, in wrap
    await func()
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/starlette/responses.py", line 245, in stream_response
    async for chunk in self.body_iterator:
    ...<2 lines>...
        await send({"type": "http.response.body", "body": chunk, "more_body": True})
  File "/Users/mathis.lambert/Documents/_PERSO/Projets/personal_website/.venv/lib/python3.13/site-packages/ml_api_client/endpoints/chat.py", line 203, in stream_sse
    raise ConnectionError(
        f"Nombre maximal de tentatives ({self.max_stream_retries}) dépassé : {str(e)}"
    )
ConnectionError: Nombre maximal de tentatives (3) dépassé : 401, message='Unauthorized', url='https://api.mathislambert.fr/v1/chat/completions'

Metadata

Metadata

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions